9512.net
甜梦文库
当前位置:首页 >> 数学 >>

部分函数



Win32 消息处理 API---GetMessage
GetMessage 功能说明
? WinCE 下:该函数从呼叫进程的消息队列中检索消息,并且将所检索到的消 息放入到一个指定的结构体(即 MSG 结构)中; Win32 下:该函数从呼叫进程的消息队列中检索消息,如果被检索到的消息 为可分派消息,则该函数就分派该消息,如果被检索到的消息为不可分派消 息,

则 GetMessage 返回非正值,导致消息循环的结束。例如可分派的消息 有: WM_PAINT、 WM_SIZE、 WM_CREATE 等, 不可分派的消息有 WM_QUIT 等。

?

函数格式
BOOL GetMessage( LPMSG lpMsg, // 检索到的消息 HWND hWnd, // 窗口指向 UINT wMsgFilterMin, // 消息范围的下界限参数 UINT wMsgFilterMax // 上界限参数 );

参数说明
1>、lpMsg, 【out】
指向 MSG 结构的指针,该结构用于存放从进程消息队列里检索(接收)到的消息。

2>、hWnd, 【in】
窗口句柄,如果非零,则 GetMessage 只检索该窗口(也包括其子窗口)消息,如果为零, 则 GetMessage 检索整个进程内的消息。非零窗口句柄必须属于 GetMessage 所属的进程。

3>、wMsgFilterMin, 【in】
指 定 被 检 索 的 最 小 消 息 值 的 整 数 , 通 常 使 用 WM_KEYFIRST 指 定 第 一 键 盘 消 息 或 WM_MOUSEFIRST 指定鼠标消息。Windows XP 中:在此处使用的是 WM_INPUT,同时 wMsgFilterMax 指定的消息也只有 WM_INPUT。

4>、wMsgFilterMax, 【in】
指 定 被 检 索 的 最 大 消 息 值 的 整 数 , 通 常 使 用 WM_KEYLAST 指 定 最 末 键 盘 消 息 或 WM_MOUSELAST 指定最末鼠标消息。Windows XP 中:在此处使用的是 WM_INPUT,同 时 wMsgFilterMin 指定的消息也只有 WM_INPUT。 如果 wMsgFilterMin 和 wMsgFilterMax 都为零, 则 GetMessage 检索所有有效的信息(即, 没有进行消息过滤,没有范围限制) ;同时,如果 hWnd 非零,则检索属于 hWnd 窗口的消 息;如果 hWnd 为零,就是整个进程内的所有消息。

返回值
如果 GetMessage 检索到的消息不为 WM_QUIT,则返回一个正值,如果检索到 WM_QUIT 消息,返回值是零,如果在检索消息时出现了错误,则返回值是-1。例如,当 hWnd 是无效 的窗口句柄或 lpMsg 是空指针时。警示:因为返回值的三种状态,即:> 0、= 0、< 0,在使 用 GetMessage 写程序时尽量避免如下格式的代码: while (GetMessage(lpMsg, hWnd, 0, 0)) ... 因为当返回值为-1 时,while 循环还会继续执行的(读者可以自行验证) ,这样会导致应用 程序出现致命错误而引起系统崩溃。所以建议写代码时应如下格式所示: BOOL bRet = FALSE; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } }

备注
1、应用程序在进行的消息循环内,通常用返回值来确定是否终止主消息循环并退出程序; 2、GetMessage 函数获取消息之后,将会使该消息被消息队列所删除(WM_PAINT 消息除 外,至于 WM_PAINT 则只有在其被合并处理之后才被删除) ; 3、GetMessage 只检索呼叫进程的消息,不检索属于其它进程的消息。 4、常数 WM_KEYFIRST 和 WM_KEYAST 可作为过滤值检索与键盘输入相关的所有消息, 常数 WM_MOUSEFIRST 和 WM_MOUSELST 可用来检索所有的鼠标消息;而在 Windows XP 中,二参数均使用 WM_INPUT 作为检索键盘和鼠标的输入。 5、当消息检索对象为进程消息队列时,如果进程消息队列正在进行消息存放操作,则 GetMessage 会等待这个存放操作结束后,再检索消息;如果消息队列为空,GetMessage 也 会等待的。 6、应用程序只能使用 wMsgFilterMin 和 wMsgFilterMax 参数的低字节,而高字节是保留给 系统使用的。

适用
Windows NT: 3.1 及以上版本;Windows:95 及以上版本;Windows CE:1.0 及以上版本: 头文件: winuser.h; 输入库: user32.Iib; Unicode: Windows NT 环境下以 Unicode 和 ANSI 在 方式实现。

应用举例
这是一个 Win32 程序的创建,在创建该 Win32 程序时,初始化程序入口函数:包括注册应 用程序主窗口、注册主窗口事件发布函数、创建窗体和消息循环体。 HINSTANCE hinst; HWND hwndMain; LPSTR

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, lpszCmdLine, int nCmdShow) { MSG msg; BOOL bRet; WNDCLASS wc;

UNREFERENCED_PARAMETER(lpszCmdLine); // 告诉编译器, 该参数没有被引用, 不 要报警告 // Register the window class for the main window. if (!hPrevInstance) { wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; // 注册窗口事件发布函数 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance wc.hIcon = hInstance;

= LoadIcon((HINSTANCE)NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = _T("MainMenu"); wc.lpszClassName = _T("MainWndClass");

if (!RegisterClass(&wc)) return FALSE; // 注册进程主窗口类 } hinst = hInstance; // save instance handle // Create the main window. hwndMain = CreateWindow(_T("MainWndClass"), _T("Sample"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)NULL, (HMENU)NULL, hinst, (LPVOID)NULL);

// If the main window cannot be created, terminate the application. if (!hwndMain) return FALSE; // Show the window and paint its contents. ShowWindow(hwndMain, nCmdShow); UpdateWindow(hwndMain); // Start the message loop. while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { // 注册消息循环体 if (bRet == -1) { } else { TranslateMessage(&msg); DispatchMessage(&msg); } } // handle the error and possibly exit

// Return the exit code to the system. return msg.wParam; }

TranslateMessage
是用来把虚拟键消息转换为字符消息。由于 Windows 对所有键盘编码都是采用 虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符 的消息。 TranslateMessage 函数用于将虚拟键消息转换为字符消息。字符消息被投递到调 用线程的消息队列中,当下一次调用 GetMessage 函数时被取出。当我们敲击键 盘上的某个字符键时,系统将产生 WM_KEYDOWN 和 WM_KEYUP 消息。这 两个消息的附加参数 (wParam 和 lParam) 包含的是虚拟键代码和扫描码等信息, 而我们在程序中往往需要得到某个字符的 ASCII 码,TranslateMessage 这个函 数就可以将 WM_KEYDOWN 和 WM_ KEYUP 消息的组合转换为一条 WM_CHAR 消息(该 消息的 wParam 附加参数包含了字符的 ASCII 码) 并将转换后的新消息投递到调 , 用线程的消息队列中。注意,TranslateMessage 函数并不会修改原有的消息,它 只是产生新的消息并投递到消息队列中。 也就是说 TranslateMessage 会发现消息里是否有字符键的消息,如果有字符键的 消息,就会产生 WM_CHAR 消息,如果没有就会产生什么消息。

DispatchMessage(&msg);
将消息发送到窗口过程来处理。 (略)

DefWindowProc:呼叫 DefWindowProc 来为视窗讯息处理程式不予处理的所有
讯息提供内定处理(略)



更多相关文章:
《数据库技术与应用》第6章 习题答案
理解下列术语的定义: 函数依赖、部分函数依赖、完全函数依赖、传递依赖、候选码、码、主码、外码、全码、 1NF、2NF、3NF、BCNF、4NF。 解: 函数依赖:设 R(...
MATLAB部分函数使用方法
MATLAB部分函数使用方法_IT/计算机_专业资料。MATLAB图像,矩阵及函数使用方法 读取图像:用 imread 函数读取图像文件,文件格式可以是 TIFF、JPEG、GIF、BMP、PNG 等。...
《高数二》 第一部分函数和极限
《高数二》 第一部分函数和极限_数学_高中教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 《高数二》 第一部分函数和极限_数学_高中教育_教育专区。资料版权...
数据库课后答案5-7章
请给出关系模式, 写出每个关系模式的最小函数依赖集,指出是否存在传递函数依赖,对于函数依赖左部是多属性 的情况,讨论函数依赖是完全函数依赖还是部分函数依赖。指出...
习题七参考答案(部分)
并 指出在函数依赖范围内,它达到了第几范式。 答:此关系的码为(A,D) 。达到 1NF,因为非主属性 B 和 D 部分函数依赖于码。 16.函数依赖范围内,试问下列...
Delphi的部分函数及用法
Delphi 的部分函数及用法 1、 有些属性只能在执 行时 改变 ,这 些属性在 Delphi 的在线 帮助的“Proprety”主题 中被标 为(Edit1.Color:=clYellow;或 Edit...
C习题函数部分
C习题函数部分_电子/电路_工程科技_专业资料。函数 一、选择题 1.以下说法中错误的是 A.C 程序中可以只包含一个 main 函数___。 B.C 程序由一个 main ...
C语言-函数部分
qq 函数功能为任意一个整数,计算出开平方根的值(注意得到的是小数),要求用迭代 法实现,参考第六章的习题。主函数部分未写完全,请同学们把主函数和子函数全部补...
数据库原理及应用 书本答案 单元 (6)
问答题 1、解释下列术语的含义: 函数依赖、 平凡函数依赖、 非平凡函数依赖、部分函数依赖、完全函数依赖、传递函数依赖、 1NF、2NF、3NF、BCNF、多值依赖、4NF...
基本函数依赖(练习)
班级:{班号→专业名,专业名→系名,班号→人数,班号→入校年份,{专业名,入校年份}→班号} 候选键:班号,{专业名,入校年份};外键:系名 存在部分函数依赖:...
更多相关标签:
偏函数    什么是部分函数    配分函数    全函数    部分函数依赖    一个函数由两部分组成    keil禁止部分函数优化    scala 部分应用函数    

All rights reserved Powered by 甜梦文库 9512.net

copyright ©right 2010-2021。
甜梦文库内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图