《Windows程序设计》V2
1. Chap 4 Windows图形界面
* FirstWindow破坏实验
删去::RegisterClassEx(),Error”创建窗口出错“
删去::DispatchMessage(),所有消息都不再响应
删去::ShowWindow(),没有窗口显示
《把脉VC++》
1. Chap 10. 界面绘制与交互
*一个Fake的消息系统
写得非常好,简单易懂。
* 一切都是消息
Bool SetWindowText(HWND hWnd, LPCSTR lpString)
其实就是向hwnd发送一个WM_SETTEXT消息
SendMessage((HWND) hWnd, WM_SETTEXT, (WPARM) wParm, (LPARAM) lParam) ;
Spy++观察进程、线程及窗口之间的关系
Q:消息queue是每个线程一个还是每个窗口一个???GetMessage()???
《Windows Programming》V2
1. Chap 5, 框架
* _asm {int 3}只在debug状态下工作?
* 窗口handler与CWnd针针的映射
线程中每一个窗口都对应一个CWnd类指针
窗口函数通过hWnd得到CWnd指针,再调用相应方法完成功能
Q:HANDLE就是一种指针,YES。如模块HANDLE就是模块代码的首地址。
* CWinApp/CWinThread
任何程序必须定义一个CWinApp子类的全局变量,使CWinApp:CWinApp()能首先执行,完成初始化动作 。
系统中无需再定义WinMain()函数,此函数已经在CWinApp中实现了。
注:CWinApp初始化比WinMain()先执行,初始化过程中,会对模块与线程状态等变量进行初始化,这些初始化的状态信息放在THREAD-LOCAL中,同一线程的其它任何程序都可以访问到。
CWinApp::CWinApp()
{
// 初始化CWinThread状态
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();
// 初始化CWinApp状态
ASSERT(pModuleState->m_pCurrentWinApp == NULL);
pModuleState->m_pCurrentWinApp = this;
ASSERT(AfxGetApp() == this);
// 直到进入WinMain函数之后再设置为运行状态
m_hInstance = NULL;
}