C windows.h 创建窗口

#include<windows.h>
#pragma comment(lib, "winmm.lib")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, //hInstance是实例句柄,具体是一个数值
				HINSTANCE hPrevInstance, //此参数通常总是定义为NULL
				PSTR szCmdLine, //用来运行程序的命令行,有些Windows程序启动时用它来把文件装入内存
				int iCmdShow){//iCmdShow指明程序如何显示(最大化?正常显示?)

	static TCHAR szAppName[] = TEXT("HelloWindows");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;

	// 用于类结构和Windows内部维护的窗口结构中预留一些额外空间
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;

	wndclass.hInstance = hInstance; //实例句柄
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //加载图标供程序使用
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //加载鼠标光标

	//获得白色的鼠标指针,同时窗口客户区被填充为白色
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //获取一个图形对象,这里是一个用来对窗口的背景进行重绘的画刷
	wndclass.lpszMenuName = NULL; //指定窗口类的菜单,NULL为不带菜单
	wndclass.lpszClassName = szAppName; //窗口名

	if(!RegisterClass(&wndclass)){//为应用程序注册一个窗口类
		// 注册失败
		MessageBox(NULL,
					TEXT("本程序需要windows NT"),
					szAppName,
					MB_ICONERROR
				);
		return 0;
	}
	// 函数原型:HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hlnstance,LPVOID lpParam);
	
	hwnd = CreateWindow(szAppName, //窗口名
						TEXT("Hello Programe"),//窗口内容
						WS_OVERLAPPEDWINDOW, //窗口风格
						CW_USEDEFAULT, //初始X坐标
						CW_USEDEFAULT, //初始Y坐标
						CW_USEDEFAULT, //初始X方向的尺寸
						CW_USEDEFAULT, //初始Y方向的尺寸
						NULL, //父窗口句柄
						NULL, //菜 单句柄,或依据窗口风格指明一个子窗口标识
						hInstance, //程序实例句柄
						NULL //创建参数, 指向一个值的指针,该值传递给窗口 WM_CREATE消息
						);
	/*函数功能:该函数设置指定窗口的显示状态。
	函数原型:BOOL ShowWindow(HWND hWnd, int nCmdShow);*/
	ShowWindow(hwnd, iCmdShow);//创建完之后,开始显示

	// 如果窗口更新的区域不为空,UpdateWindow函数就发送一个WM_PAINT消息来更新指定窗口的客户区。
	// 函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。
	UpdateWindow(hwnd);

	/*GetMessage是从调用线程的消息队列里取得一个消息并将其放于指定的结构。
	此函数可取得与指定窗口联系的消息和由PostThreadMessage寄送的线程消息。
	此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。
	获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值。*/
	while(GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg); //翻译一些键盘消息
		DispatchMessage(&msg); //将消息发送给窗口过程
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, 
						UINT message, 
						WPARAM wParam,
						LPARAM lParam
						){
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	switch(message){
		case WM_CREATE:
			//播放声音文件
			PlaySound(TEXT("hellowin.wav"),//播放窗口打开的声音
						NULL,
						SND_FILENAME | SND_ASYNC
					);
			return 0;
		case WM_PAINT:
			hdc = BeginPaint(hwnd, &ps); //标明窗口绘制开始
			GetClientRect(hwnd, &rect); //获取窗口客户区的尺寸
			// 显示一个文本字符擦混
			DrawText(hdc,
					TEXT("Hello, windows 10"),
					-1,
					&rect,
					DT_SINGLELINE | DT_CENTER | DT_VCENTER
					);
			EndPaint(hwnd, &ps); //结束窗口绘制
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0); //将退出消息插入消息队列
			return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam); //执行默认的消息处理


}


在这里插入图片描述

相关推荐

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

爱吃鱼的喵996

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值