新版Win32高级编程教程-学习笔记01:应用程序分类

news2024/11/27 18:42:44

互联网行业 算法研发工程师

目录

新版Win32高级编程教程-学习笔记01:应用程序分类

控制台程序

强烈注意

窗口程序

启动项

程序入口函数

库程序

静态库

动态库程序

几种应用程序的区别

控制台程序

本身没有窗口,其中的doc窗口,是管操作系统借来的【操作系统会预留一个doc窗口】。

就会出现解决方案的查看器【小窗口一开始是空白的】:

注意:解决方案只有一个,但是项目,会有很多。

为解决方案添加项目

为项目先添加一个源文件cpp

代码编写完成后,点击绿色小三角,就会进行:编译,链接,运行。

点击后,就会出现一个doc窗口【从操作系统借来的】,并输出 hello world。

然后,操作系统会回收这个doc窗口。

修改代码:

#include <stdio.h>
int main() {
	printf("hello world\n");
	getchar();
	return 0;
}

控制台程序,就相当于linux里的终端窗口程序【本身也是dos窗口】。

强烈注意

一个解决方案下可能有多个项目,所有项目的最终文件,都会【默认】生成在解决方案的同级目录下,虽然可以修改,但是一般我们不修改。

窗口程序

拥有自己的窗口,可以和用户交互。

这是我们课程的重中之重!!!

我们会自己用代码制作一个窗口。

// WindowsProject1.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include "WindowsProject1.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: 在此处放置代码。

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT1));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT1));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT1);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: 在此处添加使用 hdc 的任何绘图代码...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

启动项

一个解决方案中,可以有很多项目,但是启动项只能有一个。

因为,当我们点击亮绿色小三角,可以看到,还是运行了刚才那个控制台程序。

那么哪个是启动项呢?

加粗加黑的那个项目!!!在一个解决方案中,默认的启动项目,是第一个创建的那个项目,就是启动项。

如何设置其他项目为启动项呢?

然后,再次启动。就会看到,一个界面,因此,默认生成的cpp代码【180多行代码】,就是做了这样一件事!!!

程序入口函数

程序入口函数在哪呢?

wWinMain函数,是Windows应用程序的标准入口点,用于初始化应用程序,注册窗口类,创建和显示窗口,同时包含消息循环以处理用户输入和其他事件。

但是,为啥win32的窗口程序入口函数怎么是_tWinMain呢?如下图:

其实,_tWinMain不是一个函数名,是一个宏!它代换的内容,才是真正的函数名。

我们可以先把项目-属性-高级-字符集,从”unicode“修改为”多字节“。

注意:以后,我们通通使用多字节字符集。

如果我们想看入口函数的真正名字,就这样操作:

转到定义。

就会发现,是WinMain()。

可以看到,生成的应用程序,也在解决方案下的debug目录下。

库程序

windows下的库程序,和linux下的库程序,原理上,是没有什么区别的!但是,实现的细节上,有一些差别!

他们的作用都是:存放代码,数据的程序,以供其他程序去使用。

如果你写一个程序,调用静态库的程序,静态库的源码,会直接嵌入到你的程序中。

如果你写一个程序,调用动态库的程序,动态库的源码,并不会直接嵌入到你的程序中,你的程序中,记录的仅仅是一个地址而已。通过地址去找动态库里的函数。

在windows中,静态库后缀lib,linux中,后缀是a。

在windows中,动态库后缀dll,linux中,后缀是so。

静态库

根据如下代码,可以知道:静态库程序,没有入口函数!否则,他会给我生成!如果一个程序,没有入口函数,就没有办法执行。就意味着,这个程序最终生成的问文件(lib),无法进入内存。

如果我们非要点击运行,就会报错!

但是,最终生成的lib文件是存在的!

注意,一个程序没有入口,并不妨碍它编译和链接!

exe可以启动,他能进入内存。双击一个exe,第一件事,就是:系统 会把文件打开,会把文件里的内容加载到内存。

因此,lib文件就是彻底死在了硬盘上了,他一直在等着别的程序来调用。

动态库程序

将其设为启动项。

dllmain.cpp如下:

可以看到:DllMain。这就是动态库程序的入口函数。它生成的最终文件可以进入内存。

那么,我们编译,链接,运行,看看能不能运行起来?

可以看到是报错了。为啥呢?

这是因为,动态库程序,不能独立运行,必须依附于其他程序,才可以执行!

注意:dll文件,能进内存。

几种应用程序的区别

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

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

相关文章

大数据之——VWare、Ubuntu、CentOs、Hadoop安装配置

前言&#xff1a;这里很抱歉前几期考研专题以及PyTorch这些内容都没有更新&#xff0c;并不是没有在学了&#xff0c;而是事太鸡儿多了&#xff0c;前不久刚刚打完华为开发者比赛&#xff0c;然后有紧接着高数比赛、考研复习&#xff0c;因此这些后续文章都在草稿状态中&#x…

yolov8-melodic-cam-anconda环境配置及目标检测

1、基础环境安装 安装配置cuda、Anconda等环境&#xff0c;具体安装参考如下&#xff1a; https://blog.csdn.net/weixin_45702256/article/details/142555187 2、torch安装 下载链接&#xff1a;https://pytorch.org/ 根据配置下载对应版本&#xff0c;CUDA11.4 可用11.3下…

【c数据结构】队列详解!(模拟实现、OJ练习实操)

队列的概念 队列就像排队&#xff0c;先进先出&#xff0c;zz先到先得&#xff08;队头的人先出去&#xff0c;队尾的人排在最后出去&#xff09; 对比栈 队列示意图 概念&#xff1a;只允许在⼀端进⾏插⼊数据操作&#xff0c;在另⼀端进⾏删除数据操作的特殊线性表&#xff…

68 Netty

68 Netty 参考资料 【硬核】肝了一月的Netty知识点 概念 Netty 是一个高性能、异步事件驱动的网络应用框架&#xff0c;简化了 Java 网络编程&#xff0c;适用于构建高效、可扩展的网络服务器和客户端。 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架&#xff0c;使…

访问远程桌面或共享文件夹,输入正确凭证,但提示登录没有成功或者用户名密码不正确

可以在目标机器试试以下方法&#xff1a; winR 打开 "gpedit.msc" 本地组策略编辑器&#xff0c;导航到 计算机配置 > Widnows 设置 > 安全设置 > 本地策略 > 安全选项 找到 网络访问&#xff1a;本地账户的共享和安全模型&#xff0c;把 仅来宾 改为 …

介绍各种编程语言

记得点个赞再看哦 常见的编程语言 在当今的计算机编程领域&#xff0c;有许多种编程语言&#xff0c;以下是一些常见的编程语言&#xff1a; Python&#xff1a;是一种代表简单思想的语言&#xff0c;具有极其简单的语法&#xff0c;是FLOSS&#xff08;自由/开放源码软件&…

简单解析由于找不到xinput1_3.dll,无法继续执行代码的详细解决方法

电脑上突然跳出“由于找不到xinput1_3.dll&#xff0c;无法继续执行代码”的提示&#xff0c;这着实令人心烦&#xff0c;特别是当你正着急使用相关软件或者程序的时候。别担心&#xff0c;其实有五种科学有效的解决办法。大家得清楚&#xff0c;xinput1_3.dll是一个在众多软件…

快速总结HAT

HAT&#xff1a;Activating More Pixels in Image Super-Resolution Transformer 图像恢复(Image restoration)是计算机视觉中的一个经典问题&#xff0c;它的目的是从给定的低质量&#xff08;LQ&#xff09;输入重建高质量&#xff08;HQ&#xff09;图像。 在SwinIR基础上…

Codeforces 977 Div2 A-B

课上找空做了 A 原题 A. Meaning Mean 思路 贪心即可 代码 #include <bits/stdc.h> #define int long long using namespace std;const int N 110;int n, m, k, x, y, z; int w[N], f[N];void solve() {cin >> n;for (int i 1; i < n; i )cin >>…

理解计算机系统_程序的机器级表示(特别篇):对比move和leaq看汇编语言中数据的传递,变量和指针的映射,指针的实现

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 汇编代码传递数据的机制令人费解.而这部分内容又是比较基础的,需要…

自适应气泡小计

View 代码 <div class"mas-view"><div class"m-2"><span>新新消息消新消息消息新消息新消息新消息新消息新消息新消息新消息新消息新息</span></div></div>CSS 样式 .mas-view{width: 100%;height: auto;border: 1px…

[M数学] lc3164. 优质数对的总数 II(因数分解+倍增+推公式+思维+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;3164. 优质数对的总数 II 2. 题目解析 挺不错的一道 因数分解、倍增 的题目&#xff0c;需要一定的思维和推公式的能力才能解决。灵神的题解已经非常清晰易懂了&#xff0c;可以直接去看。 倍增思路&#xff…

Kafka 消费者位置提交方式及适用场景

在使用 Kafka 进行消息处理时&#xff0c;消费者的位置提交是一个非常重要的环节。它决定了消费者在下次启动时从哪里开始读取消息。今天&#xff0c;我们就来深入探讨一下 Kafka 消费者位置提交方式有哪些&#xff0c;以及在什么场景下使用。 一、Kafka 消费者位置提交的重要…

Linux的zookeeper安装部署

1.zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和HBASE的重要组件 2.下载zookeeper安装包zookeeper安装包https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/ 移动到Linux解压 解压到/export/server文件夹 命令: tar -xvf apache-zooke…

《Linux从小白到高手》综合应用篇:详解Linux系统调优之内存优化

本篇介绍Linux服务器系统内存调优。 内存是影响Linux性能的主要因素之一&#xff0c;内存资源的充足与否直接影响应用系统的使用性能。内存调优的主要目标是合理分配和利用内存资源&#xff0c;减少内存浪费&#xff0c;提高内存利用率&#xff0c;从而提升系统整体性能。 1.内…

选择智能工单系统的理由,功能与效益分析

智能工单管理系统提升企业客户服务效率和质量&#xff0c;具备多渠道接收、智能分配、自动化处理等功能。ZohoDesk等系统通过实时响应、数据分析等优化服务流程&#xff0c;成为企业提升竞争力的关键工具。 一、智能工单管理系统的概念与优势 1. 智能工单管理系统概念 智能工…

【三】【算法】P1007 独木桥,P1012 [NOIP1998 提高组] 拼数,P1019 [NOIP2000 提高组] 单词接龙

P1007 独木桥 独木桥 题目背景 战争已经进入到紧要时间。你是运输小队长&#xff0c;正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激&#xff0c;于是命令你的士兵们到前方的一座独木桥上欣赏风景&#xff0c;而你留在桥下欣赏士兵们。士兵们十分愤…

H3C GRE VPN基本配置实验

H3C GRE VPN基本配置实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址在 R1 和 R3 上配置默认路由使公网区域互通在 R1 和 R3 上配置 GRE VPN&#xff0c;使两端私网能够互相访问&#xff0c;Tunnel 口 IP 地址如图在 R1 和 R3 上配置动态路由协议来传递两端私网路由 实…

盘点2024年双十一最值得入手的好物,双十一必买清单大汇总

随着科技的飞速发展&#xff0c;数码产品已成为我们生活中不可或缺的伙伴。2024年双十一购物狂欢节即将来临&#xff0c;众多消费者早已摩拳擦掌&#xff0c;准备在这个年度盛事中淘到心仪的数码好物。在这个信息爆炸的时代&#xff0c;如何从琳琅满目的商品中挑选出性价比高、…

项目管理系统介绍,核心概念与操作技巧

项目管理系统通过分解任务、管理工时、规划项目等提升效率&#xff0c;支持多种使用场景&#xff0c;具备高度可定制性&#xff0c;适合不同用户群体&#xff0c;注重数据安全&#xff0c;能与其他软件集成。ZohoProjects因全面功能、低价和友好界面受中小企业青睐。 一、项目管…