windows編程入門-定時刷新客戶區

要求:

  在窗口中使用一個定時器,每隔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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章