基于WinAPI的窗口示例

实现的主要功能如下:

  1. 程序默认图标为?,默认光标为左右箭头,在指定位置输出 文字消息
  2. 单击鼠标左键时,弹出对应点的位置坐标(注意坐标转换)
  3. 单击键盘的上下左右键时,弹出对应的对话框(键盘消息的处理方式)
#include "windows.h"
#include "stdio.h"

LRESULT CALLBACK DealMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT pen;
	HDC dc;
	TCHAR *PP = L"你好,Windows";
	switch (uMsg)
	{
		//鼠标左键按下
	case WM_LBUTTONDOWN:
		{
			TCHAR buf[1024] = {0};
			int x = 10, y = 10;
			POINT pt;//CPoint pt;
			GetCursorPos(&pt);//该函数检取光标的位置,以屏幕坐标表示, 如果为了与TextOut 相比的话,则需要将屏幕坐标转换为客户区坐标
			ScreenToClient(hWnd, &pt);//的将屏幕坐标转换为客户区坐标//TextOut中就是客户区坐标
			x = pt.x;
			y = pt.y;
			wsprintf(buf,TEXT("x = %d , y = %d"),x,y);
			MessageBox(hWnd,buf,TEXT("坐标"),MB_OK);
		}
		break;
		//关闭程序
	case WM_DESTROY://WM_QUIT//只有发这个命令时,关闭调试程序时,代码上的调试才会结束 
		PostQuitMessage(2);
		break;
	case WM_PAINT://输出文字
		{
			dc = BeginPaint(hWnd,&pen);
			TextOutW(dc,20,20,PP,wcslen(PP));//客户区坐标
			EndPaint(hWnd,&pen);
			break;
		}
	case WM_KEYDOWN://当有键盘输入事件时,会产生 WM_KEYDOWN 消息
		{
			switch(wParam)//虚拟键
			{
				case VK_LEFT:
					MessageBox(hWnd,TEXT("向左"),TEXT("坐标"),MB_OK);
					break;
				case VK_UP:
					MessageBox(hWnd,TEXT("向上"),TEXT("坐标"),MB_OK);
					break;
				case VK_RIGHT:
					MessageBox(hWnd,TEXT("向右"),TEXT("坐标"),MB_OK);
					break;
				case VK_DOWN:
					MessageBox(hWnd,TEXT("向下"),TEXT("坐标"),MB_OK);
					break;
				case VK_RETURN:
					MessageBox(hWnd,TEXT("键盘Enter"),TEXT("坐标"),MB_OK);
					break;
			}
			break;
		}		
	default:
		return DefWindowProc(hWnd, uMsg,wParam, lParam);
	}
	return 0;
}

int WINAPI WinMain(
	HINSTANCE hInstance,
	 HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nShowCmd)
{
	HWND hWnd;
	MSG msg;
	WNDCLASS cs;
	DWORD dWord;
	cs.cbClsExtra       = 0;
	cs.cbWndExtra       = 0;//这个写错了,写成了第一个参数,导致注册类不成功!!!!!
	cs.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);//画刷北京BLACK_PEN
	cs.hCursor          = LoadCursor(NULL,IDC_SIZEWE);
	cs.hIcon            = LoadIcon(NULL,IDI_QUESTION);
	cs.hInstance        = hInstance;
	cs.lpfnWndProc      = DealMessage;
	cs.lpszClassName    = TEXT("ABC");
	cs.lpszMenuName     = NULL;
	cs.style            = nShowCmd;

	if (!RegisterClass(&cs))//这里可以查看是否注册成功//返回非零是成功,返回零是失败
	{
		MessageBox(NULL,TEXT("注册类失败,请检查参数是否成功设置"),TEXT("坐标"),MB_OK);
	}

	hWnd = CreateWindow(TEXT("ABC"), TEXT("hello,windows"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USEDEFAULT,CW_USEDEFAULT
		,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);//CreateWindow中窗口类与 WNDCLASS中窗口类名必须一样才可以,否则也是运行不了

	if (!hWnd)
	{
		return 0;
	}

	MoveWindow(hWnd,30,30,580,480,TRUE);//相对整个桌面屏幕的左上角。。。测试过

	ShowWindow(hWnd,SW_NORMAL);

	UpdateWindow(hWnd);

	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return 1;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值