//hwnd 和 cwnd
HWND是windows系统中对所有窗口的一种标识,即窗口句柄,这是一个SDK概念
CWnd是MFC类库中所有窗口类的基类,微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它封装了窗口句柄即m_hwnd
由HWND得到CWnd*
CWnd wnd;
HWnd hWnd;
wnd.Attach(hWnd)
通常一个窗口资源已经和一个Cwnd类的对象关联起来的,由于一般来说,这个类是自己创建的,所以自然知道,怎么得到指向这个类的指针。
如果没有就CWnd对象,将这个对象与窗口资源的hwnd句柄关联起来,(如上面的Attach)
如果用static CWnd* CWnd::FromHandle(HWnd hWnd);
则返回值是一个暂时的CWnd对象,并且我们确保返回值为非空,也就是hWnd有效的。
static CWnd* CWnd::FromHandlePermanent(HWND hWnd) ;
返回的是一个永久的对象。只有在返回的CWnd在类表里已经存在是返回值为非空。
由CWnd获得hWnd就容易的多了,因为它的一个成员m_hWnd就是窗口对应的句柄。
wnd->m_hWnd;
HDC 与 CDC 同上
HDC 为设备句柄, CDC为抽象的类, HDC为CDC的一个成员变量
//SendMessage PostMessage原理
1、SendMessage、PostMessage的运行机制
SendMessage可以理解为,SendMessage函数发送消息,等待消息处理完成后,SendMessage才返回,稍稍深入一些,是等待窗口处理函数返回后,SendMessage就返回了
PostMessage可以理解为,PostMessage函数发送消息,不等待消息处理完成,立刻返回,稍稍深入一些,PostMessage只管发送消息,消息有没有被送到并不关心,
只要发送了消息,便立刻返回。
2、SendMessage、PostMessage的运行内幕
SendMessage的MSDN解释:SendMessage发送消息到指定的消息窗口,它调用特定窗口的窗口处理函数,并且不立即返回,直到窗口处理函数处理了这个消息。
PostMessage的MSDN解释:PostMessage函数将一个消息放入与创建这个窗口的消息队列相关的线程中,并立刻返回,不等待线程处理。
SendMessage确实是发送消息,然后等待处理完成返回,但发送消息的方法为直接调用消息处理函数(即WndProc函数),按照函数调用规则,肯定会等待消息处理函数
返回后SendMessage才返回。而PostMessage却没有发送消息,PostMessage是将消息放入到消息队列中, 然后立刻返回,至于消息何时被处理,PostMessage完全不知道
此时只有消息循环知道被PostMessage的消息何时被处理了。
2、SendMessage、PostMessage的内部实现
消息循环从消息队列里取消息
消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
TranslateMessage
函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。
DispatchMessage函数
函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。
总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理.
关于自定义消息响应函数 的返回值,在VS中返回值必须为LRESULT ,不然的话会报错的。
自定消息4步:
1、自定义消息号
2、自定义消息响应函数 在VS中返回值用LRESULT
3、将消息号与消息响应函数绑定ON_MESSAGE()
4、调用::SendMessage 发送消息