C語言學習 18-11-9
阿新 • • 發佈:2018-12-06
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);
}