1. 程式人生 > >C語言學習 18-11-9

C語言學習 18-11-9

1.檢測按下按鍵資訊並彈出對話方塊

1.) 檢測發生按鍵資訊:WM_KEYDOWN
2.) 彈出對話方塊:MessageBox(控制代碼函式,彈出對話方塊顯示的內容,對話方塊的標題,對話方塊的樣式)

MessageBox(h_wnd, "Mother Fucker!!!!", "Surprise", MB_OK);

1.若想按下鍵盤 A-Z 鍵彈出對話方塊,則需要判斷wParam,該值為按鍵的虛擬碼值。

if(65 == w_param)
	MessageBox(h_wnd, "Mother Fucker!!!!", "Surprise", MB_OK);

2.若想點選滑鼠左鍵,則需 case WM_LBUTTONDOWN,左擊時滑鼠的x、y值分別可由LOWORD(lParam)和HIWORD(lParam)獲得。

case WM_LBUTTONUP:
	x = LOWORD(l_param);
	y = HIWORD(l_param);
	sprintf(str, "%d, %d", x, y);
	MessageBox(h_wnd, str, "點選位置的座標是:", MB_YESNO);
	break;

2.在視窗中重繪一個矩形

步驟:
1.) 判斷訊息:WM_PAINT
2.) 獲得hdc控制代碼:hdc = BeginPaint(當前應用程式控制代碼,PAINTSTRUCT ps)
3.) 繪製矩形 Rectangle(hdc, 左上角x值 左上角y值 右下角x值 右下角y值)
4.) 結束繪製,EndPaint(h_wnd, &ps)

case WM_PAINT:	
	hdc = BeginPaint(h_wnd, &ps);				// 開始重繪
	Ellipse(hdc, 50, 50, 100, 100);				// 重繪矩形
	Ellipse(hdc, 450, 450, 500, 500);
	EndPaint(h_wnd, &ps);						// 結束重繪需要回收
	break;

3.按下按鍵畫圓

步驟:
1.) 判斷按鍵訊息:WM_KEYDOWN
2.) 獲得dc控制代碼:hdc = GetDC(h_wnd)
3.) 設定畫刷的顏色:brush = CreateSolidBrush(RGB(0, 255, 0))
4.) 選擇畫刷:SelectObject(hdc, brush)
5.) 繪製圖像
6.) 釋放DC:ReleaseDC(h_wnd, hdc)

case WM_KEYDOWN:
	hdc = GetDC(h_wnd);							// 除了WM_PAINT中使用beginPaint獲取dc,在WM_PAINT外獲取dc需要getdc
	brush = CreateSolidBrush(RGB(0, 255, 0));	// 設定不同的顏色來畫圖
	SelectObject(hdc, brush);
	Ellipse(hdc, 50, 50, 120, 100);
	ReleaseDC(h_wnd, hdc);			

3.設定定時器

在WinMain函式中設定定時器:SetTimer(當前應用程式控制代碼,定時器的id,定時器的時延,某個指標 一般為空NULL),
需要在訊息檢測中加入 case WM_TIMER 來處理定時器訊息。

4.整體程式

#include "Windows.h"
#include "stdlib.h"
#include "stdio.h"

LRESULT CALLBACK my_wndproc(HWND h_wnd, UINT message_flag, WPARAM w_param, LPARAM l_param);

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
					 LPSTR IpCmdLine, int nCmdShow)
{
	HWND h_wnd;
	MSG my_msg;
	// 1.設計視窗
	WNDCLASSEX ex;
	ex.style = CS_HREDRAW/* | CS_VREDRAW*/;			// 視窗的重新整理方式,當水平重新整理時,改變視窗的高度會重繪;當垂直重新整理時,改變視窗的寬度會重繪;
	ex.cbSize = sizeof(WNDCLASSEX);				// 當前結構體的大小
	ex.cbClsExtra = 0;							// 為結構體開闢附加空間儲存結構體的附加資訊
	ex.cbWndExtra = 0;							// 註冊視窗時申請的空間大小存放此視窗的特有資料,通常為0
	ex.hInstance = hInstance;					// 應用程式控制代碼,此結構體在哪個應用程式中使用
	ex.hIcon = NULL;							// 指定視窗類圖示的控制代碼
	ex.hCursor = NULL;							// 載入滑鼠為空使用系統預設圖示
	ex.hbrBackground = CreateSolidBrush(RGB(0, 0, 255));	// 指定背景畫刷控制代碼
	ex.hIconSm = NULL;							// 窗體圖示,最左上角的小圖示
	ex.lpfnWndProc = &my_wndproc;						// 訊息處理函式指標
	ex.lpszMenuName = NULL;						// 載入選單名,為空則沒有選單
	ex.lpszClassName = "aa";					// 字符集,預設為unicode,可在專案中修改為多字元

	// 2.註冊視窗
	RegisterClassEx(&ex);

	// 3.建立視窗
	h_wnd = CreateWindow(ex.lpszClassName, "hahaah", WS_OVERLAPPEDWINDOW, 50, 50, 600, 600, NULL, NULL, hInstance, NULL);

	// 4.顯示視窗
	ShowWindow(h_wnd, SW_SHOW);

	// 設定重新整理時間,定時器設定
	SetTimer(h_wnd, 1, 500, NULL);

	// GetMessage(指向一個MSG指標,指向接受哪個視窗的訊息 為NULL接收所有視窗,指定要獲取的訊息的最小值 通常為0,指定要獲取的訊息的最小值 最大最小都為0則接收所有)
	while(GetMessage(&my_msg, NULL, 0, 0))
	{
		TranslateMessage(&my_msg);				// 翻譯訊息
		DispatchMessage(&my_msg);				// 分發訊息
	}

	return 0;
}

LRESULT CALLBACK my_wndproc(HWND h_wnd, UINT message_flag, WPARAM w_param, LPARAM l_param)
{
	int x, y;
	char str[20] = {0};
	PAINTSTRUCT ps;
	HDC hdc;
	HBRUSH brush;

	switch (message_flag)
	{
	case WM_CLOSE:
		PostQuitMessage(0);
		break;

	// 按 A 鍵時顯示視窗
	case WM_KEYDOWN:
		/*if(65 == w_param)
			MessageBox(h_wnd, "Mother Fucker!!!!", "Surprise", MB_OK);*/
		hdc = GetDC(h_wnd);							// 除了WM_PAINT中使用beginPaint獲取dc,在WM_PAINT外獲取dc需要getdc
		brush = CreateSolidBrush(RGB(0, 255, 0));
		SelectObject(hdc, brush);
		Ellipse(hdc, 50, 50, 120, 100);
		ReleaseDC(h_wnd, hdc);						// 釋放獲得到的dc
		break;

	// 當滑鼠左擊時,彈出對話方塊顯示滑鼠的x y
	case WM_LBUTTONUP:
		/*x = LOWORD(l_param);
		y = HIWORD(l_param);
		sprintf(str, "%d, %d", x, y);
		MessageBox(h_wnd, str, "點選位置的座標是:", MB_YESNO);
		break;*/

		// 滑鼠點選的位置畫一個圓
		x = LOWORD(l_param);
		y = HIWORD(l_param);
		hdc = GetDC(h_wnd);
		brush = CreateSolidBrush(RGB(255, 255, 255));
		SelectObject(hdc, brush);
		Ellipse(hdc, x-15, y-15, x+15, y+15);				// 左上角x值 左上角y值 右下角x值 右下角y值
		ReleaseDC(h_wnd, hdc);
		break;

	// 在視窗中重繪一個矩形
	case WM_PAINT:
		hdc = BeginPaint(h_wnd, &ps);				// 開始重繪
		Rectangle(hdc, 50, 50, 100, 100);			// 重繪矩形
		EndPaint(h_wnd, &ps);						// 結束重繪需要回收
		break;

	/*case VK_DOWN:
		break;*/

	// 定時器檢測訊息
	case WM_TIMER:
		MessageBox(h_wnd, "IG牛逼", "1", MB_OK);
		break;

	default:
		break;
	}
	return DefWindowProc(h_wnd, message_flag, w_param, l_param);
}