1、横竖屏切换消息
PPC:WM_SIZE
SP:WM_SETGINGCHANGE
2、为什么拖动滚动条时,有颜色的背景总是闪动
因为拖动滚动条时,触发界面的WM_ERASEBKGND消息,系统会默认使用白色画刷去刷一遍背景,再调用我们的WM_PAINT去画我们的背景。因此总是会看到白色与颜色背景交替的闪动。
解决:
在响应WM_ERASEBKGND时,bHandled = TRUE即可。这样就不会交给系统默认去处理了。
3、为什么MessageBox的参数中能直接使用CString的变量?
例如:
CString string = _T("It's just a test!");
::MessageBox(NULL, string, _T("test"), MB_OK);
我们查看MessageBox的参数定义:
int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
可以看到lpText是一个LPCTSTR的变量,那么为什么CString能直接转换成LPCTSTR呢?我们再看看Ctring
的定义。其中有一个操作符重载函数:
operator LPCTSTR() const // as a C string
{
return m_pchData;
}
没错!就是它保证了string作为参数使用时默认转成LPCTSTR类型。
4、使用LoadString从资源文件中读出字符串内容时,字符串末尾显示乱码问题
解决方法:Project->Properties->Configuration Properties->Resources->Command Line
设置为-n
这样,从rc文件中读出字符串时才会自动在末尾加上结束符。
5、何时触发WM_ACTIVATE消息?
我们在创建一个模态对话框时,会触发WM_INITDIALOG消息,在InitDialog中处理时,发现调用SetFocus之后,
立马产生了一个WM_ACTIVATE消息,当WM_ACTIVATE处理完毕时,再继续执行InitDialog中剩余操作。
所以,SetFocus能够触发WM_ACTIVATE消息。