以下文章转载自网络
为什么要学Win32及Win32程序框架 wxh zt
最近在看侯捷的《深入浅出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程序开发的流程:
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程序的运行图解如下:
那么窗口的产生和显示是怎么实现的呢?下面我们就来生成一个简单的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 API
【华中科技大学汇编实验win32窗口程序框架】是一个针对初学者和进阶者设计的教学资源,旨在帮助学习者理解和掌握使用汇编语言编写Windows操作系统下的图形用户界面(GUI)程序。在这个实验中,你将接触到Win32 API,...
要在Win32程序中正确显示和处理Qt界面,需要确保两个事件循环能够协同工作。有几种方法可以解决这个问题: 1. **集成事件循环**:通过`QApplication::exec`启动Qt的事件循环,并在Win32主循环中适时调用`...
"win32简单的框架"指的是一个基于Windows API(Win32 API)构建的简单应用程序框架,主要用于教学或快速开发Windows桌面应用。Win32 API是微软为Windows操作系统提供的编程接口,它提供了丰富的功能,如窗口管理、...
在Windows编程领域,Win32 API和MFC(Microsoft Foundation Classes)是两种常见的开发框架。Win32 API提供了底层的窗口、消息处理和系统服务,而MFC则是在此基础上构建的一套面向对象的库,它封装了Win32 API,简化...
当我们谈论"Win32应用程序框架中类的结构"时,通常指的是如何构建一个基于Windows消息机制的C++类结构。这种结构通常涉及到窗口类、消息映射和成员函数等核心概念。 窗口类(Window Class)是Win32 API中的基本构造...
在深入学习MFC之前,掌握Win32程序基础至关重要,这不仅能够帮助程序员更好地理解MFC框架的设计理念,还能在实际开发中实现更高效的代码编写和调试。以下是从标题、描述、标签以及部分内容中提炼出的关键知识点: #...
自己封装的一个 WIN32 SDK程序的小型应用程序框架,通过C++的封装性,继承性,多态性,将重复繁琐的SDK程序代码变得面向对象,简单,明了,清晰,SDK程序朋友的福音,也是学习C++基础只是的必备良品,觉得值得下载。...
对于"win32汇编写的驱动程序框架",我们探讨的是一个使用低级语言——汇编语言构建的驱动程序基础架构,特别地,这个框架是用RADASM这款汇编器编写的。 首先,我们要理解汇编语言。汇编语言是一种面向机器的语言,...
Win32最基础应用程序是指基于Microsoft Windows操作系统的32位应用程序开发。Win32 API(应用程序接口)是Windows操作系统提供给开发者的一个接口,允许程序员直接与操作系统交互,创建各种功能丰富的桌面应用程序。...
总之,《Win32多线程程序设计》为读者提供了全面的理论基础和实践指导,无论是对于初学者还是经验丰富的开发者,都是一本宝贵的参考资料。通过学习本书,开发者可以掌握如何在Win32平台上高效、安全地实现多线程程序...
在学习Direct3D 11时,Win32程序作为基础框架,提供了一个窗口环境,让图形渲染得以展示。Direct3D 11是一个高级图形库,用于创建3D图形和游戏。它需要一个设备上下文来渲染图形,而这个上下文通常在Win32窗口中创建...
标题中的“一个纯净的WIN32+OPENGL框架”指的是一个基于Windows API(WIN32)构建的基础图形渲染框架,该框架专为使用OpenGL图形库而设计。OpenGL是一种跨语言、跨平台的编程接口,用于生成2D和3D图形。这个框架可能...
这个简单的Win32绘图程序可能是学习Win32 API的起点,帮助初学者理解如何在Windows环境下创建图形界面并进行绘图操作。通过分析程序代码,我们可以了解到如何组织消息循环、如何响应用户输入以及如何有效地绘制图形...
**文件名解析:** "win32框架" 可能是包含了一系列与WIN32窗口程序相关的源代码文件、示例项目、头文件或库,用于帮助开发者理解和学习如何构建基于WIN32 API的窗口应用程序。 **详细知识点:** 1. **Windows API*...
这个"基于win32框架生成OpenGL窗口源代码"的示例,为初学者提供了在Windows环境下搭建OpenGL编程环境的基础。 首先,我们需要理解Win32 API的核心概念。Win32 API是Windows操作系统提供的函数库,包含了创建和管理...
在深入探讨如何将Win32程序封装成MFC框架之前,我们先理解这两个概念的基本含义。Win32程序是基于Microsoft Windows API(应用程序接口)编写的,它直接使用Windows操作系统提供的函数来创建用户界面和执行任务。而...
Qt是一个跨平台的C++应用程序框架,使得win32diskimager可以在Windows系统上提供友好的图形界面。 - **libstdc++-6.dll** 和 **libgcc_s_dw2-1.dll**: 这些是GNU C++标准库和GCC运行时库的组件,是编译和运行C++程序...
Win32是指在Windows NT操作系统中首次引入的一套32位应用程序接口(API),它允许程序员直接与操作系统的内核进行交互,为Windows应用程序提供了丰富的功能。Win32 API作为Windows编程的基础,至今仍然是Windows底层...
《WIN32高级程序设计》是一本深入探讨Windows操作系统API编程的书籍,它为程序员提供了在32位Windows环境下编写高效、稳定的应用程序所需的知识。这本书涵盖了从基本的Windows编程概念到复杂的系统级操作,包括窗口...