是否可以更改优化校准背景颜色而不是更改图像?

Is it possible to change Pictue Control background color istead of Changing image?

我正在尝试更改我在 Microsoft Visual C++ 环境中添加到对话框中的图片控制框的颜色。我做了这些程序:

  1. 在资源文件->对话框编辑器中我添加了一个图片控制框(Type=Rectangle)
  2. 我查看了 this 问题并尝试继续前进。
  3. Right-Click 在优化校准框上并添加一个变量。

4.In MainDlg.Cpp 文件和Onpainting();部分,添加了以下代码:

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

但是我将上面的命令添加到我认为属于对话框绘画的以下命令中(我不知道它是否有问题):

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);

(其中 IDC_STATIC_PictureControl 是对话框编辑器中的 Picture Control ID)

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

    m_PictureControlVariable.EnableWindow();

现在我收到调试错误!!

更新:

我添加了一个 CStatic 类型的 MFC Class(在菜单栏-> 项目-> 添加 Class): 原始项目中包含以下 .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));
}

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

派生 Class 的

Header 是:

#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();

};

并且在将变量添加到图片控制之后的原始代码中,这些命令添加到 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);
}

并且在原始文件的 Header 文件中刚刚 CStatic m_PicCtrl; 添加到 Main class 的 public 部分,我的意思是:

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

尝试这样的事情:

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;
}

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

CStatic m_PictureControlVariable;

并将此变量添加到 DoDataExchange 中。 DoDataExchange 与您对 SubclassDlgItem 的调用执行相同的操作,因此您应该删除该冗余调用。

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

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

#include "PICTURECTRL.h" 

并更改

CStatic m_PicCtrl;

PICTURECTRL m_PicCtrl;