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

猜你喜欢

转载自blog.csdn.net/weixin_42896619/article/details/84106283