给子窗口指定了墨色画刷但是子窗口背景还是白色

给子窗口指定了黑色画刷但是子窗口背景还是白色
本帖最后由 mi73nai595 于 2014-10-15 21:13:01 编辑
问题: 给子窗口指定了黑色画刷但是子窗口背景还是白色


直接上代码吧,也不长~

#include<windows.h>
#define DIVISIONS 5


LRESULT CALLBACK WndProc
(
HWND,UINT,WPARAM,LPARAM
);
LRESULT CALLBACK ChildWndProc
(
HWND,UINT,WPARAM,LPARAM
);
TCHAR szChildClass[]=TEXT("Hellokk");
int WINAPI WinMain
(
 HINSTANCE hInstance,
 HINSTANCE hPrevinstance,
 PSTR szCmdLine,
 int iCmdShow
 )
{
static TCHAR szAppName[]=TEXT("HelloWin");

HWND hwnd;
MSG msg;  
WNDCLASS wndclass;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;    
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hInstance =hInstance;
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName =szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This is wrong"),szAppName,MB_ICONERROR);
return 0;
}

wndclass.lpfnWndProc=ChildWndProc;
wndclass.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.cbWndExtra=sizeof(long);
wndclass.hIcon=NULL;
wndclass.lpszClassName=szChildClass;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This is wrong"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow
(
szAppName,NULL,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);

}
return msg.wParam ;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HWND hwndChild;
static int i=1,j=1;


static int cxBlock,cyBlock;

int x,y;
static int right=0;

switch(message)
{
case WM_CREATE:

hwndChild=CreateWindow(szChildClass,NULL,
WS_CHILDWINDOW|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)101,
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
return 0;
case WM_SIZE:
cxBlock=LOWORD(lParam)/DIVISIONS;
cyBlock=HIWORD(lParam)/DIVISIONS;
MoveWindow(hwndChild,0*cxBlock,0*cyBlock,
cxBlock,cyBlock,TRUE);
return 0;
case WM_KEYDOWN:

switch(wParam)
{
case VK_RIGHT:
right+=10;
MoveWindow(hwndChild,right,2*cyBlock,
cxBlock,cyBlock,TRUE);
break;
}
return 0;






case WM_LBUTTONDOWN:
MessageBeep(0);
return 0;
case WM_DESTROY:

PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:

SetWindowLong(hwnd,0,0);
return 0;
case WM_LBUTTONDOWN:
SetWindowLong(hwnd,0,1);
GetWindowLong(hwnd,0);

InvalidateRect(hwnd,NULL,FALSE);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
Rectangle(hdc,0,0,rect.right,rect.bottom);
if(GetWindowLong(hwnd,0))
{
MoveToEx(hdc,0,0,NULL);
LineTo(hdc,rect.right,rect.bottom);
MoveToEx(hdc,0,rect.bottom,NULL);
LineTo(hdc,rect.right,0);
}
EndPaint(hwnd,&ps);
return 0;

}
return DefWindowProc(hwnd,message,wParam,lParam);
}
------解决思路----------------------
代码有点长,你又不放到高亮语法里,看着累.大概说一下吧:
1.既然是你自己注册的窗口类,可以在wndclass.hbrBackground 指定背景画刷.
2.创建后的,应该在WM_ERASEBKGND或WM_PAINT绘制背景(推荐前者)
3.在WM_CREATE等消息绘制的东西,下一次触发WM_PAINT会被覆盖掉.
------解决思路----------------------
hdc 默认的刷子应该是白色吧,你用 Rectangle 绘制矩形底色是白色的。如果要画矩形框,用 FrameRect。