我正在尝试更改我添加到microsoftvisualc++环境中的对话框中的图片控制框的颜色。我做了如下操作:
- 在资源文件->对话框编辑器中,我添加了一个图片控制框(类型=矩形)
- 我看了看这个问题,并试图继续前进。
- 右键单击图片控制框,添加变量。
4。在MainDlg.Cpp文件和Onpainting()中;节中,添加了以下代码Has:
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();
在main.Cpp文件和函数OnInitDialog()中;此代码添加:
m_PictureControlVariable.SubclassDlgItem(IDC_STATIC_PictureControl, this);
当事件发生时,我要调用图片控件颜色被改变,我的意思是在一个回调函数中,它向对话框发送消息,我调用这个图片控件为:
m_PictureControlVariable.EnableWindow();
(其中IDC_STATIC_PictureControl为对话框编辑器中的图片控件ID)
现在我收到一个调试错误!!
更新:
我添加了一个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));
}
和你可以看到我手动添加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();
};
在原始代码中添加变量到图片控制之后,这些命令添加到maindgh . cpp maindgh . 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;
}
你应该在图片控件的OnPaint中绘制,而不是对话框的OnPaint。当你添加变量时它应该已经创建了
CStatic m_PictureControlVariable;
并将此变量添加到DoDataExchange中。DoDataExchange所做的事情与调用SubclassDlgItem相同,因此应该删除冗余调用。
现在从CStatic中派生一个类,并用您的派生类替换上面的CStatic。这样,你就可以在WM_PAINT消息的派生类中添加一个消息处理程序,并在图片控件中绘制你喜欢的内容。
更新:在对话框h文件中添加
#include "PICTURECTRL.h"
和更改
CStatic m_PicCtrl;
PICTURECTRL 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;
}