是否可以更改Pictue Control背景颜色而不是更改图像?

时间:2015-05-25 14:38:40

标签: c++ visual-c++ mfc

我正在尝试更改我在Microsoft Visual C ++环境中添加到对话框中的优化校准框的颜色。我做了这些程序:

  1. 在资源文件中 - >对话框编辑器我添加了一个优化校准框(Type = Rectangle)
  2. 我看了this问题并试图继续前进。
  3. 右键单击优化校准框并添加变量。
  4. 4.在MainDlg.Cpp文件和In Onpainting();部分,添加以下代码:

    CPaintDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    dc.FillSolidRect(&rect, RGB(120,255,0));
    

    但是我将以上命令添加到以下命令中,我认为该命令属于Dialog绘画(我不知道是否有问题):

    CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
    
        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    
    1. 在main.Cpp文件和函数OnInitDialog()中;这段代码补充道:

      m_PictureControlVariable.SubclassDlgItem(IDC_STATIC_PictureControl, this);

    2. (其中IDC_STATIC_PictureControl是对话框编辑器中的优化校准ID)

      1. 我打算在事件发生时调用Picture Contorl颜色,我的意思是在回拨函数中向对话框发送消息我将此Picture Control称为:

        m_PictureControlVariable.EnableWindow();

      2. 现在我收到调试错误!!

        更新

        我添加了一个带有CStatic类型的MFC类(在菜单栏中 - >项目 - >添加类): 原始项目中包含以下.Cpp和.H的代码:

        #include "stdafx.h"
        #include "Main.h"
        #include "PICTURECTRL.h"
        
        
        // PICTURECTRL
        
        IMPLEMENT_DYNAMIC(PICTURECTRL, CStatic)
        
        PICTURECTRL::PICTURECTRL()
        {
        
        }
        
        PICTURECTRL::~PICTURECTRL()
        {
        }
        
        
        BEGIN_MESSAGE_MAP(PICTURECTRL, CStatic)
            ON_WM_PAINT()
        END_MESSAGE_MAP()
        
        
        
        // PICTURECTRL message handlers
        void PICTURECTRL::OnPaint()
        {
            CPaintDC dc(this); // device context for painting
            //@TG
        //#3073
                // TODO: Add your message handler code here
                // Do not call CStatic::OnPaint() for painting messages
        CRect rect;
        GetClientRect(&rect);
        dc.FillSolidRect(&rect, RGB(0,0,255));
        }
        

        正如您所见,我从Resource View手动添加了OnPaint()消息处理程序 - >课程视图 - >属性 - >消息。

        派生类的标题是:

        #pragma once
        
        
        // PICTURECTRL  (Picture Control)
        
        class PICTURECTRL : public CStatic
        {
            DECLARE_DYNAMIC(PICTURECTRL)
        
        public:
            PICTURECTRL();
            virtual ~PICTURECTRL();
        
        protected:
            DECLARE_MESSAGE_MAP()
        public:
            afx_msg void OnPaint();
        
        };
        

        在为Picture Control添加变量后的原始代码中,这些命令已添加到MainDlg.Cpp MainDlg.H中,后续:

            void CMainDlg::DoDataExchange(CDataExchange* pDX)
        {
            CDialog::DoDataExchange(pDX);
            //{{AFX_DATA_MAP(CMainDlg)
            // NOTE: the ClassWizard will add DDX and DDV calls here
            //}}AFX_DATA_MAP
            DDX_Control(pDX, IDC_PROGRESS1, M_progressBar1);
            DDX_Control(pDX, IDC_PictureControl, m_PicCtrl);
        }
        

        在原始文件的头文件中只有CStatic m_PicCtrl;添加到Main类的公共部分,我的意思是:

        class CMainDlg : public CDialog
        {
        public:
        protected:
        public:
            CStatic m_PicCtrl;
        }
        

2 个答案:

答案 0 :(得分:1)

你应该在图片控件的OnPaint中绘画,而不是在对话框的OnPaint上绘画。当您添加变量时,它应该已创建

CStatic m_PictureControlVariable;

并将此变量添加到DoDataExchange中。 DoDataExchange与调用SubclassDlgItem的功能相同,因此您应该删除该冗余调用。

现在从CStatic派生一个类,并用你的派生类替换上面的CStatic。完成此操作后,您可以在派生类中为WM_PAINT消息添加消息处理程序,并在图片控件中绘制您喜欢的内容。

更新: 在更新的代码中:在对话框h文件中添加

#include "PICTURECTRL.h" 

并更改

CStatic m_PicCtrl;

PICTURECTRL m_PicCtrl;

答案 1 :(得分:0)

尝试这样的事情:

BOOL YourCStaticDerived::OnEraseBkgnd( CDC* pDC )
{
    CBrush  brush( RGB( 240, 240, 240 ) ); // whatever color you need
    CBrush* pVBrush;
    CRect   rett;

    pVBrush = pDC->SelectObject( &brush );
    pDC->GetClipBox( &rett );
    pDC->PatBlt( rett.left, rett.top, rett.Width(), rett.Height(), PATCOPY );
    pDC->SelectObject( pVBrush );

    return TRUE;
}