开发者社区> 橘子红了呐> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

为什么要学Win32及Win32程序框架

简介:
+关注继续查看
源代码下载地址:http://www.vczx.com/article/file/20041202141740_vczx_Win32sdk.rar


前言:

  最近在看侯捷的《深入浅出MFC》,在理解MFC时觉得必须要掌握win32,才能更好的理解MFC,才能写出更有用的程序。于是将自己对win32程序的理解写了下来,供朋友们参考。文中的两幅图是从书中截取的。

正文:

  现在有很多想走VC这条路的朋友,一开始就是MFC,虽然啃过一段时间书后,能写出一些小程序,但越往后你就会越觉得困难。我的一个网友昨天跟我聊天的时候说“TMD,MFC用的越来越觉得不爽,早知道开始学VC的时候听朋友之劝,先学Win32编程好了”。的确,MFC把大部分精华都封装起来了,我们只能用它现成的库,或尤其派生出一些自己的库。如果不了解Win32编程,我们就不懂程序的运作原理,那么我们如何操控程序,我们还哪有自主权?

  如果你从来没有在事件驱动(event driven)系统中撰写过以消息为基础(message based)的应用程序,就想一步跨入MFC,直接用Application wizard开发windows程序,我觉得不大可能。虽然你可以继承MFC中的类,来开发出一个颇具规模的windows应用程序,但如果你不了解windows程序的运作本质(event driven,message based ),是不可能进入高深境界的。正如侯大师所言:“勿在浮沙筑高台”,不会走千万别想跑。

  在正式学习MFC之前,需要掌握的东西(个人认为)有:了解windows程序的事件驱动机制(包括消息的产生、捕获、分派和处理等)。另外还有一个比较重要的就是C++中多态(polymorphism)和虚函数的理解(不说精通,起码也得达到熟练)。

  下面简单说一下Win32程序框架。

  一个Win32程序是由程序代码和UI(User Interface)两大部分组成,当我们编辑好这两部分后,再由RC(resource compiler)编译器将这两部分整合成一个EXE文件。程序代码不用说了,UI资源指的是一些如菜单、对话框、位图、鼠标指针、图标等,我们必须在一个.rc文件中描述它们。

  另外,程序要想成功编译运行,还需要加入一些函数库和头文件。Windows程序调用的函数可以分为C Runtimes和Windows API两种,LIBC.LIB是C Runtimes的静态连接版,MSVCRT.LIB是C Runtimes的动态连接版。GDI32.DLL、USER32.DLL和KERNEL32.DLL是32位Windows API的三大函数库。所有的windows程序都要包含windows.h,但windows.h只包含GDI32.DLL、USER32.DLL和KERNEL32.DLL中的函数,如果你还想加入别的dll,就需要加入相应的头文件。下面是win32程序开发的流程:

win32sdk1.png 

  Windows程序的运行是靠外部事件来驱动的,就是说,程序一直出于一个等待的状态,如果有一个事件发生,程序就会判断是什么事件,然后做出相应的处理。那么每一个windows程序都必须有一个回路才能实现一直等待。这个回路如下:

MSG msg;

while( GetMessage( &msg, NULL, 0, 0 ) ){

TranslateMessage( &msg );

DispatchMessage( &msg );

}

MSG结构在windows内部是这样定义的:

typedef struct tagMsg{

HWND hWnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

}MSG;

  其中message就是指各种消息,如WM_MOUSEMOVE、WM_DESTROY等。那么谁来接收这个消息并做出相应处理呢?就是窗口,这就需要我们为窗口设计一个函数,即所谓的窗口函数。窗口函数形如:

LRESULT CALLBACK WndProc( HWND hWnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch ( message ) {

case WM_LBUTTONDOWN:



case WM_MOUSEMOVE:



case WM_DESTROY:

PostQuitMessage ( 0 );

default:

return DefWindowProc ( hWnd, message, wParam, lParam );

}

return ( 0 );

}

  CALLBACK是一种函数调用习惯,被定义为__stdcall,说明此函数为回调函数,由系统自动调用的,当窗口接收到消息并DispatchMessage之后,系统就自动调用窗口函数WndProc了。注意窗口函数中消息的分支结构中default分支必须是return DefWindowProc ( hWnd, message, wParam, lParam );因为不论什么消息都必须被处理,DefWindowProc是windows内部预设的消息处理函数。以上就是windows程序的精要所在,弄懂了这些,才能为学MFC作好准备。Win32程序的运行图解如下:

win32sdk2.png

 那么窗口的产生和显示是怎么实现的呢?下面我们就来生成一个简单的win32SDK窗口,来看一下windows程序是如何把消息获取、分派并处理的,以及写一个win32窗口程序的主要步骤:

一、程序进入点

  windows程序的进入点是WinMain函数,它有四个参数,形式如下:

int WINAPI WinMain ( HINSTANCE hInst,

HINSTANCE hPrevInst,

LPSTR lpCmdLine,

int nCmdShow )


  参数说明:hInst 为当前实例句柄,Windows 环境下用于区别同一应用程序的不同实例;hPrevInst应用程序先前实例的句柄(如果有的话),否则为 NULL,可以用来确定当前实例是否为应用程序的第一个实例;lpCmdLine是以NULL结尾的命令行字符串长指针;nCmdShow指定窗口初始显示方式的整型常量(1 = 通常;7 = 最小化) 。

二、注册窗口类

 一个窗口在建立以前,必须进行一些初始化,比如窗口的大小、标题及边框的颜色等,完成这些工作我们还必须一个API函数RegisterClass来注册窗口类:

WNDCLASS wndclass;

//初始化窗口的属性

…………….

//注册窗口类

if(!RegisterClass(&wndclass))

{

MessageBeep(0);

return FALSE;

}


三、创建窗口

  窗口属性设置好并且注册了窗口类之后,我们就要建立一个窗口了,CreateWindow函数会完成这个工作,如:

hwnd=CreateWindow(

lpszClassName,

lpszTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL);


  建立好窗口之后就要显示窗口了,如下:

  //显示窗口

  ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);


  然后进步消息循环,程序出于一直等待的状态(除非你退出程序)。

//消息循环

while(GetMessage(&Msg,NULL,0,0))

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}


四、窗口函数

  这是窗口的生命中枢,因为它是处理各种消息的地方。上面消息循环中DispatchMessage就是将消息分派到窗口处理函数,窗口处理函数前面已经作了说明,这里不再赘述。

  这样,一个win32窗口程序就写好了,具体详见附加代码。

后记:

  这篇文章根据自己的理解写的,如有不恰当之处,肯请指正。最后,希望这篇文章对大家能有点帮助。更多编程技术文章,请访问我的网站 http://www.vczx.com






   本文转自loose_went博客园博客,原文链接:http://www.cnblogs.com/michaelxu/archive/2006/09/20/509043.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python程序员的30个常见错误
在这篇文章中,我将总结新老Python程序员常犯的一些错误,以帮助你们在自己的工作避免犯同样或类似错误。
1970 0
python实现图片批量剪裁的程序
1 from PIL import Image 2 import os 3 fin = 'D:/test' 4 fout = 'D:/test2' 5 for file in os.listdir(fin): 6 file_fullname = fin + '/' +file 7 img = Image.
1009 0
win32贪吃蛇实现
写程序是一个循序渐进的过程,一开始都是加加减减,修修补补,这和我们做企业做创新的原理都是一样的,没有一蹴而就的成功,最近看了周鸿祎的《我的互联网方法论》蛮有启发,分享给大家几句摘抄: 1.所有的颠覆式创新都不是敲锣打鼓来的,而是隐藏在一片噪声里。
876 0
在非MFC的win 32程序里面能够使用CString类
论坛有会员用到了。,今天给大家说说CSring如何在非mfc下的调用第一:先要包含 #include "afx.h" 包含之后会报windows.h重复定义我们需要把这个头文件包含在windows.h的前面 第二:alt+f7 快捷键 设置---或者菜单--工程--设置---点击常规--使用MFC作...
947 0
Win8 连连看小程序
看到win8和VS2012都发布有些日子,心里也痒痒的,于是就学习了几天关于在VS2012下开发,当然主要是开发应用商店小程序。学习期间一直参考: 传智播客.net培训Windows 8开发视频教程,欢迎大家也一起来学习。
722 0
3402
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载