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

来源:互联网 发布:淘宝店人气 编辑:程序博客网 时间:2024/06/06 00:30

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中加入菜单: ... 
原创粉丝点击