SDK下求对控件颜色操作清楚的高手解答
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 );
}