`

孙鑫VC++讲座笔记-(1)Windows程序内部运行机制

    博客分类:
  • vc++
阅读更多

刚开始接触MFC的时候,我曾经很认真的学习孙鑫老师的VC++讲座;后来从网上搜到一些笔记(http://blog.csdn.net/hbyufan/),虽然都只是讲座内容的大概罗列,不过在复习和查找一些内容要点的时候,尤其有用。不过我这个人向来做事认真得有些bt,就把他的笔记重新修订审核了一遍,一字一句,而且加上了摘要。另外,我还写了几篇额外的文章,是我学习时候做的练习,也算是对这套笔记的补充。

摘要:
Windows程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,__stdcall 和__cdecl调用规范的比较,初学者常犯错误及注意事项。

1,windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。

2,消息结构:
typedef struct tagMSG { // msg
HWND hwnd; //接收消息的窗口句柄。和哪个窗口相关联。
UINT message; //消息标识。消息本身是什么。
WPARAM wParam; //消息的附加信息。具体取决于消息本身。
LPARAM lParam;
DWORD time; //消息投递时间。
POINT pt; //消息投递时,光标在屏幕上的位置。
} MSG;

3,消息队列:
每 个应用程序OS都为它建立一个消息队列,消息队列是个先进先出的缓冲区,其中每个元素都是一个消息,OS将生成的每个消息按先后顺序放进消息队列中,应用 程序总是取走当前消息队列中的第一条消息,应用程序取走消息后便知道用户的操作和程序的状态,然后对其处理即消息响应,消息响应通过编码实现。

4,使用VC编程除了良好的C++基础外还需要掌握两方面:
一,消息本身。不同消息所代表的用户操作和应用程序的状态。
二,对于某个特定的消息来说,要让OS执行某个特定的功能去响应消息。

5,Window程序入口:
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄。
HINSTANCE hPrevInstance, // 先前实例句柄。
LPSTR lpCmdLine, // 命令行指针
int nCmdShow // (窗口)显示的状态
);
说明:WinMain函数是Windows程序入口点函数,由OS调用,当OS启动应用程序的时候,winmain函数的参数由OS传递的。

6,创建一个完整的窗口需要经过下面四个操作步骤:
一,设计一个窗口类;如:WNDCLASS wndcls;
二,注册窗口类; 如:RegisterClass(&wndcls);
三,创建窗口; 如:CreateWindow(),CreateWindowEX();
四,显示及更新窗口。如:ShowWindow(),UpdateWindow();

说明:创建窗口的时候一定要基于已经注册的窗口类.

7,Windows提供的窗口类:
typedef struct _WNDCLASS {
UINT style; //窗口的类型
WNDPROC lpfnWndProc; //窗口过程函数指针(回调函数)
int cbClsExtra; //窗口类附加字节,为该类窗口所共享。通常0。
int cbWndExtra; //窗口附加字节。通常设为0。
HANDLE hInstance; //当前应用程序实例句柄。
HICON hIcon; //图标句柄 LoadIcon();
HCURSOR hCursor; //光标句柄 LoadCursor();
HBRUSH hbrBackground; //画刷句柄 (HBRUSH)GetStockObject();
LPCTSTR lpszMenuName; //菜单名字
LPCTSTR lpszClassName; //类的名字
} WNDCLASS;

8,窗口类注册:
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // address of structure with class data
);

9,创建窗口:
HWND CreateWindow(
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);

10,显示和更新窗口窗口:
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state of window
);
BOOL UpdateWindow(
HWND hWnd // handle of window
);

11,消息循环:
MSG msg;
while(GetMessage(&msg,…)) //从消息队列中取出一条消息
{
TranslateMessage(&msg); //进行消息(如键盘消息)转换
DispatchMessage(&msg); //分派消息到窗口的回调函数处理(OS调用)
}
其中:
//**The GetMessage function retrieves a message from the calling thread’s message queue and places it in the specified structure.
//**If the function retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. If there is an error, the return value is -1.

BOOL GetMessage(
LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
//The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread’s message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.
BOOL TranslateMessage(
CONST MSG *lpMsg // address of structure with message
);

//The DispatchMessage function dispatches a message to a window procedure.
LONG DispatchMessage(
CONST MSG *lpmsg // pointer to structure with message
);

12,窗口过程函数(回调函数)原型:
The WindowProc function is an application-defined function that processes messages sent to a window. The WNDPROC type defines a pointer to this callback function. WindowProc is a placeholder(占位符) for the application-defined function name.

LRESULT CALLBACK WindowProc( //这里WindowProc是个代号名字。
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

说明:两种函数调用约定(__stdcall 和 __cdecl):
#define CALLBACK __stdcall
//__stdcall 标准调用预定,是PASCAL 调用约定,象DELPHI使用的就是标准调用约定
#define WINAPIV __cdecl
// __cdecl 是C 语言形式的调用约定。

主要区别:函数参数传递顺序 和 对堆栈的清除上。
问 题:除了那些可变参数的函数调用外,其余的一般都是__stdcall约定。但 C/C++编译默然的是__cdecl约定。所以如果在VC等环境中调用__stdcall约定的函数,必须要在函数声明的时加上 __stdcall 修饰符,以便对这个函数的调用是使用__stdcall约定(如使用DELPHI编写的DLL时候)。
(VC中可通过这途径修改:project|settings..|c/c++|…)

在窗口过程函数中通过一组switch语句来对消息进行处理:
如:
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_PAINT:

break;
case …
break;
case WM_CLOSE:
//DestroyWindow(hwnd);
//销毁窗口,并发送WM_DESTROY消息。
break;
case WM_DESTROY:
//PostQuitMessage(0);
//发送WM_QUIT消息到消息队列中,请求终止。
//GetMessage()取到WM_QUIT消息后,返回0,退出消息循
//环,从而终止应用程序。
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
//用缺省的窗口过程处理我们不感兴趣的消息(其它消息)。
//这是必须的。
}//switch
return 0;
}//WindowProc

13,DestroyWindow()函数和PostQuitMessage()函数原型:
//**The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages。

BOOL DestroyWindow(
HWND hWnd // handle to window to destroy
);

//**The PostQuitMessage function indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.
//**The PostQuitMessage function posts a WM_QUIT message to the thread’s message queue and returns immediately; the function simply indicates(预示,通知) to the system that the thread is requesting to quit at some time in the future.

When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system.

VOID PostQuitMessage(
int nExitCode // exit code
);

14,关于DC句柄获取:
a)使用BeginPaint(),EndPaint()对。注意只能在响应WM_PAINT消息时使用。
b)使用GetDc(),ReleaseDC()对。注意他们不能在响应WM_PAINT中使用。

code, mfc, vc, vc++, 孙薪
分享到:
评论

相关推荐

    孙鑫C++教程(全20讲)PPT讲义源码及电子书

    第一课:Windows程序运行原理 第二课:掌握C++ 第三课:讲述MFC AppWizard的原理与MFC程序框架的剖析 第四课:MFC消息映射机制的剖析,讲述如何运用ClassWizard 第五课:文本编程 第六课:菜单的工作原理及编写应用 第七课...

    孙鑫VC++视频讲座配套幻灯+全套示例源代码

    《孙鑫VC++视频讲座配套幻灯+全套示例源代码》是一份全面学习VC++编程的宝贵资源,由知名讲师孙鑫精心制作。这份资料集合了理论讲解、实例演示和源码分析,旨在帮助初学者及有经验的开发者深入理解和掌握VC++这一...

    孙鑫 VC++ 深入详解书中源码

    《孙鑫 VC++ 深入详解》是一本深受程序员喜爱的VC++技术书籍,作者孙鑫以其深入浅出的讲解方式,详细剖析了VC++的底层机制和高级特性。书中的源码是理解理论知识的关键实践部分,通过分析和运行这些代码,读者可以更...

    经典资料:孙鑫vc++视频讲义配套的源代码20集全第1-10。

    《孙鑫VC++视频讲义配套源代码》是一份经典的编程学习资源,涵盖了从基础到进阶的VC++编程知识。这份资料由知名IT讲师孙鑫精心制作,旨在帮助学习者通过实际操作来理解VC++编程的核心概念和技术。源代码分为20个部分...

    java技术从入门到精通(孙鑫)学习笔记-Lesson2.doc

    java技术从入门到精通(孙鑫)学习笔记-Lesson2

    VC++深入详解-孙鑫,孙老师的C++ 课程的配套demo 源码

    《VC++深入详解》是孙鑫老师的一部经典著作,主要针对C++编程语言在Microsoft Visual C++(简称VC++)环境下的应用进行深入讲解。这本书不仅覆盖了C++的基础语法,还包括了高级特性和实战技巧,是学习C++编程的理想...

    孙鑫老师VC++6.0视频教程对应源代码

    "Lesson1Code"包含了孙鑫老师VC++6.0视频教程的第一课源代码。这通常是介绍C++基础语法和IDE的使用。在这一课中,可能会涵盖以下知识点: 1. **基本环境设置**:如何安装和配置VC++6.0,包括创建新项目、设置编译...

    孙鑫_VC++入门到精通_PPT

    4. **MFC框架**:讲解Microsoft Foundation Classes(MFC)库,它是VC++用于构建Windows应用程序的标准库,包括窗口、控件、消息处理机制等内容。 5. **Windows编程**:深入探讨Windows API,学习如何创建窗口、...

    孙鑫_VC++入门到精通_源代码

    《孙鑫_VC++入门到精通_源代码》是著名编程教育家孙鑫老师针对初学者推出的VC++学习资源,旨在帮助学习者系统地掌握Visual C++编程基础与进阶技术。该资源包含了丰富的源代码实例,覆盖了多个课程章节,如lesson 17...

    VC++深入详解(课件+源码)

    《VC++深入详解》主要从程序内部运行的机制和MFC程序的组织脉络入手,使读者在学习VC++编程知识时,既能够知其然,又能知其所以然,从而帮助读者从根本上理解和掌握Windows的程序设计。另外,《VC++深入详解》还贯穿...

    java技术从入门到精通(孙鑫)学习笔记-Lesson2(面向对象上).doc

    面向对象编程是Java技术的核心,它是以对象为中心的编程方式,着重于对象的状态和行为的描述。简单来说,面向对象编程(OOP)是通过对象之间的交互来完成任务的编程模型。与传统的面向过程编程不同,后者注重算法和...

    VC++深入详解 PDF教程及示例代码.rar

    本书主要从程序内部运行的机制和MFC程序的组织脉络入手,使读者在学习VC++编程知识时,既能够知其然,又能知其所以然,从而帮助读者从根本上理解和掌握Windows的程序设计。另外,全书还贯穿作者多年来学习编程的一些...

    VC++深入详解.rar

    一、Windows程序运行的内部机制 1. **窗口消息**:Windows操作系统通过消息队列和消息循环来处理应用程序的交互。每个窗口都有一个与之关联的消息队列,当用户进行操作时,如点击鼠标或按下键盘,操作系统会生成对应...

    语言程序设计资料:Java-笔记-孙鑫版.doc

    语言程序设计资料:Java-笔记-孙鑫版.doc

    vc++(孙鑫)lesson1

    【VC++ 孙鑫教程 Lesson 1 知识点详解】 VC++,全称为Microsoft Visual C++,是一款由微软公司开发的集成开发环境,主要用于编写使用C++语言的应用程序。在孙鑫老师的教程中,Lesson 1是入门的基础,主要涵盖了以下...

    Windows程序内部运行原理.ppt

    《Windows程序内部运行原理》由孙鑫主讲,深入探讨了Windows应用程序与操作系统之间的交互机制。在Windows程序设计中,API(Application Programming Interface)扮演着关键角色,它是操作系统为开发者提供的函数...

    java技术从入门到精通(孙鑫)学习笔记

    Java通过异常机制来处理程序运行时可能出现的问题,学习如何使用try-catch-finally语句块,以及throw和throws关键字,能让你更好地应对程序错误。 此外,文件操作和输入/输出流也是Java开发者必须掌握的技能。I/O流...

    vc++深入祥解(孙鑫老师的电子版本)30

    不用说了,最经典的东西,经得住考验的东西,不衰的东西,下的时候注意了, 有41个压缩包

    VC.rar_visual c

    总之,VC++结合Visual Studio提供了强大的开发环境,而“孙鑫VC++笔记”这样的学习资料则可以帮助开发者快速入门并深入理解C++编程和Windows应用程序开发。通过理论学习与实践操作相结合,你可以逐渐掌握这个强大的...

Global site tag (gtag.js) - Google Analytics