序言

记得刚学习C语言的时候,我还只能写出在“小黑框”里面运行的控制台程序。后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而我们经常看到的比如QQ、酷我音乐、各种浏览器软件都是图形用户界面(GUI,Graphical User Interface)。我当时就很好奇那些漂亮的桌面软件是如何创建出来的。但是苦于课业的繁忙,我只能利用课余的时间来了解一些关于GUI的编程信息,也就渐渐地接触到了Windows编程。
Windows编程历史悠久,从上个世纪八十年代DOS系统诞生以来,它的编程范式随着Windows的进化而进化。最初,我们只是编写简单的bat脚本命令来操作电脑。Windows的诞生,让DOS程序员见识到了GUI的魅力,越来越多的人都加入进来。

什么是窗口

我们要进行Windows编程,首先要明白什么是窗口。简单来讲,窗口就是一块区域,我们可以在上面进行绘制显示操作,将我们的UI逻辑显示出来。Windows本身就是一个窗口管理系统,桌面本身就是一个窗口。我们进行界面编程的第一步就是创建一个窗口。

创建窗口

编写主函数

首先,我们需要定义wWinMain函数作为入口点

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{......return 0;
}

注册窗口类

第一步,我们需要注册窗口类。首先填写WNDCLASS或者WNDCLASSEX结构。这个结构体配置了窗口的全局属性,比如ICON图标,鼠标的样式,窗口背景色、窗口的过程函数等等。它的成员不必要全部填写。

WNDCLASSEX wc = { sizeof(WNDCLASSEX) };
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
wc.lpszMenuName = nullptr;
wc.lpszClassName = TEXT("MainWindow");RegisterClassEx(&wc);

然后调用RegisterClassEx函数,完成窗口类的注册

创建窗口

窗口类注册完成以后我们就可以调用CreateWindow(Ex)函数来创建窗口了

HWND hWnd = CreateWindowEx(0,                        //扩展窗口风格,暂时设为0wc.lpszClassName,         //已注册的窗口类名称TEXT("Hello Windows"),    //窗口的标题dwStyle,                  //窗口的风格CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,            //窗口的位置信息nullptr, nullptr, nullptr, nullptr);ShowWindow(hWnd, SW_SHOWDEFAULT);//显示窗口

进入消息循环

MSG msg = {};
while(GetMessage(&msg, nullptr, 0, 0))
{TranslateMessage(&msg);DispatchMessage(&msg);
}return static_cast<int>(msg.wParam);

这样窗口就成功创建了。

完整代码

#include <Windows.h>// 如果创建的项目类型是“控制台应用程序”,可以添加下面两条预编译指令
// 第一条的意思是程序入口点是wWinMainCRTStartup函数,这样我们就可以使用wWinMain函数替代常见的main函数
// 第二条的意思是生成Windows程序,就是不带小黑框的图形界面程序
#pragma comment(linker, "/ENTRY:wWinMainCRTStartup")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS")LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{// 在这里处理所有窗口消息switch (msg){case WM_DESTROY:// 当窗口销毁时退出应用程序PostQuitMessage(0);break;default:return DefWindowProc(hWnd, msg, wParam, lParam);}return 0;
}int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{// 初始化窗口类结构体WNDCLASSEX wc = { sizeof(WNDCLASSEX) };wc.style = CS_VREDRAW | CS_HREDRAW;wc.lpfnWndProc = WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);wc.hCursor = LoadCursor(nullptr, IDC_ARROW);wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));wc.lpszMenuName = nullptr;wc.lpszClassName = TEXT("MainWindow");// 注册窗口类RegisterClassEx(&wc);// 创建窗口并显示窗口HWND hWnd = CreateWindowEx(0, wc.lpszClassName, TEXT("标题"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, nullptr, nullptr);ShowWindow(hWnd, SW_SHOWDEFAULT);// 进入消息循环MSG msg = {};while (GetMessage(&msg, nullptr, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return static_cast<int>(msg.wParam);
}

备注

2021年7月27日:完善示例代码。

Windows编程---使用C/C++语言创建一个窗口相关推荐

  1. Windows编程第一课:纯手工创建一个窗体

    第一节 创建应用程序主窗体 1 创建消息处理函数 LRESULT CALLBACK fWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara ...

  2. Windows API 编程起始——创建一个窗口

    最初了解Windows api编程呢,就是先创建出一个最简洁的窗口,就如我们学习C/C++时的"Helloword"一样,这是进入windows编程大门的重要一个步,下面就开始吧. ...

  3. C语言创建一个节点Node(附完整源码)

    C语言创建一个节点Node 节点结构体定义 C语言创建一个节点Node完整源码 节点结构体定义 struct node {struct node *leftNode;int data;struct n ...

  4. DirectX 创建一个窗口

    #include <d3d9.h>#pragma comment(lib, "d3d9.lib")PDIRECT3D9 g_D3D = nullptr; // D3D对 ...

  5. 用SDL创建一个窗口

     原文来自:http://www.aaroncox.net/tutorials/2dtutorials/sdlwindow.html 注意:这里我们想当然你已经知道怎么在你的IDE集成开发环境里配 ...

  6. 【java】创建一个窗口,统计输入内容

    创建一个窗口,统计输入内容 package p1; import javax.swing.JOptionPane;public class Java_1 {public static void mai ...

  7. 利用GLFW创建一个窗口

    利用GLFW创建一个窗口 创建窗口前的准备工作 GLFW初始化 设置界面属性 界面相关属性 缓冲区相关属性 上下文相关属性 各个属性的默认值和取值范围 创建窗口 显示窗口 完整代码 窗口事件交互 完整 ...

  8. Vulkan学习--5.创建一个窗口表面和交换链

    • 创建一个窗口,窗口表面和交换链 1.检测交换链是否支持 2.启用交换链扩展 3.选择适当的表面格式 4.查找最佳的可用呈现模式 5.设置交换范围 6.创建窗口表面 7.创建交换链 8.查询交换链支 ...

  9. c语言创建一个bat文件内容,BAT(批处理)文件编写详细手册

    <BAT(批处理)文件编写详细手册>由会员分享,可在线阅读,更多相关<BAT(批处理)文件编写详细手册(41页珍藏版)>请在人人文库网上搜索. 1.BAT(批处理)文件编写详细 ...

最新文章

  1. 夜间灯光数据dn值_中国区域DMSP/OLS夜间灯光影像的校正
  2. 《JAVA与模式》之状态模式
  3. MyBatis 插件原理与自定义插件-PageHelper 原理
  4. js获取页面的各种高度与宽度
  5. ZT:利用Google搜索功能来突破封锁下载
  6. [css] 元素竖向的百分比设置是相对容器的高度吗?
  7. 让数据大白于天下:GCC插件实现代码分析和安全审计
  8. 史上最全使用Nexus搭建Maven服务器详细配置
  9. java集合大家族之Map
  10. 利用计算机辅助管理档案说明,计算机辅助档案管理
  11. U盘文件夹为空恢复方法,恢复U盘的空白文件夹
  12. 安装Xcode的方法
  13. 失控的摄像头,谁是窥视者!
  14. 005_软件安装之_常用办公软件
  15. 这才叫高颜值的Markdown编辑神器!
  16. 机器学习——决策树(ID3)的实现
  17. 网易mumu模拟器去广告纯净版 v1.26.1.1
  18. ガラムバレル / 泰坦
  19. http://www.3800hk.com/news/w32/12446.html sa帐号的改名和删除
  20. lepus天兔数据库监控

热门文章

  1. 卫星地图影像数据在城市规划中的应用
  2. 2020西工大c语言程序设计在线作业答案,西工大16秋《C语言程序设计》在线作业答案...
  3. 情绪调节的自适应_自我调节情绪的八种好办法
  4. 黑群晖二合一安装不了套件_【优选产品】Si1133/53光学传感器多功能评估套件
  5. 好玩,诡异,代码大全
  6. Windows自动更新导致蓝屏
  7. Harrison Consoles 软件促销
  8. Win10 + Linux 双系统安装 (Ubuntu 20.04.1 LTS)
  9. 双线机房选择 数据中心托管需谨慎
  10. 对蛋白质引起心脏病反论说的研究