是否可以更改优化校准背景颜色而不是更改图像?
Is it possible to change Pictue Control background color istead of Changing image?
我正在尝试更改我在 Microsoft Visual C++ 环境中添加到对话框中的图片控制框的颜色。我做了这些程序:
- 在资源文件->对话框编辑器中我添加了一个图片控制框(Type=Rectangle)
- 我查看了 this 问题并尝试继续前进。
- 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();
在 main.Cpp 文件和函数 OnInitDialog() 中;此代码添加:
m_PictureControlVariable.SubclassDlgItem(IDC_STATIC_PictureControl, this);
(其中 IDC_STATIC_PictureControl 是对话框编辑器中的 Picture Control ID)
我要调用 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;
我正在尝试更改我在 Microsoft Visual C++ 环境中添加到对话框中的图片控制框的颜色。我做了这些程序:
- 在资源文件->对话框编辑器中我添加了一个图片控制框(Type=Rectangle)
- 我查看了 this 问题并尝试继续前进。
- 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();
在 main.Cpp 文件和函数 OnInitDialog() 中;此代码添加:
m_PictureControlVariable.SubclassDlgItem(IDC_STATIC_PictureControl, this);
(其中 IDC_STATIC_PictureControl 是对话框编辑器中的 Picture Control ID)
我要调用 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;