sdk的对话框工程版本
static HBRUSH hbr=CreateSolidBrush(RGB(255,0,0));
case WM_ERASEBKGND:
{
RECT rect;
GetClientRect(hDlg,&rect);
hdc=(HDC)wParam;
FillRect(hdc,&rect,hbr);
return 0;
}
break; case WM_CTLCOLORDLG:
{
int ii=2;
return (HRESULT)GetStockObject(BLACK_BRUSH);
}
break;运行的结果,是黑色的 分析原因:可能是WM_CTLCOLORDLG覆盖了红色背景,我分析的对否?
static HBRUSH hbr=CreateSolidBrush(RGB(255,0,0));
case WM_ERASEBKGND:
{
RECT rect;
GetClientRect(hDlg,&rect);
hdc=(HDC)wParam;
FillRect(hdc,&rect,hbr);
return 0;
}
break; case WM_CTLCOLORDLG:
{
int ii=2;
return (HRESULT)GetStockObject(BLACK_BRUSH);
}
break;运行的结果,是黑色的 分析原因:可能是WM_CTLCOLORDLG覆盖了红色背景,我分析的对否?
解决方案 »
- VS2010中 VC++怎么调用webservice
- m_nArray前面的m_n是什么意思
- 怎么打不开工程的resources文件?总是提示“load failed”
- CTreeCtrl 某一个节点的内容,能否用2种字体显示,如何来做
- sizeof测char*,为何测不准?
- 关于sybase数据库
- 在线等待!!!解决了给200分!MFC程序调试问题!
- 哪位高人能告诉我如何用c实现做24位的BMP图片切割 谢谢了!!
- 如何读取ACCESS数据库中的备注[MEMO]类型的字段[BLOB]?
- 在屏幕最前端绘图,如何不被刷新
- 在线程或子函数中定义的IPLIMAGE类型在用完后需要RELEASE吗?
- vs2010 vs2008样式mfc
case WM_CTLCOLORDLG:
{
int ii=2;
return (HRESULT)GetStockObject(BLACK_BRUSH);
}这里面直接return掉,看看效果是什么撒
null_brush
后,结果是红色的。
{
RECT rect;
GetClientRect(hDlg,&rect);
hdc=(HDC)wParam;
FillRect(hdc,&rect,hbr);
return 0; 改成return 1;表示不要擦除(因为你刚填充红色),后面的case WM_CTLCOLORDLG要去掉。
因为调用顺序是ERASEBKGND-》CTLCOLORDLG-》PAINT
}
为了进一步验证这个结论:我把wm_ctlcolordlg这个消息给注释掉后,发现,红色看不到了, 是否可以说明:windows默认 会用wm_ctlcolordlg这个消息去再次擦背景?把红色擦掉?我用mfc建立一个对话框工程:看是否是这样,
Onctlcolor的源码为:
CBrush brush(RGB(0,0,255)); HBRUSH hbru=(HBRUSH)brush; return hbru;onerasebkgnd的源码为:
BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
RECT rect;
GetClientRect(&rect);
CBrush brush(RGB(255,0,0));
pDC->FillRect(&rect,&brush);
return TRUE;
//return CDialog::OnEraseBkgnd(pDC);
}
结果是红色,而不是蓝色也就说wm_ctlcolrodlg并没有把wm_erasebkgnd给擦掉,覆盖掉。怎么回事?
你要搞清楚BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC) 返回值的含义呀你把
BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
RECT rect;
GetClientRect(&rect);
CBrush brush(RGB(255,0,0));
pDC->FillRect(&rect,&brush);
return TRUE;
//return CDialog::OnEraseBkgnd(pDC);
}
----------------------------------------
中改为 return FALSE 再次看看是什么结果
{ CBrush brush(RGB(0,0,255)); HBRUSH hbru=(HBRUSH)brush; return hbru;
}BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC)
{
RECT rect;
GetClientRect(&rect);
CBrush brush(RGB(255,0,0));
pDC->FillRect(&rect,&brush);
return FALSE;
//return CDialog::OnEraseBkgnd(pDC);
}
结果依然是红色,修改返回值不管用。你要不自己试试
HBRUSH hbru=(HBRUSH)brush;
return hbru; //此处有误,brush会被析构掉,最好定义一个成员变量CBrush m_bk_brush;
多谢,改成类的成员后,已经有一些控件的背景被修改了。说明wm_ctlcolor可能会覆盖wm_erasebkgnd的效果的。但是
mfc与sdk对wm_ctlcolor的处理差异很大!后者是,完全覆盖之,除了控件外, 因为对于sdk,我们处理的是wm-ctlcolordlg 这个具体的消息,所以可以
可以用新的颜色来覆盖wm_erasebkgnd填充的效果。而mfc则不一样,如果返回刷子,那么并不会把整个对话框的背景给覆盖,你可能说,wm_erasebkgnd的返回值有关系啊,你返回true或者flase试试,看结果就知道了。很遗憾,mfc还真与 返回值无关。而且也看不到wm_ctlcolordlg去覆盖wm_erasebkgnd所填充的背景。仅仅修改的是:控件的颜色.看代码:
HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
return (HBRUSH)brush; //黑色brush CBrush brush;}
好吧。我只是忍不住想问 为啥mfc和sdk对同一个消息处理的结果不一样
http://blog.csdn.net/morewindows/article/details/8451629
16楼的问题, 我故意加了一句:
if(nCtlColor==CTLCOLOR_DLG)
{
int i=2; //这里设置断点
}发现没有进入if语句里,所以导致, 仅仅修改的是:控件的颜色., 而对话框背景没有被WM_CTLCOLORDLG修改。 控件倒是被黑色了。 对话框背景没有被黑色。