孙鑫VC视频教程笔记之第一课“Windows程序的内部运行原理”
分类: 孙鑫VC视频教程笔记 2008-09-13 11:28 399人阅读 评论(0) 收藏 举报
1. 操作系统和应用程序之间的关系:
应用程序到操作系统表示应用程序可以通知操作系统执行某个具体的动作
操作系统到应用程序表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作
系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。
2. windows
程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。
每个应用程序OS都为它建立一个消息队列,消息队列是个先进先出的缓冲区,其中每个元素都是一个消息,OS将生成的每个消息按先后顺序放进消息队列中,应用程序总是取走当前消息队列中的第一条消息,应用程序取走消息后便知道用户的操作和程序的状态,然后对其处理即消息响应,消息响应通过编码实现。
3. 创建一个完整的窗口需要经过下面四个操作步骤
1)
设计一个窗口类。如:WNDCLASS wndcls。
2) 注册窗口类。如:RegisterClass(&;wndcls)。
3) 创建窗口。如:CreateWindow(),CreateWindowEX();
4) 显示及更新窗口。如:ShowWindow(),UpdateWindow();
4. 消息的结构:
typedef struct tagMSG {
HWND hwnd; //接收消息的窗口句柄,和哪个窗口相关联。
UINT message; //消息标识,消息本身是什么,如WM_CHAR
WPARAM wParam; //消息的附加信息,具体取决于消息本身。
LPARAM lParam;
DWORD time; //消息投递时间。
POINT pt; //消息投递时,光标在屏幕上的位置。
} MSG;
5. WinMain函数结构:
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄。
HINSTANCE hPrevInstance, //上一个该程序的实例句柄,32位系统中此值都为NULL
LPSTR lpCmdLine, // 命令行指针
int nCmdShow // (窗口)显示的状态
);
要带参调用WinMain类似于命令行的功能,在Project->setting->Debug->Program arguments项填写参数
6. 窗口类WNDClass:
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;
7. 源码(在VC中建立Win32 Application):
#include
#include
//回调函数声明
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
//第一步:设计窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
//The GetStockObject function retrieves a handle to one of the predefined stock pens, brushes, fonts, or palettes.
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //得到预定义的画刷,画笔等
wndcls.hCursor=LoadCursor(NULL,IDC_CRO