Win32 Msg
winmain.cpp:入口函数 AfxWinMain 的实现;
cmdtarg.cpp:类CCmdTarget的实现;
wincore.cpp:类CWnd;doccore.cpp:类CDocument;thrdcore.cpp:类CWinThread;appcore.cpp:类CWinApp; ===>继承自 CCmdTarget
winfrm.cpp:类CFrameWnd;viewcore.cpp:类CView;dlgcore.cpp:类CDialog;===>继承自 CWnd
//
//* Windows提供了许多内核对象来实现线程的同步。对于线程同步而言,这些内核对象有两个非常重要的状态:“已通知”状态,“未通知”状态(也有翻译为:受信状态,未受信状态。)
//* Windows提供了几种内核对象可以处于已通知状态和未通知状态:进程、线程、作业、文件、控制台输入/输出/错误流、事件、等待定时器、信号量、互斥对象。
//
/*
*函数功能:该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态;
*返 回 值:如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。
*参 数:第二个参数指明了需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去,如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。
*返 回 值:如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。
*/
DWORD WaitForSingleObject(
HANDLE hHandle, // 指明一个内核对象的句柄
DWORD dwMillisenconds // 等待时间
);
/*
*参 数:该函数的第一个参数指明等待的内核对象的个数,可以是0到MAXIMUM_WAIT_OBJECTS(64)中的一个值。
lpHandles参数是一个存放等待的内核对象句柄的数组。
bWaitAll参数如果为TRUE,则只有当等待的所有内核对象为已通知状态时函数才返回,如果为FALSE,则只要一个内核对象为已通知状态,则该函数返回。
第四个参数和WaitForSingleObject中的dwMilliseconds参数类似。
*返 回 值:该函数失败,返回WAIT_FAILED;如果超时,返回WAIT_TIMEOUT;
*备 注:如果bWaitAll参数为TRUE,函数成功则返回WAIT_OBJECT_0,如果bWaitAll为FALSE,函数成功则返回值指明是哪个内核对象收到通知。
*/
DWORD WaitForMultipleObjects(
DWORD nCount, // 等待的内核对象个数
CONST HANDLE *lpHandles, // 一个存放被等待的内核对象句柄的数组
BOOL bWaitAll, // 是否等到所有内核对象都为以通知状态后才返回
DWORD dwMilliseconds // 等待时间
);
/*
*函数功能:阻塞时仍可以响应消息
*备 注:MsgWaitForMultipleObjects()函数类似WaitForMultipleObjects(),但它会在“对象被激发”或“消息到达队列”时被唤醒而返回。
*参 数:MsgWaitForMultipleObjects()多接收一个参数,允许指定哪些消息是观察对象。
*/
DWORD MsgWaitForMultipleObjects(
DWORD nCount, // 等待的内核对象个数
CONST HANDLE *pHandles, // 指向一个由handle组成的数组,这些handle的类型可以不同
BOOL fWaitAll, // 是否等待所有的handles被激发才返回
DWORD dwMilliseconds, // 超时时间
DWORD dwWakeMask // 欲观察的用户输入消息类型
);
/*
*特 点:你也可以同时通知一个内核对象,同时等待另一个内核对象,这两个操作以原子的方式进行;
*函数功能:该函数在内部使得hObjectToSignal参数所指明的内核对象变成已通知状态,同时等待hObjectToWaitOn参数所代表的内核对象。
*参 数:dwMilliseconds参数的用法与WaitForSingleObject函数类似。
*返 回 值:该函数返回如下:WAIT_OBJECT_0,WAIT_TIMEOUT,WAIT_FAILED,WAIT_IO_COMPLETION。
*/
DWORD SignalObjectAndWait(
HANDLE hObjectToSignal, // 通知的内核对象
HANDLE hObjectToWaitOn, // 等待的内核对象
DWORD dwMilliseconds, // 等待的时间
BOOL bAlertable // 与IO完成端口有关的参数
);
// 消息结构
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
/*
*函数功能:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。
*返 回 值:
如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。
如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP,返回非零值,不考虑转换。
如果消息没有转换(即,字符消息没被送到线程的消息队列中),返回值是零。
*备 注:TranslateMessage函数不修改由参数lpMsg指向的消息。
消息WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息。消息WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR 消息。
TtanslateMessage仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR消息。
如果应用程序为其它用途而处理虚拟键消息,不应调用TranslateMessage函数。例如,如果TranslateAccelerator函数返回一个非零值,则应用程序将不调用TranslateMessage函数。
Windows CE:Windows CE不支持扫描码或扩展键标志,因此,它不支持由TranslateMessage函数产生的WM_CHAR消息中的lKeyData参数(lParam)16-24的取值。
TranslateMessage函数只能用于转换由GetMessage或PeekMessage函数接收到的消息。
*/
BOOL TranslateMessage(
CONST MSG *lpMsg // 指向一个含有用GetMessage或PeekMessage函数从调用线程的消息队列中取得消息信息的MSG结构的指针。
);
/*
*函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。
*返 回 值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。
*备 注:MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IPa1ram指向的函数,而不是调用窗口程序。
*/
LRESULT DispatchMessage(
CONST MSG *lpMsg // 指向含有消息的MSG结构的指针
);
/**/
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
/**/
BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
/**/
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
/**/
BOOL PostThreadMessage(
DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
/**/
BOOL SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
/**/
BOOL SendNotifyMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
/**/
LRESULT SendMessageTimeout(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam,
UINT fuFlags,
UINT uTimeout,
PDWORD_PTR lpdwResult
);