SDK下求对控件颜色操作清楚的高手解答

szjeff2005 2010-12-17 07:15:16
SDK编程:使用控件,想对一个static控件做一些操作,使用了SetWindowLong将其的WNDPROC修改成自己调用的一个函数,在这个函数里面如果对WM_PAINT进行操作,那么这时在对于其父窗口的WM_CTLCOLORSTATIC所进行的颜色修改就没有作用了,如果不处理WM_PAINT就没有问题。另外一点也很奇怪,如果在创建这个static时其属性中如果增加了颜色特征,WM_CTLCOLORSTATIC也会失去作用。所以很想知道static控件的颜色是如何控制的,修改它的HBRBKGROUDBRUSH没有任何用处。盼高手解答,越详细越好

测试程序如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
TCHAR szBuffer[200];
HINSTANCE hInstance;
static HWND hstatic;
static HBRUSH hBrushStatic, hBrushStatic2;
LONG style;

switch(message)
{
case WM_CREATE:
hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
hstatic = CreateWindow( TEXT("STATIC"), TEXT("LIST is joke"),
WS_CHILD|WS_VISIBLE|SS_CENTER|SS_GRAYRECT,//如果有了SS_GRAYRECT,WM_CTLCOLORSTATIC就无效了

100, 100, 200, 200,
hwnd, (HMENU)1, hInstance, NULL);

OldStatic = (WNDPROC) SetWindowLong (hstatic, GWL_WNDPROC, (LONG) StaticProc );
hBrushStatic2 = (HBRUSH)GetStockObject(DKGRAY_BRUSH);
SetClassLong(hstatic, GCL_HBRBACKGROUND, hBrushStatic2);
hBrushStatic = (HBRUSH)GetStockObject(BLACK_BRUSH);

return 0;

case WM_CTLCOLORSTATIC:
SetTextColor((HDC)wParam, RGB(70, 0, 80));
SetBkColor((HDC)wParam, RGB(0, 90, 130));
return (LRESULT)hBrushStatic;


case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

LRESULT CALLBACK StaticProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(message)
{
case WM_PAINT://如果处理了此消息,WM_CTLCOLORSTATIC也无效了
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 10, 10, "This is a Test", 14);
EndPaint(hwnd, &ps);
break;
}
return CallWindowProc( OldStatic, hwnd, message, wParam, lParam );
}
...全文
63 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacky_qiu 2011-01-09
  • 打赏
  • 举报
回复
我也遇到过这样情况,假如前提是已正确的替换掉指定控件的窗口过程
然后在自己的窗口过程中捕获WM_PAINT消息,再使用 hdc = BeginPaint(hwnd, &ps);
那窗口原来的paint工作就会出问题。(虽然我们确实没有修改任何消息的东西)
但如果你不要用BeginPaint(hwnd, &ps);,用HDC hdc=GetDC(hWnd),那原来的窗口
再执行默认WM_PAINT处理时就不会出错。原因我也不太懂!愿顺利!
schlafenhamster 2011-01-09
  • 打赏
  • 举报
回复
简单的说要这样:
WNDPROC OldStatic;
//
LRESULT CALLBACK StaticProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hparentwnd;
PAINTSTRUCT ps;
HDC hdc;
HBRUSH brsh;
switch(message)
{
case WM_PAINT: //如果处理了此消息,WM_CTLCOLORSTATIC也无效了
// OutputDebugString("StaticProc3\n");
// return CallWindowProc(OldStatic, hwnd, message, wParam, lParam );
hparentwnd=GetParent(hwnd);
//OutputDebugString("Before BeginPaint\n");
hdc = BeginPaint(hwnd, &ps);
//OutputDebugString("After BeginPaint\n");
//!!!
brsh=(HBRUSH) SendMessage(hparentwnd,WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARAM)hwnd);
::FillRect(hdc,&ps.rcPaint,brsh);
//!!!
TextOut(hdc, 10, 10, "Color Red", 9);
EndPaint(hwnd, &ps);
return 0;
tyzqqq 2011-01-08
  • 打赏
  • 举报
回复
使用SetWindowLong修改指定函数后,原来的static text控件当然就不起作用的,可能你要在指定的函数中设置消息。你把代码贴完整,大家才能仔细看。
szjeff2005 2010-12-20
  • 打赏
  • 举报
回复
再顶一下,需要对控制颜色操作有经验的人员一起来探讨

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧