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);
}