视窗和消息
进行 Windows 程式设计,实际上是在进行一种物件导向的程式设计(OOP)。
装饰对话方块表面的还有各式各样的按键、单选按钮、核取方块、清单方
块、卷动列和文字输入区域。其中每一个小的视觉物件都是一个视窗。更确切
地说,这些都称为【子视窗】或【控制项视窗】或【子视窗控制项】。
所谓【Windows 给程式发送讯息】,是指 Windows 呼叫程式中的一个函式,该函式的参数描述了这个特定讯息。这种位于 Windows 程式中的函式称为【视窗讯息处理程式】。
视窗通常是在【视窗类别】的基础上建立的。视窗类别标识了处理视窗讯息的视窗讯息处理程式。
Windows 程式开始执行后,Windows 为该程式建立一个【讯息伫列】。这个
讯息伫列用来存放该程式可能建立的各种不同视窗的讯息。程式中有一小段程式码,叫做【讯息回圈】,用来从伫列中取出讯息,并且将它们发送给相应的视窗讯息处理程式。有些讯息直接发送给视窗讯息处理程式,不用放入讯息伫列中。

HELLOWIN 程式
必须把hellowin.wav文件放在工程的同一个夹子下。

#include <windows.h>
#pragma comment(lib, "winmm.lib")//必须依赖这个libLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT("HelloWin");HWND hwnd;MSG msg;WNDCLASS wndclass;// 窗口类wndclass.style = CS_HREDRAW | CS_VREDRAW; // 窗口类型的样式wndclass.lpfnWndProc = WndProc;// 窗口处理函数wndclass.cbClsExtra = 0;// 窗口扩展wndclass.cbWndExtra = 0;// 窗口实例扩展wndclass.hInstance = hInstance; // 实例句柄wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // LoadIcon() 加载图标wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);// LoadCursor() 加载鼠标光标wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);// 窗口背景色    GetStockObject() 获取一个图形对象wndclass.lpszMenuName = NULL;// 窗口菜单          wndclass.lpszClassName = szAppName; // 窗口类名if (!RegisterClass(&wndclass))// RegisterClass() 为应用程序的窗口注册一个窗口类  {MessageBox(NULL, TEXT("This program requires Windows NT!"),// 显示消息框szAppName, MB_ICONERROR);return 0;}// CreateWindow() 基于窗口类创建一个窗口hwnd = CreateWindow(szAppName,// window class nameTEXT("The Hello Program"), // window captionWS_OVERLAPPEDWINDOW,// window styleCW_USEDEFAULT,// initial x positionCW_USEDEFAULT,// initial y positionCW_USEDEFAULT,// initial x sizeCW_USEDEFAULT,// initial y sizeNULL,// parent window handleNULL,// window menu handlehInstance,// program instance handleNULL);// creation parametersShowWindow(hwnd, iCmdShow); //   显示窗口UpdateWindow(hwnd); // 指示窗口对其自身进行重绘while (GetMessage(&msg, NULL, 0, 0))// 从消息队列获取消息{TranslateMessage(&msg); // 翻译键盘消息DispatchMessage(&msg);  // 将消息发送给窗口过程 (即 WndProc()函数 )}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;PAINTSTRUCT ps;RECT rect;switch (message){case WM_CREATE:PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC); // 播放声音文件 return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);// 标明窗口绘制开始 GetClientRect(hwnd, &rect);  // 获取窗口客户区尺寸 DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, // 显示一个文本字符串 DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint(hwnd, &ps);  // 结束窗口绘制 return 0;case WM_DESTROY:PostQuitMessage(0); // 将 “退出” 消息插入消息队列 return 0;}return DefWindowProc(hwnd, message, wParam, lParam);// 返回 默认的消息处理的结果
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)函数解析:

LRESULT是一个数据类型,即长整形。
CALLBACK 即回调函数,通过函数指针调用的函数。CALLBACK就是 __stdcall(回调函数),这里也叫窗口函数,来执行窗口的消息循环。

HWND 是窗口的句柄。hwnd用来接收当前消息的窗口句柄
UINT 也谈过,就是unsigned int 无符号整型,两个字节。message是被传过来的消息。
WPARAM WP是前缀名,表示宽字符指针。wParam 是用来附加在消息上的数据。和 MSG 结构体一样
LPARAM LP是前缀名,表示长指针。lParam 也是用来附加在消息上的数据。和 MSG 结构体一样。

HDC:设备上下文 句柄(可以理解为指向DC结构的指针),它指向一块描述设备的相关的内容的内存块。
DC: 设备上下文(设备描述表),是WINDOWS的一种数据类型。
HDC设备上下文 是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。
所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API

PAINTSTRUCT:和绘图有关的结构体

typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;

hdc 是用于绘制的句柄,
fErase 如果为非零值则擦除背景,否则不擦除背景,
rcPaint 通过制定左上角和右下角的坐标确定一个要绘制的矩形范围,该矩形单位相对于客户区左上角,
后面三个参数都是系统预留的,编程一般用不到。
PAINTSTRUCT 包含了用于绘制窗口客户区的信息。例如要更新的客户区的矩形区域的大小等等。
程序处理 WM_PAINT 消息时将会用到它,该结构体的作用就是重绘客户区的。
每个窗口要有一个PAINTSTRUCT结构来记录一些绘制信息,PAINTSTRUCT结构保存了窗口绘制客户区的一些信息。例如,绘制客户区时是否要清除背景色,要更新的客户区的矩形区域的大小等等。

RECT:也是一个结构体,用来显示窗口的位置的

typedef struct _RECT {LONG left;   LONG top;LONG right;LONG bottom;
} RECT, *PRECT;

从结构体命名上很清楚地表明了结构体的作用。

switch(message) 语句:
WM_CREATE 是窗口消息中的 请求创建窗口时的消息
PlaySound() 原型:
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
PlaySound参数:pszSound 是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAV资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音。如果该参数为NULL则停止正在播放的声音。
参数:hmod 是应用程序的实例句柄,除非pszSound的指向一个资源标识符
(即fdwSound被定义为SND_RESOURCE),否则必须设置为NULL。
参数:fdwSound是标志的组合。若成功则函数返回TRUE,否则返回FALSE。
返回值:非零表示成功,零表示失败。

WM_PAINT 是窗口消息中的 客户区重绘消息
当窗口显示区域的一部分显示内容或者全部变为“无效”,以致于必须“更新画面”时,将由这个消息通知程序。
当需要绘制一部分应用窗口的时候,这个消息被Windows或者其他应用程序绘制调用。
对WM_PAINT的处理几乎总是从一个 BeginPaint() 调用开始:hdc = BeginPaint (hwnd, &ps) ;
而以一个 EndPaint() 调用结束:EndPaint (hwnd, &ps) ;
在这两个调用中,第一个参数都是程序的窗口句柄,第二个参数是指向型态为PAINTSTRUCT的结构指针。
PAINTSTRUCT结构中包含一些窗口消息处理程序,可以用来更新显示区域的内容。
BeginPaint调用令整个显示区域有效,并传回一个“设备上下文句柄”。在窗口的显示区域显示文字和图形需要设备上下文句柄。
但是从BeginPaint传回的设备上下文句柄不能在显示区域之外绘图。EndPaint释放设备上下文句柄,使之不再有效。
调用完BeginPaint之后,WndProc接着调用GetClientRect:
GetClientRect (hwnd, &rect) ;
第一个参数是程序窗口的句柄。第二个参数是一个指针,指向一个RECT型态的rectangle结构。
该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。
left和top字段通常设定为0,right和bottom字段设定为显示区域的宽度和高度(像素点数)。
WndProc除了将该RECT结构指针作为DrawText的第四个参数传递外,不再对它做其它处理。
DrawText() 原型:
int DrawText(HDC hdc, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
参数:
  hdc:设备环境句柄。
  lpString:指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以\0结束的。
  如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。
  nCount:指向字符串中的字符数。如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText() 会自动计算字符数。
  lpRect:指向结构RECT的指针,其中包含正文将被置于其中的矩形的信息(按逻辑坐标)。
  uFormat:指定格式化正文的方法。该值都是 DT_*** 的样式。
返回值:如果函数调用成功,返回值是正文的高度;如果函数调用失败,返回值是0。

第三个 case 语句: WM_DESTROY 是窗口消息中的 窗口摧毁消息
PostQuitMessage() 该函数向系统表明有个线程有终止请求。通常用来响应 WM_DESTROY 消息。
函数原型:VOID PostQuitMessage(int nExitCode);
参数 nExitCode:指定应用程序退出代码。此值被用作消息 WM_QUIT 的 wParam 参数。
PostQuitMessage寄送一个WM_QUIT消息给线程的消息队列并立即返回;此函数向系统表明有个线程请求在随后的某一时间终止。
当线程从消息队列里取得WM_QUIT消息时,应当退出消息循环并将控制返回给系统。返回给系统的退出值必须是消息WM_QUIT的。
返回值:无

DefWindowProc() 调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。
函数功能:该调用DefWindowProc函数时使用窗口过程接收的相同参数。
函数原型:LRESULT DefWindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
DefWindowProc这个函数是默认的窗口处理函数,我们可以把不关心的消息都丢给它来处理。
这个函数在处理关闭窗口消息WM_CLOSE时,是调用 DestroyWindow() 关闭窗口并且发 WM_DESTROY 消息给应用程序。
而它对WM_DESTROY这个消息是不处理的,我们在应用程序中对这个消息的处理是发出WM_QUIT消息。
因此WM_CLOSE、WM_DESTROY、WM_QUIT这三个消息是先后产生的。
hWnd:指向接收消息的窗口过程的句柄。
Msg:指定消息类型。
wParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
IParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
返回值:返回值就是消息处理结果,它与发送的消息有关。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)函数解析:
HWND 的数据类型表示 句柄:
一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值。用来标识应用程序中的不同对象和同类中的不同的实例。
应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。
句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。
句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识。
该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。
WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。
相反,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
一个句柄,只有当唯一地确定了一个项目的时候,它才开始有意义。
句柄对应着项目表中的一项,而只有WINDOWS本身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄。
总而言之:句柄就是对窗口及窗口的控件进行标识的,如果要改变窗口或它的控件的话,就需要指定窗口或控件对它进行改变。

MSG是 Windows 程序中的结构体。在Windows程序中,消息是由MSG结构体来表示的。

typedef struct tagMSG {HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG,*PMSG;

成员变量含义:
第一个成员变量 hwnd 表示消息所属的窗口。我们通常开发的程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。
第二个成员变量message指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是Window Message的缩写)的形式。
第三、第四个成员变量wParam和lParam,用于指定消息的附加信息。
例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wParam和lParam来说明。wParam、lParam表示的信息随消息的不同而不同。如果想知道这两个成员变量具体表示的信息,可以在MSDN中关于某个具体消息的说明文档查看到。
最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。

WNDCLASS
WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。
也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。
结构体 WNDCLASS 包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性。

typedef struct _WNDCLASS {UINT style;// 窗口类型
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口扩展
int cbWndExtra;//窗口实例扩展
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;

RegisterClass() :
RegisterClass注册后再调用 CreatWindow() 中使用的窗口类。
该函数的声明: ATOM RegisterClass(__inCONST WNDCLASS *lpWndClass);
lpWndClass:指向一个 WNDCLASS 结构的指针。在将它传递给函数之前,必须在该结构中填充适当的类属性。
ATOM类型为Windows中定义的新数据类型,其即unsigned short类型。
如果函数成功,返回值是唯一标识已注册的类的一个原子;如果函数失败,返回值为0。

CreatWindow() :

HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hlnstance,
LPVOID lpParam
);

主要参数:
lpClassName
指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。
这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。
如果lpClassName是一个字符串,它指定了窗口的类名。
这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。
LPWindowName
指向一个指定窗口名的空结束的字符串指针。
如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。
当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。
dwStyle
指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。
X
指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。
对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。
如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。
CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。
Y
指定窗口的初始垂直位置。对一个层叠或弹出式窗口,y参数是屏幕坐标系的窗口的左上角的初始y坐标。
对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。
对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。
如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。
nWidth
以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。
若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:
缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始Y坐标开始到目标区域的顶部。
CW_USEDEFAULT只对层叠窗口有效;如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。
nHeight
以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。
若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。
hWndParent
指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。
这个参数对弹出式窗口是可选的。Windows NT 5.0;创建一个消息窗口,
可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄。
hMenu
菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:
如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),
一个对话框使用这个整型值将事件通知父类。
应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。
hlnstance
与窗口相关联的模块实例的句柄。
lpParam
指向一个值的指针,该值传递给窗口 WM_CREATE 消息。该值通过在IParam参数中的 CREATESTRUCT 结构传递。
如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。
返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。
备注:
在返回前,CreateWindow给窗口过程发送一个WM_CREATE消息。
对于层叠,弹出式和子窗口,CreateWindow给窗口发送WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATE消息。
消息WM_CREATE的IParam参数包含一个指向CREATESTRUCT结构的指针。
如果指定了WS_VISIBLE风格,CreateWindow向窗口发送所有需要激活和显示窗口的消息。

ShowWindow() :
函数功能:该函数设置指定窗口的显示状态。
函数原型:BOOL ShowWindow(HWND hWnd, int nCmdShow);
参数:
hWnd:指窗口句柄。
nCmdShow:指定窗口如何显示。
如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。
否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。
返回值:如果窗口之前可见,则返回值为非零。如果窗口之前被隐藏,则返回值为零。
备注:
应用程序第一次调用ShowWindow时,应该使用WinMain函数的nCmdshow参数作为它的nCmdShow参数。
在随后调用ShowWindow函数时,必须使用列表中的一个给定值,而不是由WinMain函数的nCmdSHow参数指定的值

UpdateWindow() :
如果窗口更新的区域不为空,UpdateWindow函数就发送一个 WM_PAINT 消息来更新指定窗口的客户区。
函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。
函数原型:
BOOL UpdateWindow(
HWND hWnd // 窗口的句柄
);
返回值:如果函数调用成功,返回值为非零值。如果函数调用不成功,返回值为零。

GetMessage() :
函数声明:
GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。
如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是 -1。例如,当hWnd是无效的窗口句柄或 lpMsg 是无效的指针时。
备注:
应用程序通常用返回值来确定是否终止主消息循环并退出程序。
GetMesssge只接收与参数hWnd标识的窗口或子窗口相联系的消息,子窗口由函数IsChild决定。
消息值的范围由参数wMsgFilterMin和wMsgFilterMax给出。
如果hWnd为NULL,则GetMessage接收属于调用线程的窗口的消息,线程消息由函数PostThreadMessage寄送给调用线程。
GetMessage不接收属于其他线程或其他线程的窗口的消息,即使hWnd为NULL。
由PostThreadMessage寄送的线程消息,其消息hWnd值为NULL。
如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。
常数 WM_KEYFIRST和WM_KEYLAST可作为过滤值取得与键盘输入相关的所有消息:
常数WM_MOUSEFIRST和WM_MOUSELST可用来接收所有的鼠标消息。
如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤)。
GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕。
注意,此函数的返回值可非零、零或-1,应避免如下代码出现:
while(GetMessage(IpMsg,hwnd,0,0))…
返回-1时处理错误而不是继续循环。

TranslateMessage() :
函数用于将虚拟键消息转换为字符消息。
字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数 GetMessage 或 PeekMessage 时被读出。
函数原型:
BOOL TranslateMessage( CONST MSG*lpMsg );
IpMsg:指向含有消息的MSG结构的指针,该结构里含有用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息。
返回值:如果消息被转换(即,字符消息被寄送到调用线程的消息队列里),返回非零值。
如果消息是WM_KEYDOWN,WM_KEYUP WM_SYSKEYDOWN或WM_SYSKEYUP,返回非零值,不考虑转换。
如果消息没被转换(即,字符消息没被寄送到调用线程的消息队列里),返回值是零。
备注:此函数不修改由参数IpMsg指向的消息。

DispatchMessage() :
函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的。
消息被分发到回调函数(过程函数),作用是消息传递给操作系统,
然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。
函数原型:LONG DispatchMessage (CONST MSG*lpmsg);
参数:
lpmsg:指向含有消息的MSG结构的指针。
返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。
备注:MSG结构必须包含有效的消息值。
如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IParam指向的函数,而不是调用窗口程序。

(注意,几乎所有的 API 函数发生错误,都可以调用 GetLastError() 来获取错误信息。GetLastError() 返回一个错误代码,可以根据错误代码找到相关信息。函数名后带有 EX 的表示该函数的扩展函数)

Windows 编程基础(四)相关推荐

  1. Windows API编程(一)最基础的知识介绍:Windows编程基础

    主要内容简介: 1. Windows 编程基础:开发环境和开发过程. 2. Windows事件驱动模型和消息机制. 3. Windows的资源:图标.光标.菜单.位图等. 4. Windows绘图:图 ...

  2. 计算机科学与技术学习路线编程基础四大件应用实践编程(含C++学习路线)

    计算机科学与技术学习路线&编程基础四大件&应用实践编程(含C++学习路线) 基本介绍 本人211科班出身,目前大学临近毕业,想给迷茫的同行者或者后来人一些建议和推荐,少走弯路.想想自己 ...

  3. Windows编程 第四回 Windows程序的生与死(下)

    致歉 很抱歉,读者看到的这篇文章将是我写的最没什么条理的一篇了,由于这一块儿内容是所有Windows程序的核心与基础,所以我分了三回来写.我想讲 得既易懂有又丰富,无奈本人才疏学浅,每每一提笔就要查很 ...

  4. 第一章 Windows编程基础(1~4课)

    第一课:从main到WinMain 第二课:窗口和消息 第三课:MFC编程 第四课:MFC应用程序框架 概括: Win32的两种编程框架:SDK方式.MFC方式 1. SDK方式:使用WinMain入 ...

  5. Windows编程基础(转)

    前几天在网上看了"病毒"兄写的<WIN下编程须知>一文,觉得在编程方面要写出一篇适合初学者们看 的入门级文章的确很重要,可惜病毒兄只在该文里介绍了线程.消息.句柄等几个 ...

  6. Windows编程基础 - 概述

    1.1.Windows的介绍 Windows是一种基于图形界面的多任务操作系统.为这个环境开发的程序有着相同的外观和命令结构.对用户 来说,这使得学习使用Windows应用程序变得容易了.为了帮助开发 ...

  7. python编程基础(四):编程习惯、代码规范、易混淆之处

    目录 编程习惯 代码规范 python中self的作用 易混淆之处 编程习惯 1. 添加主函数if __name__ == 'main': 2. 使用project_path = os.getcwd( ...

  8. windows编程点滴(四)之线程的同步

    MSDN -- Synchronization Functions 1. 使用临界区对象(CRITICAL_SECTION) 创建线程 unsigned long _beginthreadex(voi ...

  9. 编程基础 | 四种常见的 POST 提交数据方式

    我们在使用post, put, patch, delete, options等方法的时候, 他们都有方法体body, 用来存储数据.而body的类型可以有: form-data.x-www-form- ...

  10. python编程基础(四):if 语句 增强程序鲁棒性

    一. 条件测试 1.判断相等:  == 2.使用 and 判断多个条件:  条件均为 true 的时候,才是 true 类似于 &&  与 3.使用 or 判断多个条件:  条件有一个 ...

最新文章

  1. LINUX符号、快捷键、正则
  2. 百度爬虫爬到虚拟链接 网站被黑_网站地图sitemap对SEO优化有什么作用?
  3. boost::callable_traits的remove_member_const_t的测试程序
  4. 2.5w字长文爆肝 C++动态内存与智能指针一篇搞懂!太顶了!!!
  5. easyui源码翻译1.32--ValidateBox(验证框)
  6. ios系统python编译器_MacBook如何安装Python编译器-百度经验
  7. Three.js 新旧版本区别
  8. 杂七杂八DataTable获取Table某一列成List转换Table成List
  9. python 获取cpu使用率_如何在python中获取过去10分钟的cpu使用率
  10. epoll和libevent
  11. 张一鸣在字节跳动7周年庆典上的演讲
  12. Oracle创建表空间和用户
  13. 什么是群、什么是阿贝尔群(abel群、阿贝尔群也称为交换群或可交换群)、群论入门
  14. mye clipse中svn的使用
  15. 一套近乎完美的公司财务流程
  16. Java-数据结构:树,这份资料可帮你解决95%的问题
  17. 滑模控制学习笔记(六)
  18. mysql show tables as_在Mysql命令提示符下,show tables;命令不仅可显示当前数据库中的所有表,而且还可显示当...
  19. c语言上机实验作业答案,C语言上机实验-答案
  20. python第三方库卸载方法

热门文章

  1. 团队价值观五个字_一个优秀的团队应该具有的价值观
  2. vue项目实现高德地图截图
  3. Vue实现购物车功能
  4. 采购者具体负责的问题
  5. ABYY FineReader PDF软件最新15个人​版安装下载步骤教程
  6. C语言执行时进行窗口隐藏
  7. 如何在vue项目中实现图表进行数据分析
  8. C语言中性别比例怎么表示,Problem G: C语言实验--算算男生女生的比例
  9. QT5.14.2使用webkit引擎完成网页浏览
  10. VirtualBox 打开虚拟机后,上面的那栏菜单栏不见了的解决办法