Win32学习(第四天) 重要消息

1、按键操作
WM_KEYDOWN: 按键按下 判断按下的是哪个按键
按键按下消息 响应主键值
按键的值->虚拟键值 存放wParam
虚拟键值,在ASCII码表中有的值就不再额外设定虚拟键值,依照ASCII码表,不存在的才有虚拟键值
虚拟键值开头VK
WM_KEYUP: 按键抬起

case WM_KEYDOWN://不响应上档键,只响应大写
		switch (wParam)
			{
        case VK_LEFT://判断是否按下左键,是的则弹出对话框
				MessageBox(0, _T("左键"), 0, 0);
				break;
			case VK_RIGHT:://判断是否按下右键,是的则弹出对话框
				MessageBox(0, _T("右键"), 0, 0);
				break;
			case VK_SPACE:://判断是否按下空格键,是的则弹出对话框
				MessageBox(0, _T("空格"), 0, 0);
				break;
			case VK_CONTROL:://判断是否按下CTRL键,是的则弹出对话框
				MessageBox(0, _T("CTRL"), 0, 0);
				break;
			case VK_SHIFT:://判断是否按下SHIFT键,是的则弹出对话框
			MessageBox(0, _T("SHIFT"), 0, 0);
				break;
			}
		break;
	case WM_KEYUP://判断按键是否抬起这里只是作为一个判断条件
			break;

WM_CHAR 字符消息 可以响应大小字母及上档键 字符消息的字符内容同样放在wParam里面

case WM_CHAR:
		switch (wParam)
		{
		case 'a'://按下A键会弹出一个对话框中显示a
			MessageBox(0, _T("a"), 0, 0);
			break;
		case 'B'://按下B键会弹出一个对话框中显示b
			MessageBox(0, _T("B"), 0, 0);
			break;
		case '*'://按下'*'上档键(shift+8)会弹出对话框显示*
			MessageBox(0, _T("*"), 0, 0);
			break;
		}
		break;

WM_SYSKEYDOWN WM_SYSKEYUP 系统按键
(1)、alt或f10叫系统按键
(2)、alt+其他键组合键

 switch (wParam)
    	{
    	case VK_MENU:/按下ALT按键
    		MessageBox(0, _T("alt"), 0, 0);
    		break;
    	case VK_F10://按下F10按键
    		MessageBox(0, _T("f10"), 0, 0);
    			break;
    		case 'S'://按下ALT+S(但是由于弹出的是对话框需不可和前面的 case  VK_MENU同时使用)
    			MessageBox(0, _T("alt + S"), 0, 0);
    			break;
    		}
    		break;
    	case WM_SYSKEYUP:
    		break;

2、鼠标操作
WM_LBUTTONDOWN 除了关注用户操作了鼠标,还关注用户操作鼠标的位置

//case WM_LBUTTONDOWN://点击鼠标会在窗口上显示点击鼠标的坐标
	//{
					//鼠标的坐标信息都保存在lparam
							//int x = LOWORD(lParam);
							//int y = HIWORD(lParam);
							//TCHAR arr[128] = {};
							//_stprintf_s(arr,127,_T("x = %d,y = %d"),x,y);
						//hdc = GetDC(hWnd);
				//TextOut(hdc, 0, 0, arr, _tcslen(arr));
						//ReleaseDC(hWnd, hdc);
	//}
		///break;
case WM_LBUTTONDOWN://实现在窗口上画图的功能,同时可动态的显示鼠标在窗口上的坐标
		beginX = LOWORD(lParam);//自定义的int变量
		beginY = HIWORD(lParam);//自定义的int变量
		isDown = true;//自定义的bool变量
		//三个自定义变量定义场景放到API函数外面
		break;
	case WM_LBUTTONUP://判断鼠标左键是否抬起
		isDown = false;
		break;
	case WM_MOUSEMOVE://控制鼠标移动
	{

					 if (isDown)
					 {
						 int x = LOWORD(lParam);
						 int y = HIWORD(lParam);
						 hdc = GetDC(hWnd);
						 MoveToEx(hdc, beginX, beginY, nullptr);//画线的时候把起点移到某个位置
						 LineTo(hdc, x, y);//画线到某位置
						 ReleaseDC(hWnd, hdc);
						 beginX = x;
						 beginY = y;
					 }
	int x = LOWORD(lParam);
	int y = HIWORD(lParam);
	TCHAR arr[128] = {};
	_stprintf_s(arr,127,_T("x = %d,y = %d"),x,y);
	hdc = GetDC(hWnd);
	TextOut(hdc, 0, 0, arr, _tcslen(arr));
	ReleaseDC(hWnd, hdc);	
}
break;

WM_CREATE WM_TIMER 鼠标计时器消息

switch (message)
	{
	case WM_CREATE:
		SetTimer(hWnd,//哪个窗口需要计时器
			1001,//计时器id
			1000,//计时器的时长
			nullptr);//计时器的回调函数指针,如果为null响应wm_timer消息,如果非空将不响应wm_timer消息,将直接调用该函数
		SetTimer(hWnd, 1002, 2000, nullptr);
		SetTimer(hWnd, 1003, 3000, (TIMERPROC)aaa);
		break;
		//计时器消息
	case WM_TIMER:
		//窗口默认不带计时器,需要主动的设置
	{
					 switch (wParam)
					 {
					 case 1003:
					 {
								  static int j = 0;
								  hdc = GetDC(hWnd);
								  TextOut(hdc, 600, j, _T("timer_4"), 7);
								  ReleaseDC(hWnd, hdc);
								  j += 20;
					 }
						 break;
					 case 1001:
					 {
								  static int j = 0;
								  hdc = GetDC(hWnd);
								  TextOut(hdc, 0, j, _T("timer_1"), 7);
								  ReleaseDC(hWnd, hdc);
								  j += 20;
					 }
						 break;
					 case 1002:
					 {
								  static int j = 0;
								  hdc = GetDC(hWnd);
								  TextOut(hdc, 200, j, _T("timer_2"), 7);
								  ReleaseDC(hWnd, hdc);
								  j += 20;
					 }
						 break;
					 }

	}

猜你喜欢

转载自blog.csdn.net/qq_41848597/article/details/88804237