要求:
在窗口中使用一個定時器,每隔1S交替使用紅色、綠色、藍色刷新整個窗口客戶區。
分析一下:
首先是
定義三個畫刷分別定義爲紅色、藍色、綠色。
然後是獲得整個窗口客戶區,使用函數 GetClientRect(hwnd,&rc); 可以獲取當前客戶窗口。
GetClientRect(hwnd,&rc);
FillRect(hDC,&rc,hBrush);
hwnd 是 當前窗口句柄, rc 指向含有將填充矩形的邏輯座標的RECT結構的指針。
關於 rc 的定義是 RECT rc;
hBrush = CreateSolidBrush(RGB(255,0,0));
SelectObject(hDC,hBrush);
最後,利用函數FillRect(hDC,&rc,hBrush);來填充選中的區域。至於交替填充那就非常簡單了。
FillRect(hDC,&rc,hBrushA);
完整代碼如下
//運行環境: vs2008
#include <windows.h>
#include <tchar.h>
#include <cmath>
TCHAR lpszClassName[] = L"window";
TCHAR lpszTitle[] = L"my_windows";
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void InitWindow(WNDCLASS *WndClass,HINSTANCE hInstance);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG Msg;
WNDCLASS WndClass;
InitWindow(&WndClass,hInstance);
if(!RegisterClass(&WndClass))
{
MessageBeep(0);
return FALSE;
}
hwnd = CreateWindow(
lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
void InitWindow(WNDCLASS *WndClass,HINSTANCE hInstance)
{
(*WndClass).style = 0;
(*WndClass).lpfnWndProc = WndProc;
(*WndClass).cbClsExtra = (*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 = lpszClassName;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hDC;
HBRUSH hBrush,hBrushA,hBrushB;
HPEN hPen;
PAINTSTRUCT PtStr;
//設置flag爲靜態變量因爲每次講窗口無效化的時候 flag 回到初始值
//設置爲 static 變量可以避免這個問題
static int flag=0;
RECT rc;
switch(message)
{
case WM_PAINT:
//獲取設備環境
hDC = BeginPaint(hwnd,&PtStr);
//創建畫筆
hPen = CreatePen(
PS_SOLID,
1,
RGB(255,255,255)
);
//將畫筆選入設備環境
SelectObject(hDC,hPen);
if(flag == 0)
{
//創建畫刷並且將畫刷選入設備環境
hBrush = CreateSolidBrush(RGB(255,0,0));
SelectObject(hDC,hBrush);
//選取整個窗口
GetClientRect(hwnd,&rc);
//填充窗口
FillRect(hDC,&rc,hBrush);
//刪除畫刷節約資源
DeleteObject(hBrush);
}
else if(flag == 1)
{
hBrushA = CreateSolidBrush(RGB(0,255,0));
SelectObject(hDC,hBrushA);
GetClientRect(hwnd,&rc);
FillRect(hDC,&rc,hBrushA);
DeleteObject(hBrushA);
}
else if(flag == 2)
{
hBrushB = CreateSolidBrush(RGB(0,0,255));
SelectObject(hDC,hBrushB);
GetClientRect(hwnd,&rc);
FillRect(hDC,&rc,hBrushB);
DeleteObject(hBrushB);
}
flag = (flag+1) % 3;
//無效化窗口並且清空緩衝區
InvalidateRect(hwnd,NULL,1);
Sleep(1000);
break;
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}