VC中几个基本问题

来源:互联网 发布:淘宝上黑枸杞是真的吗 编辑:程序博客网 时间:2024/04/29 11:01

回调函数的内在机制如何

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。

什么是窗口函数呢?

    窗口函数定义了应用程序对接受到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的处理过程,是消息处理分支控制语句的集合。一般来说,窗口函数由一个或多个switch语句组成。每一个case语句对应一种消息,当应用程序接受到一个消息时,在窗口函数内的相应的case语句就会被激活并执行相应的响应程序模块。
   
简单的说窗口函数就是应用程序处理接受到的消息的函数,其中包含了应用程序对各种可能接受到的有用的消息的处理过程。
   
窗口函数的一般格式是这样的:
LRESULT CALLBACK WndProc
( HWND hwnd,     //窗口句柄
  UNIT message,  //代表所处理消息的消息值
  WPARAM wParam, //消息的附加参数(1)
  LPARAM lParam  //消息的附加参数(2)
)

句柄

它是WINDOWS编程的基础。一个句柄是指WINDOWS在内存中使用的一个唯一的整数质,是一个4个字节长的数值,用于标识应用程序中不同对象和相同对象的不同实例。
这里列出几种WINDOWS常用的句柄:
HWND: 标示窗口句柄
HINSTANCE:标示当前实例句柄
HCOURSOR:标示光标句柄
HFONT: 标示字体句柄
HPEN:标示画笔句柄
HBRUSH:标示画刷句柄
HDC:标示设备环境句柄
HBITMP:标示位图句柄
HICON:标示图标句柄
HMENU:标示菜单句柄
HFILE:标示文件句柄

消息

VC++中消息都用前缀标示消息所属的分类,下面介绍一下这些前缀
BM
表示按钮控制消息
CB
表示组合框控制消息
DM
表示默认下压式按钮控制消息
EM
表示编辑控制消息
LB
表示列表框控制消息
SBM
表示滚动条控制消息
WM
表示窗口消息

由于WINDOWS应用程序利用WINDOWS消息来与其它的WINDOWS应用程序及WINDOWS系统进行消息交换。所以消息是一个十分重要的对象它的结构如下。

typedef struct{
  HWND hwnd;     //检索消息的窗口句柄
  UNIT message;  //代表一个消息的消息质
  WPARAM wParam; //消息附加信息的字参数
  LPARAM lParam; //消息附加信息的长字参数
  DWORD time;    //消息入队时间
  POINT pt;      //消息发送时鼠标的位置 point.x;point.y;
} tagMSG;

系统保留消息标识符的值在0x00000x03ff(WM_USER-1)范围。这些值被系统定义消息使用。应用程序不能使用这些值给自己的消息。应用程序消息从WM_USER0X0400)到0X7FFF,或0XC0000XFFFFWM_USER0X7FFF范围的消息由应用程序自己使用;0XC0000XFFFF范围的消息用来和其他应用程序通信.

WM_NULL---0x0000 空消息。
0x0001----0x0087 主要是窗口消息。
0x00A0----0x00A9 非客户区消息
0x0100----0x0108 键盘消息
0x0111----0x0126 菜单消息
0x0132----0x0138 颜色控制消息
0x0200----0x020A 鼠标消息
0x0211----0x0213 菜单循环消息
0x0220----0x0230 多文档消息
0x03E0----0x03E8 DDE消息
0x0400 WM_USER
0x8000 WM_APP
0x0400----0x7FFF 应用程序自定义私有消息

大体上有3种:窗口消息、命令消息和控件通知消息。

由于控件通知消息很重要的,人们用的也比较多,但是具体的含义往往令初学者晕头转向,所以我决定把常见的几个列出来供大家参考:

按扭控件
BN_CLICKED 用户单击了按钮
BN_DISABLE 按钮被禁止
BN_DOUBLECLICKED 用户双击了按钮
BN_HILITE 用/户加亮了按钮
BN_PAINT 按钮应当重画
BN_UNHILITE 加亮应当去掉
  组合框控件
CBN_CLOSEUP 组合框的列表框被关闭
CBN_DBLCLK 用户双击了一个字符串
CBN_DROPDOWN 组合框的列表框被拉出
CBN_EDITCHANGE 用户修改了编辑框中的文本
CBN_EDITUPDATE 编辑框内的文本即将更新
CBN_ERRSPACE 组合框内存不足
CBN_KILLFOCUS 组合框失去输入焦点
CBN_SELCHANGE 在组合框中选择了一项
CBN_SELENDCANCEL 用户的选择应当被取消
CBN_SELENDOK 用户的选择是合法的
CBN_SETFOCUS 组合框获得输入焦点
  编辑框控件
EN_CHANGE 编辑框中的文本己更新
EN_ERRSPACE 编辑框内存不足
EN_HSCROLL 用户点击了水平滚动条
EN_KILLFOCUS 编辑框正在失去输入焦点
EN_MAXTEXT 插入的内容被截断
EN_SETFOCUS 编辑框获得输入焦点
EN_UPDATE 编辑框中的文本将要更新
EN_VSCROLL 用户点击了垂直滚动条消息含义
  列表框控件
LBN_DBLCLK 用户双击了一项
LBN_ERRSPACE 列表框内存不够
LBN_KILLFOCUS 列表框正在失去输入焦点
LBN_SELCANCEL 选择被取消
LBN_SELCHANGE 选择了另一项
LBN_SETFOCUS 列表框获得输入焦点

WinMain函数

一个基本的WinMain函数应该具有以下的功能:
1,
注册窗口类,建立窗口及执行其他必要的初始化工作
2,
进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程。
3,
当消息循环检索到WM_QUIT消息时中止程序运行
WinMain
函数有三个基本组成部分:函数说明、初始化和消息循环。

(1)函数说明
int WINAPI WinMain
(
HINSTANCE hThisInst, //应用程序当前实例句柄
HINSTANCE hPrevInst, //应用程序其它实例句柄
LPSTR lpszCmdLine,   //指向程序命令行参数的指针
int nCmdShow         //应用程序开始执行时窗口显示方式的整数值标示
)
(2)初始化
初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分。
(在以后的程序中我将详细的介绍它们具体的实现方法)

(3)
消息循环
WINDOWS
应用程序的运行是以消息为核心的。WINDOWS将产生的消息放入应用程序的消息队列中,而应用程序的WinMain函数从消息循环提取队列中的消息,并将其传递给窗口函数的相应过程处理。