对话框的 WM_CTLCOLORDLG这个消息的问题大家知道,对话框是会处理这个消息的。如果我们对这个消息返回一个黑色刷子, 而且onpaint 里不填充颜色背景,那么对话框的背景颜色应该是黑色的。这是理论知识。
为了验证这个理论知识:我在 类的的成员里添加了一个刷子, onctlcor里返回数字,代码为:
HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
return (HBRUSH)brush; //黑色brush CBrush brush;}结果,对话框上的控件的背景变黑了,注意是控件的背景,不是对话框自身变黑色!而是控件!!
我很奇怪为什么会这样,于是又修改代码:HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor==CTLCOLOR_DLG)
{
int i=2; //这里设置断点,结果没有进入!!!
}return (HBRUSH)brush; //黑色brush CBrush brush;}我很奇怪,mfc封装wm_ctlcolor这个消息的时候,难道没有对 WM_CTLCOLORDLG处理嘛?
附资料:
wm_ctlcolor是一个笼统的消息,具体的有
WM_CTLCOLORBTN
WM_CTLCOLOREDIT
WM_CTLCOLORDLG
WM_CTLCOLORLISTBOX
WM_CTLCOLORSCROLLBAR
WM_CTLCOLORSTATIC
等。
解决方案 »
- C++ 通过ADO连接ACCESS数据库 _RecordestPtr 未声明的标识符
- 一个白痴的问题 界面设计
- 怎么实现主对话框拖动,其他的对话框也跟着动?就象Winamp那样!
- ——*- 帮忙看一下连接ACCESS,为什么提示无效的指针 -*——
- 我的对话框颜色怎么被背景窗体颜色覆盖了?
- 用DAO怎么插入数据?
- 请教怎样在程序中操作数据链接属性对话框???
- HCURSOR CTestDlg::OnQueryDragIcon()有什么用途?
- zhang_wei_question(张炜) 领分
- 快来抢分:文件格式问题,谁有cd音乐格式的详细资料
- 如何调用 windows资源管理器 的右键菜单??
- 关于OpenGL中贴图旋转问题——求助!!
ON_WM_CTLCOLOR_REFLECT ()
然后实现CWnd::CtlColor方法。
貌似是因为这个原因导致的,这个消息没有发出
我试过了,成功了, 更正一个错误,与反射无关,建立了2个对话框。工程是 “对话框工程”增加了一个对话框。代码为:
OnInitDialog: pdlg=new CMyDialog; pdlg->Create(IDD_DIALOG1,this);// pdlg->SetParent(this); pdlg->ShowWindow(SW_SHOW); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}父对话框这函数源码没变
HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor==4)
{
int i=2;
} return (HBRUSH)brush;
}
子对话框源码:CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
: CDialog(CMyDialog::IDD, pParent)
{
brush.CreateSolidBrush(RGB(255,0,0));
}BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CMyDialog 消息处理程序HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何属性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 if(nCtlColor==4)
{
int i=2;
} return (HBRUSH)brush;
//return hbr;
}也就说 与反射无关系,作为一对话框,如果想相应wm_ctlcolordlg这个消息,那么只能在自身处理,你也不能在父窗口中处理。
以上是我的纠正
在第8楼的基础上, 第8楼基础上,添加另一个消息:
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CMyDialog 消息处理程序HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何属性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 if(nCtlColor==4)
{
int i=2;
} return (HBRUSH)brush;
//return hbr;
}BOOL CMyDialog::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 RECT rect;
GetClientRect(&rect);
InflateRect(&rect,-10,-10);
pDC->FillSolidRect(&rect,RGB(0,0,255));
// return CDialog::OnEraseBkgnd(pDC);
return TRUE;
}发现wm_ctlcolordlg并没有覆盖 wm_erasbkgnd所绘制的界面,怎么回事呢?