windows编程(1)-第一个窗口程序

这篇具有很好参考价值的文章主要介绍了windows编程(1)-第一个窗口程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章首发于:My Blog 欢迎大佬们前来逛逛

1. main函数入口点

win32的main函数入口点为 WinMain或者wWinMain,他们包含四个参数:

int __clrcall WinMain(
  [in] HINSTANCE hInstance,
  [in] HINSTANCE hPrevInstance,
  [in] LPSTR     lpCmdLine,
  [in] int       nShowCmd
);

其中:

  • hInstance:应用程序当前窗口的实例句柄
  • hPrevInstance:应用程序上一个窗口的实例句柄
  • lpCmdLine:应用程序的命令行
  • nShowcmd:控制窗口的显示方式

其中wWinMain与WinMain的区别是 wWinMain适用于多字节字符集,而WinMian适用于unicode字符集。

其中第三个参数WinMain是LPSTR类型:

typedef char CHAR;

但是wWinMain是LPWSTR类型:

typedef wchar_t WCHAR; 

2. 窗口函数六部曲

2.1 注册窗口类

ATOM RegisterClassExA(
  [in] const WNDCLASSEXA *unnamedParam1
);

其中:

  • unnamedParam1:一个WNDCLASSEXA结构体指针变量,这个结构包含了我们所创建对象的窗口的属性信息
struct tagWNDCLASSEXW {
    UINT        cbSize; 		
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
}

其中:比较重要的几个参数:

  • hInstance:窗口的示例句柄,就是我们的WinMain包含的hInstance参数
  • lpszClassName:窗口类名
  • cbSize:结构体的大小,必须指定其为sizeof(WNDCLASSEX)
  • style:窗口类的样式,设置水平与垂直重绘:CS_HREDRAW | CS_VREDRAW
  • hbrBackground:窗口回调函数,其接受一个WNDPROC的参数,WNDPROC是一个typedef定义的函数指针,其中包含四个参数:HWND UINT WPARAMS LPARAMS。
//回调函数m_WNDPROC:lpfnWndProc的数据类型
LRESULT CALLBACK m_WNDPROC(HWND hwnd, UINT msg, WPARAM wParams, LPARAM lParams) {
	return DefWindowProc(hwnd, msg, wParams, lParams);
}//使用return DefWindowProc作为返回值

WNDCLASSEX mWinC = {NULL};
mWinC.cbSize = sizeof(WNDCLASSEX);
mWinC.hInstance = hInstance;
mWinC.lpszClassName = "我的第一个窗口";
mWinC.hbrBackground = (HBRUSH)NULL; //画刷
mWinC.lpfnWndProc = m_WNDPROC;
mWinC.style = CS_HREDRAW | CS_VREDRAW;
//注册窗口类
RegisterClassEx(&mWinC);

2.2 创建窗口

HWND CreateWindowExA(
		DWORD dwExStyle,
		LPCSTR lpClassName,
		LPCSTR lpWindowName,
		DWORD dwStyle,
		int X,
		int Y,
		int nWidth,
		int nHeight,
		HWND hWndParent,
		HMENU hMenu,
		HINSTANCE hInstance,
		LPVOID lpParam);

其中:重要的参数有:

  • dwExStyle:设置为mWinC的style即可。
  • lpClassName,lpWindowName:类名与窗口名
  • dwStyle:窗口的样式,设置为WS_OVERLAPPEDWINDOW即可。
  • x y Width Height:窗口的大小和宽高
  • hInstance:窗口的实例句柄。
HWND hwnd =  CreateWindowEx(mWinC.style,
		mWinC.lpszClassName,
		"First Window",
		WS_OVERLAPPEDWINDOW,
		100, 100, 600, 600,
		NULL, NULL,
		mWinC.hInstance,
		NULL);
if (!hwnd) return false;

其返回值为HWND,表示创建了一个窗口句柄hwnd,如果其为NULL,则创建失败。

2.3 显示窗口

BOOL ShowWindow(
  [in] HWND hWnd,
  [in] int  nCmdShow
);
  • hwnd:创建的窗口实例句柄
  • nCmdshow:控制窗口的显示方式
ShowWindow(hwnd, SW_SHOW);

2.4 刷新窗口

UpdateWindow(hwnd);

2.5 消息循环

  1. 接受消息
//从调用线程的消息队列中检索消息。 
BOOL GetMessage(
  [out]          LPMSG lpMsg,
  [in, optional] HWND  hWnd,
  [in]           UINT  wMsgFilterMin,
  [in]           UINT  wMsgFilterMax
);

参数:

  • lpMsg:指向MSG的指针,我们需要创建一个MSG类型的变量表示消息变量

  1. 处理消息
//将虚拟密钥消息转换为字符消息。
BOOL TranslateMessage(
  [in] const MSG *lpMsg
);
  • lpMsg:消息指针

  1. 发送消息
//将消息调度到窗口过程。 
LRESULT DispatchMessage(
  [in] const MSG *lpMsg
);
  • 消息指针

// 消息循环
MSG msg{ NULL };
while (true) {
    //接收消息
    GetMessage(&msg, NULL, NULL, NULL);
    //处理消息
    TranslateMessage(&msg);
    //发送消息
    DispatchMessage(&msg);
}

2.6 消息处理函数

消息处理函数即:WNDPROC

我们已经在 2.1 注册窗口类时处理过了。

//消息处理函数
LRESULT CALLBACK m_WNDPROC(HWND hwnd, UINT msg, WPARAM wParams, LPARAM lParams) {
	return DefWindowProc(hwnd, msg, wParams, lParams);
}
...
...
wMinC.lpfnWndProc=m_WNDPROC
...
...

3. 完整代码

由于我们运行的时Win32程序,我们应该在:

项目 - 属性 - 连接器 - 系统 - 子系统

控制台改为窗口文章来源地址https://www.toymoban.com/news/detail-409394.html

#include <Windows.h>

//回调函数
LRESULT CALLBACK m_WNDPROC(HWND hwnd, UINT msg, WPARAM wParams, LPARAM lParams) {
	return DefWindowProc(hwnd, msg, wParams, lParams);
}

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR cCmdLine,
	int nShowCmd
) {
	// 注册窗口类
	WNDCLASSEX mWinC = {NULL};
	mWinC.cbSize = sizeof(WNDCLASSEX);
	mWinC.hInstance = hInstance;
	mWinC.lpszClassName = "我的第一个窗口";
	mWinC.hbrBackground = (HBRUSH)NULL;
	mWinC.lpfnWndProc = m_WNDPROC;
	mWinC.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClassEx(&mWinC);
	// 创建窗口类
	HWND hwnd =  CreateWindowEx(mWinC.style,
		mWinC.lpszClassName,
		"First Window",
		WS_OVERLAPPEDWINDOW,
		100, 100, 600, 600,
		NULL, NULL,
		mWinC.hInstance,
		NULL);
	if (!hwnd) return false;
	// 显示窗口类
	ShowWindow(hwnd, SW_SHOW);

	// 刷新窗口类
	UpdateWindow(hwnd);

	// 消息循环
	MSG msg{ NULL };
	while (true) {
		//接收消息
		GetMessage(&msg, NULL, NULL, NULL);
		//处理消息
		TranslateMessage(&msg);
		//发送消息
		DispatchMessage(&msg);
	}
	return true;
}

到了这里,关于windows编程(1)-第一个窗口程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 智能合约协议和提案(文章不断跟新,欢迎评论补充&纠正!)

    描述 : ERC-20是基于以太坊区块链技术的一种代币标准协议。它规定了一系列的规范和接口,使得不同的代币可以在以太坊网络上遵循同样的规则,从而实现互操作性和互换性。这种标准协议对于以太坊生态系统的发展起到了重要的推动作用,为众多区块链项目提供了代币发

    2024年04月29日
    浏览(9)
  • C/C++ 从零实现一个windows窗口(非常详细)

    C/C++ 从零实现一个windows窗口(非常详细)

    C/C++教程目录(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/weixin_50964512/article/details/125710864 学习完C/C++之后,最郁闷的可能就是感觉啥也干不了,怎么才能写出平常我们所使用的软件模样? 而对于大部分人来说,最常使用的就是windows系统,所以这就需要了解w

    2024年02月11日
    浏览(10)
  • Python - 操作windows程序窗口

    Python - 操作windows程序窗口

    ● 在自动化测试脚本中,有时候需要自动安装windows程序,或者操作windows程序。对于操作windows程序的python库五花八门,本文以pyautoit库演示如何操作windows程序窗口。 ● pyautoit库是AutoIt v3工具的python接口,直接绑定到AutoItX3.dll。AutoIt v3工具可以实现通过模拟鼠标、键盘对win

    2024年02月05日
    浏览(15)
  • qt怎么一个程序显示两个窗口

    qt怎么一个程序显示两个窗口

    首先我们要把.ui文件的QMainWindow改成QDialog(用记事本)  然后把.ui对应的头文件和.cpp 出现QMainWindow改成QDialog 如图重点其包含头文件定义也记得修改    然后非模态显示,才不堵塞主窗口

    2024年02月12日
    浏览(15)
  • 我们的第一个 Qt 窗口程序

    我们的第一个 Qt 窗口程序

    Qt 入门实战教程(目录) Windows Qt 5.12.10下载与安装 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境,也不需要你再在Visual Studio 2022中安装Qt VS Tools这样的插件。 目的就是为了能够让你可以更快的把Q

    2024年02月11日
    浏览(11)
  • windows下 java程序无窗口启动、无窗口启动java -jar

    方式一: javaw -jar yourJarFile.jar 如果在使用 javaw -jar yourJarFile.jar 启动时仍然出现了命令行窗口,这可能是由于你的 JAR 文件中存在控制台输出。即使使用 javaw 启动器,如果 JAR 文件中有输出到标准输出流(System.out)的操作,它也会弹出命令行窗口来显示这些输出 方式二: 创建

    2024年02月13日
    浏览(9)
  • 【Python】实现一个类似于Glass2k的Windows窗口透明化软件

    【Python】实现一个类似于Glass2k的Windows窗口透明化软件

            网上看到一款Windows下的窗口透明化工具Glass2k(Glass2k官网),可以简单地通过快捷键实现任意窗口的透明化,还挺方便的,想用Python自己实现一下类似的功能。          软件已经开源到 :窗口透明化小工具开源地址         效果图如下:         工具包含以

    2024年02月22日
    浏览(8)
  • UNIAPP(小程序)每十个文章中间一个广告

    UNIAPP(小程序)每十个文章中间一个广告

     三十秒刷新一次广告 ad-intervals=\\\"30\\\"

    2024年04月09日
    浏览(10)
  • [QT]设置程序仅打开一个,再打开就唤醒已打开程序的窗口

    [QT]设置程序仅打开一个,再打开就唤醒已打开程序的窗口

    需求:speedcrunch 这个软件是开源的计算器软件。配合launch类软件使用时,忘记关闭就经常很多窗口,强迫症,从网上搜索对版本进行了修改。 差异图下图: findwindow的方法需要添加user32的库,因为speedcrunch已经添加,则在编译文件中未改动。  效果:  

    2024年02月10日
    浏览(30)
  • 真正理解微软Windows程序运行机制——窗口机制(第二部分)

    真正理解微软Windows程序运行机制——窗口机制(第二部分)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解。其实这没什么,我在学生时代也被这个问题困绕过。而且那个时间学习资料没有那么丰富,网上也

    2023年04月11日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包