我正在尝试更改我在Microsoft Visual C ++环境中添加到对话框中的优化校准框的颜色。我做了这些程序:
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();
在main.Cpp文件和函数OnInitDialog()中;这段代码补充道:
m_PictureControlVariable.SubclassDlgItem(IDC_STATIC_PictureControl, this);
(其中IDC_STATIC_PictureControl是对话框编辑器中的优化校准ID)
我打算在事件发生时调用Picture Contorl颜色,我的意思是在回拨函数中向对话框发送消息我将此Picture Control称为:
m_PictureControlVariable.EnableWindow();
现在我收到调试错误!!
更新
我添加了一个带有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;
}
答案 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;
}