Win32 Application 、Win32 Console Application、MFC工程项目

2023-10-27


Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序。
Win32  Application 是标准 windows程序, 完全拥有windows的特性,也即我们常说的窗口应用程序!它通过GUI(Graphics User Interface图形 用户接口)可以把窗口界面做得比较个性化,比如圆形的、不规则形状的等等,另外,我们还可以通过鼠标点击来完成控制。所以说它是基于WINDOWS平台的32位 开发环境开发应用程序(即,SDK程序)。 入口函数为WinMain()
Win32 Console Application(win32控制台应用程序)往往是像MS-DOS窗口(XP中叫 命令提示符)的样子出现,我们得用键盘输入各种命令来使用它,它与纯dos程序区别是:它是32位的;或者叫CUI(Character User Interface字符 用户接口)。 console程序以main()为入口,可以访问部分windows API函数,比如创建窗口、对话框等等。
一个是控制台应用程序,一个是window应用程序,不同的两种。
控制台应用程序:
入口函数为main,一般写C和C++计算类代码常用,如计算水仙花数、冒泡排序等一类程序。程序运行结果以命令行窗口显示。
window应用程序:
入口函数为WinMain,一般用于写桌面应用程序,强大之处在于能够作出用户操作界面,并与操作系统配合捕获并响应用户的各种操作,如鼠标移动、按钮点击等。常用来和数据库结合做管理系统,如财务管理系统等,当然,这类系统一般用MFC做较为容易。


1.EXE文件本身有区别:在文件头里(PE头)有一个标记表明该文件是Application还是Console
2.OS在创建对应的进程时,如果是Console,除了载入文件映像并开启进程外(这一点和Application相同),同时创建一个Console对象(就是那个黑黑的窗口)与之关联,而且这种关联是可以编程脱开的.
除此以外,就没什么区别了,在Console程序里调用相应的API也可以创建窗口,对话框什么的 
很多VC初学者可能会常遇到如下链接错误: 
Linking... /subsystem:windows 
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 


Debug/TestWin.exe : fatal error LNK1120: 1 unresolved externals 
Error executing link.exe. 


解决方法是:将project-settings-link的project options里的 


/subsystem:windows 
改成 
/subsystem:console 


原因:Win32 Application的入口函数为WinMain 
Win32 Console Application的入口函数是main 


换句话说,如果你编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,于是上面提及的链接错误就就经常出现了 
而Win32 Application和Win32 Console的区别就在于VC里链接参数不同
对于这两种程序VC里面有专门的设置对应
打开project-setting,c/c++选项卡中Category选General,下面就会有Preprocessor definetions一项,里面有_WINDOWS或者_CONSOLE。然后再看Link选项卡,Category同样选General,在下面的Project Options里就会有/subsystem:windows或者/subsystem:console。
运行Win32 Console Application一定要把这两个地方改成console,不然编译出错。
同理Win32 Application要把两个地方改成windows。
Win32 API是 微软的操作系统Windows提供给开发人员的编程接口,它决定了我们开发的Windows应用程序的能力。MFC是微软为开发人员提供的类库, 在某种意义上是对Win32 API的封装
关于MFC和Win32的比较的深入研究。
  从数据结构上比较
  MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;
  Windows Object是Windows系统的内部结构,通过一个句柄来引用;
  MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。
从层次上讲比较
  MFC Object是高层的,Windows Object是低层的;
  MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。
  从创建上比较
  MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。
  MFC中,使用这些MFC Object,一般分两步:
  首先,创建一个MFC Object,或者在STACK中创建,或者在HEAP中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。
  然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。
 从转换上比较
  可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。
  可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。
 从使用范围上比较
  MFC Object对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。
  对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。
从销毁上比较
  MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。
  设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放

MFC由于它的易用性,往往被误认为VC++开发必须使用MFC。其实MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32程序设计.
Win32 Application 就是普通常见的窗口应用程序,有自己的界面,即GUI,我们可以通过鼠标操作来完成控制。程序以WinMain为入口,能够使用win32 API函数。
Win32应用程序编程
与MFC的主要不同点是, MFC主要用C++语言,而Win32应用程序大多数使用C语言。所以MFC应用程序可以更多地使用CWnd,CButton等操作窗口,而Win32应用程序主要使用窗口句柄,调用窗口的函数操作窗口。
常用函数介绍
1/WNDCLASSEX结构体


进入WinMain()时,首先得注册窗口类。当注册窗口时,可以填写WNDCLASSEX结构设置窗口的一般信息.
WNDCLASSEX结构体祥见 msdn
其中最重要的成员 WNDPROC  lpfnWndProc 和 LPCTSTR lpszClassName.


每一个窗口类必须有一个窗口过程,当Windows把属于特定窗口的消息发送给该窗口时,该窗口的窗口类负责处理所有的消息,加入消息处理的过程。


窗口消息处理回调函数的声明:
LRESULT  CALLBACK MainWndProc( HWND hWnd, UNIT nMessage, WPARAM wParam, LPARAM lParam )
hWnd: 窗口句柄
nMessage: 传递给hWnd窗口的消息ID
wParam: 消息参数
lParam: 消息参数


2/函数GetMessage
从调用的线程的消息队列中取得一个消息并将期限放于指定的结构体中。此函数可取得与指定窗口联系的消息和由PostThreadMessage寄送的线程消息。
BOOL GetMessage(LPMSG lpMsg,  HWND hWnd, UNIT wMsgFilterMin UNIT wMsgFilterMax);
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。
3/TranslateMessage函数功能:该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。


4/DispatchMessag函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数,然后处理消息。




Win32应用程序解读:
首先注册窗口类,再创建窗口,然后显示窗口,进入接收消息循环,软换消息,将转换的消息分发给窗口程序
见附件程序 Win32App文件夹




常见消息处理
在MainWndProc函数中添加以下代码:


case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
HFONT hFont, hOldFont;
TCHAR szText[]=_T("Windows 32 Application Demo.");


hdc=BeginPaint(hWnd, &ps);
SetTextColor(hdc, RGB(255,0,0));
hFont=(HFONT)GetStockObject(ANSI_FIXED_FONT);
hOldFont=(HFONT)SelecdtObject(hDC,hFont);
TextOut(hdc, 10,10,szText, wcslen(szText));
SelectObject(hdc,hOldFont);

break;


case WM_KEYDOWN:
if( wParam== VK_ESCAPE){
PostQuitMessage(0);
}
break;


....
Win32中加入控件
step 1:
在Win32App.cpp文件中的 #include "stdafx.h"下面加入如下变量声明
HWND m_hEdintWnd;  //文本编辑框句柄
HWND m_hButton;   //按钮窗口句柄
HINSTANCE m_hInstance;  //实例句柄
UNIT nButtonID=2011 //指定按钮的ID


step 2:
在WinMain()中加入代码: m_hInstance=hInstance;


step 3:
在主窗口的消息处理函数MainWndProc中的 WM_CREATE消息中加入创建一个编辑框和一个按钮控件的代码.然后在WM_COMMAND消息中加入处理按钮单击的消息。
case WM_CREATE:

m_hEditWnd=CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE,0,0,0,0, hWnd, NULL, m_hInstance, NULL);
m_Button=CreateWindow("BUTTON", "单击", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 0,0,0,0 
hWnd, (HMENU)nButtonID, m_hInstance, NULL);


SetWindowText(m_hEditWnd, "Win32 App Demo.");
break;


case WM_COMMAND:
if( wParam== nButtonID ){
char szStr[100];
GetWindowText( m_hEditWnd, szStr, 98);
MessageBox(hWnd, szStr, "编辑框内容",MB_OK);
}
break;




Win32中加入对话框:...


Win32中加入菜单: ...  




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32 Application 、Win32 Console Application、MFC工程项目 的相关文章

  • 如何在基于 MFC 对话框的应用程序中捕获复选框的 MouseMove 事件?

    我的应用程序是一个基于 VC6 MFC 对话框的应用程序 具有多个属性页 我必须捕获控件上的鼠标移动事件 例如复选框 如何捕获 MFC 中复选框上的 mousemove 事件 复选框是一个按钮控件 例如 CWnd 从 CCheckBox 派
  • MFC和ATL之间的根本区别是什么?

    假设我是only将它们用于 普通 GUI 程序 没有 COM 没有 ActiveX 没什么花哨的 我将看到 ATL 和 MFC 之间的根本区别是什么 以帮助我弄清楚使用哪一个 我在网上做了一些搜索 但最终没有一个答案真正回答了我的问题 ht
  • 调试 MFC:“mfc100.dll”找不到或打开 pdb

    我正在尝试在调试时进入 MFC 源代码 但是 Visual Studio 显然在加载适当的符号时遇到问题 C WINDOWS symbols dll mfc100 i386 pdb PDB 与图像不匹配 我检查了其他问题 通常建议启用 符号
  • Visual Studio 无法识别我的网络摄像头激光测距仪代码的 MFC 库

    我尝试直接从互联网复制源代码 但由于下面发现的错误 我无法构建 调试整个文件 请帮忙 Error occurred while restoring NuGet packages System ArgumentException The pa
  • 同时显示同一文档的多个视图

    如何说服 MFC 文档 视图体系结构让我同时显示同一文档的两个不同视图 例如 说我的CDocument子类代表某种描述的档案 我想要一个用户界面 其中该存档中的所有条目的名称都显示在CListView子类显示在左侧窗格中 而当前所选条目的详
  • MFC winMain 如何最终进入可执行文件?

    In MFC wWinMain定义于appmodul cpp 据我所知 该文件内置于 mfc90ud dll 中 但是 当我运行我的应用程序时 调用堆栈显示MyApplication exe wWinMain 它是如何采取的wWinMain
  • VC++中如何判断链接是否存在?

    我有一个链接 我已通过正则表达式检查该链接是否是有效的 URL 现在 我想检查该链接是否是有效的 http 链接 即它不应该是不存在的链接 VC 6 0 MFC 有办法检查吗 一种选择是尝试使用以下方法从该 URL 获取数据URLOpenB
  • CloseWindow和WM_CLOSE有什么关系

    我现在有点困惑 是吗 WM CLOSE http msdn microsoft com en us library windows desktop ms632617 28v vs 85 29 aspx and CloseWindow htt
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • MFC 控件上的文本 - Unicode 字符(例如日语)被截断

    背景 我正在开发一个 C MFC 应用程序 我们已经将其转换为显示 unicode 字符以支持外语 在大多数情况下 这是成功的并且 unicode 字符显示正确 但我遇到了一个问题 某些控件上的某些文本被截断 Example 在这里 您可以
  • 当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

    我有一个处理 WM NCLBUTTONUP 消息的窗口 以便处理标题栏中自定义按钮的点击 当窗口最大化时 这非常有效 但当窗口未最大化时 WM NCLBUTTONUP 消息永远不会到达 不过我确实收到了 WM NCLBUTTONDOWN 消
  • MFC:如何在一个函数中捕获对话框每个控件的设置焦点

    我有 n 个对话框 它们具有相同的基本对话框 每个对话框都有自己的控件 编辑框 组合框 列表控件 etc 在基本对话框中 如何设置每个控件的焦点消息 例如 给出一个消息框 text Hello I got focus my ID is d
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 错误 C2248: 'CObject::CObject' : 无法访问类 'CObject' afxwin.h 中声明的私有成员

    我试图让班级负责在灰色背景上放置一些文本 Score h pragma once class Score public Score Score void UpdateScore int points void UpdateLives int
  • 如何通过MFC将应用程序设置保存到注册表中?

    我有一个由 MFC 项目向导创建的 MFC 应用程序 我想在注册表中保存 读取应用程序设置 所以问了这个question https stackoverflow com questions 1880275 good c registry w
  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • 如何在 MFC 中创建带圆角的进度控件?

    我需要在 MFC 应用程序中创建一个带圆角的进度条 我尝试过使用 CreateRoundRectRgn 和 SetWindowRgn 的组合 它具有使控件完全消失的效果 我还尝试使用透明的 GIF 覆盖层 该覆盖层将绘制在进度栏的顶部 但我
  • 发送WM_SETTEXT时如何避免EN_CHANGE通知?

    我有一个 CEdit 派生控件 当基本数据为空时 该控件显示字符串 N A 我最近添加了代码 以在控件获得焦点时清空控件 SetWindowText 并在用户离开焦点时将其设置回 N A SetWindowText N A 控空 唯一的问题
  • MFC 中位图背景绘制的线程类型

    我有一个 MFC 文档 视图 C 图形应用程序 它将所有绘图都绘制到离屏位图 然后将其复制到 OnDraw 方法中提供的 CDC 指针 在过去的几天里 我一直在寻找将绘图组件放置在单独的工作线程中 这样它就不会停止 GUI 当我执行此操作时

随机推荐

  • JAVA中的DO、DTO、BO、AO、VO、POJO

    定义 DO Data Object 与数据库表结构一一对应 通过DAO层向上传输数据源对象 DTO Data Transfer Object 数据传输对象 Service或Manager向外传输的对象 BO Business Object
  • springboot整合springcloud进行Eureka注册及解决springcloud导包出现unknown问题

    1 什么是Spring Cloud Spring提供了一系列工具 可以帮助开发人员迅速搭建分布式系统中的公共组件 比如 配置管理 服务发现 断路器 智能路由 微代理 控制总线 一次性令牌 全局锁 主节点选举 分布式session 集群状态
  • 微软关闭交互式服务器,不允许交互式登录 - Windows Server

    域控制器不允许交互式登录 显示错误 服务器上安全数据库没有此工作站信任关系的计算机帐户 09 23 2020 本文内容 本文提供了域控制器不允许交互式登录时发生的错误的解决方案 适用于 Windows Server 2012R2 Windo
  • Eclipse中的maven项目打war包

    在对应的pom文件中 找到packing这个属性 改为war 如果没有 就自己加一个 这个是有默认值的 默认为jar 例如
  • 【收藏】什么是API测试?这是我见过的最全的测试指南!

    在最近的部署中 当我被问到 什么是API测试 时 我正与客户一起制定API测试策略 那时我突然意识到 要描述API测试居然是一件如此具有挑战性的事情 即使你如实地描述了它 也往往听起来很无聊和复杂 好吧 容我在这里告诉你 API测试并不乏味
  • JDBC连接到Oracle数据库的小demo

    import java sql Connection import java sql DriverManager import java sql PreparedStatement import java sql ResultSet imp
  • char在struct中到底占几个字节!!

    struct student char a int c short b printf d n sizeof struct student 这时char所给分配的是4个字节 因为int占4个字节 struct student char a s
  • STM32运行Rust测量温湿度海拔和气压

    条件 安装了 Rust 工具链的电脑 我只运行 Linux 但以下可能也可以在 MacOS 上运行 甚至可能在 Windows 上运行 带有 STM32F103 微控制器的电路板 这种控制器最常见的开发板可能是 BluePills 一个编程
  • Android开发中的单位换算

    dp density independent pixels dip device independent pixels 都是指抽象像素 用来适配不同屏幕 sp scale independent pixels 是安卓字体单位 ppi pix
  • lv5 嵌入式开发-1 进程的创建和回收

    目录 1 进程概念 2 进程内容 3 进程类型 4 进程状态 5 查看进程信息 5 1 相关命令ps top proc 5 2 相关命令 nice renice 5 3 相关命令job bg fg 6 子进程概念 7 子进程创建 fork
  • 终于等到你,强大的百度云AI智能小助手可以预约申请内测了……!

    今天打开百度网盘 直接看到一个这么可爱的 云一朵 原来是百度智能小助手来了 或者你也可能会在右上角看到 云一朵 的图标 于是我赶紧申请预约 申请页面有功能演示 咱们可以看到 这个智能小助手工具非常强大 你可以对 云一朵 说 帮我找一下去年聚
  • 华擎服务器主板 稳定性,【华擎X570 Steel Legend主板使用总结】设置

    华擎X570 Steel Legend主板使用总结 设置 性能 华擎主板的BIOS设置与华硕主板有较大的不同 华擎X570 Steel Legend主板BIOS中所有的超频选项都集中在 超频工具 子菜单中 如果想超频的话 可以把 Volta
  • 优化Webpack打包流程:打包完成后再删除旧文件,确保网站访问稳定

    前言 想法源于某个基于 vue cli 的实际项目的部署方式是在服务器拉取最新代码 在服务器本地打包 三种打包对比 webpack 本身并不会自动删除旧的打包文件 vue cli 在打包前会直接清空输出目录 vite 打包过程不会直接删除输
  • 平衡二叉树的删除

    平衡二叉树的删除 平衡二叉树的删除 平衡二叉树删除节点的三种情况 删除叶子节点 被删的结点只有左子树或只有右子树 被删的结点既有左子树又有右子树 网上关于平衡二叉树的删除操作 实在太少了 找到了一遍好文章 特转载到CSDN 当做笔记 平衡二
  • 二叉树的前、中、后、层次非递归遍历(js)

    有如下二叉树 遍历 前序遍历 head left right function HLR tree const stack res if tree stack push tree while stack length const cur st
  • 多媒体笔记第二章

    第2章 数字声音及MIDI简介 知识点 一 声音的几个概念 1 声音的强弱 声波压力大小 2 音调的高低 声音频率 3 声音的信号 复合信号 分量信号 二 两个参数 频率和幅度 1 人能够听到的是20 20 000Hz 0 120dB 2
  • Expected isFloatingType(grads[i].type().scalarType()) to be true, but got false.

    错误原因 在进行 张量 梯度求解时 传入数据类型不对 解决方法 指定传入张量类型为 float 类型即可 错误代码示例 import torch 第一步 创建 tensor x torch ones 2 2 requires grad Tr
  • latex学习笔记——latex的字体字号设置

    字体属性 一 字体编码 正文字体编码 OT1 T1 EU1等 数学字体编码 OML OMS OMX等 二 字体族 罗马字体 笔画起始处有装饰 无衬线字体 笔画起始处无装饰 打字机字体 每个字符宽度相同 又称等宽字体 三 字体体系 粗细 宽度
  • 【读书笔记】好好学习-个人知识管理精进指南

    文章目录 引言 什么是知识 第一章 知识管理与认知优势 在海量信息即时获取时代 我们拼什么 如何提升认知深度 为什么大多数人的学习层次上不去 到底哪些知识值得学 第二章 掌握临界知识的底层思维与方法 跳出 低水平勤奋陷阱 学习临界知识需要具
  • Win32 Application 、Win32 Console Application、MFC工程项目

    Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序 Win32 Application 是标准 windows程序 完全拥有windows的特性 也即我们常说的窗