初识win32

news2024/11/14 15:06:51

很多人都说windows编程凉了,实则不然,因为微软不倒,我们还在使用微软提供的winddows操作系统,windows编程就不会消亡,MFC也是一样,不可否认其他编程语言的方便,强大,但是windows编程也有它自己的优势,学习windows编程的人喜欢的就是DLL注入,钩子之类的东西,觉得很装逼

确实,曾经我也因为这个原因而学习这方面的知识,后来,现实打败了我,于是我老老实实的学着Linux内核

首先windows是不开源的,只给你提供了各种API接口,有上万个,但是我们只需要了解常用的就行

Easyx图形库是对windows的封装,使用简单,但也限制了代码的自由度

win32框架

目录

1、注册窗口类    RegisterClassEx

2、创建窗口    CreateWindowEx

3、在桌面显示窗口    ShowWindow

4、更新文本框    UpdateWindow

5、进入消息循环

  • 获取消息    GetMessage

  • 将消息发送到定义的MainWndProc函数处理    DispatchMessage

  • 进入下一个循环

01

创建win32程序

VS2015下创建win32程序

在这一步的时候一般不会去掉空项目上面的√,创建的项目自带win32框架代码,不用自己去码那些重复的代码,但是因为要展现win32框架,加上√后代码太冗杂,容易代码劝退,所以选择空项目。

还有一个原因就是,如果可以,自己码一遍win32的框架,有助于理解和学习

02

编辑代码

 

#include <windows.h>

// 窗口函数的函数原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nCmdShow)
{
    WCHAR szClassName[] = L"MainWClass";//窗口类的名称
    WNDCLASSEX wndclass;

    // 用描述主窗口的参数填充WNDCLASSEX结构
    wndclass.cbSize = sizeof(wndclass); // 结构的大小
    wndclass.style = CS_HREDRAW | CS_VREDRAW;   // 指定如果大小改变就重画
    wndclass.lpfnWndProc = MainWndProc; // 窗口函数指针
    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;       // 不指定菜单
    wndclass.lpszClassName = szClassName;   // 窗口类的名称   
    wndclass.hIconSm = NULL;        // 没有类的小图标

    // 注册这个窗口类
    RegisterClassEx(&wndclass);

    // 创建主窗口
    HWND hwnd = CreateWindowEx(
        0,          // dwExStyle,扩展样式   
        szClassName,        // lpClassName,类名           
        L"My first Window!",    // lpWindowName,标题      
        WS_OVERLAPPEDWINDOW,    // dwStyle,窗口风格 
        CW_USEDEFAULT,      // X,初始 X 坐标        
        CW_USEDEFAULT,      // Y,初始 Y 坐标        
        CW_USEDEFAULT,      // nWidth,宽度            
        CW_USEDEFAULT,      // nHeight,高度           
        NULL,           // hWndParent,父窗口句柄         
        NULL,           // hMenu,菜单句柄       
        hInstance,      // hlnstance,程序实例句柄     
        NULL);          // lpParam,用户数据         

    if (hwnd == NULL)
    {
        MessageBox(NULL, L"创建窗口出错!", L"error", MB_OK);
        return -1;
    }

    // 显示窗口
    ShowWindow(hwnd, nCmdShow);

    //更新这个窗口
    UpdateWindow(hwnd);

    // 从消息堆中取出消息
    MSG msg;
    while (::GetMessage(&msg, NULL, 0, 0))
    {
        // 转化键盘消息
        TranslateMessage(&msg);
        // 将消息发送到相应的窗口函数
        DispatchMessage(&msg);
    }

    // 当GetMessage返回0时程序结束
    return msg.wParam;
}


LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    TCHAR szText[] = L"第一个win32程序!";
    switch (message)
    {
    case WM_PAINT: // 窗口客户区需要重画
    {
        HDC hdc;
        PAINTSTRUCT ps;
        // 使无效的客户区变的有效,并取得设备环境句柄
        hdc = BeginPaint(hwnd, &ps);
        // 显示文字
        TextOut(hdc, 10, 10, szText, wcslen(szText));
        EndPaint(hwnd, &ps);
        return 0;
    }
    case WM_DESTROY: // 正在销毁窗口
        // 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环
        PostQuitMessage(0);
        return 0;
    }
    // 将我们不处理的消息交给系统做默认处理
    return DefWindowProc(hwnd, message, wParam, lParam);

运行结果

这个就是简单地创建了一个win32程序,相比较于Easyx图形库来说,win32简直就是太复杂了

图形库的initgraph();closegraph();就解决了win32近100行的代码,其实也不能怪win32,它只是调用了这几个API函数RegisterClassEx、CreateWindowEx、ShowWindow、UpdateWindow、GetMessage、 DispatchMessage,不过函数的参数太多了而已。

事实也是如此,win32的绝大部分API函数参数都多的离谱。如果一上来就让你接触win32可能绝大部分人都会函数劝退。

而且那些变量自己一个都不认识,怎么搞!其实不是你不认识,只是这些个变量穿了一件外套。

例如:(VS下选中变量右键转到定义)

typedef unsigned int        UINT;

在上面代码中需要注意的是注册的窗口类名必须和创建的窗口类名一致,否则创建窗口失败

例如将注册时的 szClassName 换成 DeRoy ,程序运行会弹出对话框。

然后就是那些函数的参数介绍了,在这里我就不介绍了,因为太多了,我告诉大家一个方法

在VS中,选中要查询的函数或者宏,按F1键,函数介绍和宏的相关信息就会出来了,特别全

例如我选中CS_HREDRAW,按下F1键

弹出界面

全英文看不懂怎么办,我不知道大家用的什么浏览器啊,下载一个翻译插件,

我用的是谷歌浏览器,自带翻译功能

win32就介绍到这里,其他的消息机制,GDI,控件什么的,个人建议

图书馆借本Windows编程的书自己看,图书馆有借阅期限的,想自己买个实体的可以看下这个链接,这本书仅介绍了消息机制,GDI绘图,控件一些基础的东西,然后做了几个小游戏,没有网络编程,钩子,内核之类的,适合入门学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解linux物理内存

目录 物理内存热插拔 从 CPU 角度看物理内存架构 内核如何管理 NUMA 节点 NUMA 节点物理内存区域的划分 NUMA 节点的状态 node_states 物理内存区域中的水位线 物理内存区域中的冷热页 内核如何描述物理内存页 匿名页的反向映射 物理内存热插拔 物理热插拔阶段&#xff…

『赠书活动 | 第十四期』《Spring Cloud Alibaba核心技术与实战案例》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十四期』 本期书籍&#xff1a;《Spring Cloud Alibaba核心技术与实战案例》 公众号赠书&#xff1a;第五期 参与方式&#xff1a;关注公…

【Linux 驱动篇(四)】设备树

文章目录 一、什么是设备树二、DTS、 DTB 和 DTC三、DTS 语法1. .dtsi 头文件2. 设备节点3. 标准属性3.1 compatible 属性3.2 model 属性3.3 status 属性3.4 #address-cells 和#size-cells 属性3.5 reg 属性 ...... 一、什么是设备树 设备树(Device Tree)&#xff0c;将这个词分…

为什么不建议企业用薪资系统来跟踪项目时间?

身处在一个每分钟都很重要的世界里&#xff0c;企业必须勤于管理时间和工资。 虽然使用薪资系统进行时间跟踪似乎是一个实用的解决方案&#xff0c;但这种方法可能导致许多问题。 本文将讨论专用的时间跟踪软件对任何组织都必不可少的原因&#xff0c;以及依靠薪资系统进行时…

推特、微博对手Threads软件的下载、注册、使用最新超详细教程

经过马斯克不断折腾&#xff0c;推特面临用户大量流失的风险&#xff0c;尤其近期限制推文阅读量&#xff0c;更是导致大量用户出走。 于是乎&#xff0c;Meta公司7月6日正式发布对标推特的新社交平台 Threads&#xff0c;当前Threads只能在 iOS、Android 平台上安装 APP 使用&…

【JAVA】爱心代码--java特供(可直接复制,亲测有效)

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言爱心的数学原理爱心代码基本版本带二种 前言 回看过去我发现我的第一篇博客竟然是一篇关于C语言爱心代码的博客&#xff08;真是个奇怪的开始&#xff09;&#xff0c;不过这么长时间过去了&#xff0c;我的编程语…

软件设计模式与体系结构-设计模式-行为型软件设计模式-策略模式

目录 四、策略模式类图代码实例使用策略模式对中国的十二属相&#xff08;Chinese Zodiac&#xff09;设计查询系统。策略模式与状态模式课程作业 四、策略模式 类图 代码 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算…

【Django】Django框架使用指南

Django使用指南 作者简介&#xff1a;嗨~博主目前是长安大学软件工程专硕在读&#x1f4d8;&#xff0c;喜欢钻研一些自己感兴趣的计算机技术&#xff0c;求关注&#x1f609;&#xff01; 框架简介&#xff1a;Django是一个基于Python语言的开源Web应用框架&#xff0c;采用 M…

路径规划算法:基于学生心理学优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于学生心理学优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于学生心理学优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

Django框架-11

聚合查询 1.聚合函数 使用aggregate()过滤器调用聚合函数。聚合函数包括&#xff1a;Avg 平均&#xff0c;Count 数量&#xff0c;Max 最大&#xff0c;Min 最 小&#xff0c;Sum 求和&#xff0c;被定义在django.db.models中。 例&#xff1a;查询图书的总阅读量。 from mo…

数据结构错题集 第七章 查找

7.2 124 等比 1(1-2^h)/(1-2) 2^h - 1 查找失败的最小次数相等吗&#xff1f; 13.A D 推一下公式 &#xff08;M1&#xff09;/2 平均查找长度 17.有序 就可二分查找 记住向下取整就是往右 13题就是个例子 向上取整就是往左 7.3 A错 不会分裂 不是平衡树 12。 C 黑高…

硬件基础——数字电路门电路

门电路与D触发器 一、与门 1.基本定义 与门又称 “与电路”、逻辑“积”、逻辑“与”电路&#xff0c;是执行“与”运算的基本逻辑门电路。有多个输入端&#xff0c;一个输出端。当所有的输入同时为高电平&#xff08;逻辑1&#xff09;时&#xff0c;输出才为高电平&#xf…

服务器进程查询

1. 查看当前正在运行的所有进程 ps -ef &#xff1a;查看当前所有正在运行的进程 UID&#xff1a;真实用户IDPID&#xff1a;进程的 IDPPID&#xff1a;父进程的 PIDCMD&#xff1a;运行当前进程的命令 2. 查看运行当前进程的指令 ps -aux | grep PIDPID表示你需要查询的进…

Linux 学习记录46(QT篇待完成)

Linux 学习记录46(QT篇) 本文目录 Linux 学习记录46(QT篇)一、建立QT项目工程二、1.2. 三、自动生成的文件介绍1. tempprj.pro2. mainwindow.h3. mainwindow.cpp4. main.cpp5. mainwindow.ui 四、常用类的介绍1. 信息调试类(1. qDebug(2. 输出当前界面尺寸(3. 设置当前界面尺寸…

第七章:YOLO v2网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:Mask R-CNN网络详解 第六章:YOLO v1网络详解 第七章:YOLO v2网络详解 第八章:YOLO v3网络详解 文章目录 系列文章目录技…

PYQT QWidget的方法介绍

https://img-blog.csdnimg.cn/bae4318f1a9342ff85c9e7d27652cf91.png

uniapp打包app,对接华为厂商,实现unipush离线消息推送

今天终于可以抽出点时间&#xff0c;来记录一下这几天心塞的心情。上周公司派过来一个活&#xff0c;说是使用uniapp制作一个app&#xff0c;同时要实现在线消息推送和离线消息推送&#xff0c;啥话没说就揽了下来。不过说实在的&#xff0c;从来没有开发过app&#xff0c;好歹…

【网络安全带你练爬虫-100练】第9练:post提交/提取json数据包

目录 一、目标1&#xff1a;post提交json数据包 二、目标2&#xff1a;接收json数据包 三、目标3&#xff1a;提取指定的键值 四、网络安全小圈子 一、目标1&#xff1a;post提交json数据包 &#xff08;大家可以自己随便找一个&#xff0c;像一些登录过的网站刷新一下&am…

jenkins构建历史设置保留数量

jenkins默认保留构建历史所有&#xff0c;这样磁盘空间越来越小&#xff0c;设置保留个数。 进入job项目中-配置 勾选Discard old builds&#xff0c;设置保留天数和个数&#xff0c;可以只填保留个数。 应用保存job配置&#xff0c;并重新构建项目&#xff0c;重新构建完成后…

基于pyqt5+opencv实现16位tif影像转jpg

现在大部分图像软件都支持tiff影像的浏览&#xff0c;但都是仅限于8位的影像&#xff0c;对应CV16U类型的tiff影像并不支持&#xff08;这需要专业的gis软件才可进行操作&#xff09;。为了便捷操作&#xff0c;故此基于pyqt5opencv实现16位tif影像转jpg的软件。 本博文涉及基于…