FAQ1: VC7中,如何在非MFC中如何使用CString -- 包含头文件 atlstr.h 即可,需要用到ATL
FAQ2: 检查某键是否被按下-- if( GetKeyState(VK_LSHIFT) < 0 ) 表示被按下
FAQ3: 隐藏对话框-- 当你使用有模式对话框时最开始是无法隐藏窗口的,而只能在对话框显示后再隐藏窗口,所以这会造成屏幕的闪烁。一个解决办法就是采用无模式的对话框, 无模式的对话框在创建后是隐藏的,直到你调用ShowWindow(SW_SHOW)才会显示 其实可以用一种方法隐藏模式对话框: ::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, WS_EX_TOOLWINDOW); ::MoveWindow(AfxGetMainWnd()->m_hWnd,0,0,0,0,FALSE); 要创建对话框时不在任务栏显示按钮: ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW, SWP_DRAWFRAME);
FAQ4: 在源文件中定位光标到对称的#if, #endif,使用Ctrl+K.
FAQ5: 手工编译纯资源成dll-- Rc.exe /v data.rc Cvtres.exe /machine:ix86 data.res Link /SUBSYSTEM:WINDOWS /DLL /NOENTRY data.res ;编译成DLL文件 这种方式创建的DLL是最小的,比起你用Win 32 Dynamic Libray等产生的更小。
FAQ6: 如何在OLE_COLOR与COLOR之间转换-- OLE_COLOR ocBack = GetBackColor(); // Convert OLE_COLOR to COLORREF COLORREF clrBack = OleTranslateColor(ocBack); // Convert COLORREF to OLE_COLOR OLE_COLOR ocConverted = (OLE_COLOR)clrBack;
FAQ7: Win98不能使用的UNICODE字符处理函数-- lstrcpyW - 取代函数:ATL提供的ocscpy CharNextW - 取代函数: ATL提供的CharNextO Win98和2000都可以使用的: lstrlenW C运行库内处理UNICODE的函数(即以wcs开头的)
FAQ8: WM_NCCALCSIZE消息-- 当窗口的位置和大小发生改变时,窗口会收到此消息。通过处理此消息,程序可以控制窗口客户区的大小。 fCalcValidRects = (BOOL) wParam; 有效区域标志 lpncsp = (LPNCCALCSIZE_PARAMS) lParam; // size calculation data 或 lpncsp = (LPRECT) lParam; // new window coordinates wParam为真表示程序应该指定窗口客户区有效部分。 当wParam为真时,lParam是指向一个NCCALCSIZE_PARAMS结构的指针。这个结构包含程序可以计算窗口客户区大小和位置的 信息。当wParam为假时,lParam指向一个RECT结构指针,该结构在处理前包含原本窗口客户区的区域,在返回前,可以 修改这个结构的值以表示窗口客户区的屏幕区域。 详细可以参考VCKBASE的:http://www.vckbase.com/document/viewdoc/?id=1302#创建客户窗口 注:当窗口大小改变时,在处理该消息时,调用GetWindowRect不能得到改变后的窗口大小!! 处理消息时的RECT是基于屏幕坐标
FAQ9: 重载下标操作符 [] 的正确方法-- 重载下标操作符 [] 是很常见的事情,它保存类中元素的顺序。vector 和 string 就是这样的类。在重载操作符[]时,一定要记住定义它的两个版本:非常量版本和常量版本: class MyString { private: char * buff; int size; public: //... char& operator [] (int index) { return buff[index]; } // 非常量版本 const char& operator [] (int index) const { return buff[index]; } // 常量版本 }; 当对象本身是常量时,下标操作符的常量版本被调用。 void f(const MyString& str) { char c = str[0]; // 调用const char& operator [] (int index) const }
FAQ10: 如何打开软键盘-- // m_hWnd 是接受软键盘输入的窗口句柄 ImmSimulateHotKey(m_hWnd, IME_CHOTKEY_IME_NONIME_TOGGLE); HIMC hIMC = ImmGetContext(m_hWnd); DWORD dwConv, dwSent; DWORD dwTemp; ImmGetConversionStatus(hIMC,&dwConv,&dwSent); //dwConv |= IME_CMODE_SOFTKBD; if (dwConv & IME_CMODE_SOFTKBD) dwConv &= ~IME_CMODE_SOFTKBD; else dwConv |= IME_CMODE_SOFTKBD; ImmSetConversionStatus(hIMC,dwConv,dwSent); ImmReleaseContext(m_hWnd,hIMC);
说明:这种方法打开的软键盘,必须先打开某个输入法,即软键盘是基于输入法的。 而且无法更多的控制软键盘,比如移动软键盘的位置。
FAQ11: 如何检查是否连接到网络-- DWORD dwFlag = 0 ; if( !InternetGetConnectedState( &dwFlag , 0 ) ) { // 无法连接到网络 } 如果函数成功返回,dwFlag可以获得当前网络的类型,如LAN或拨号
FAQ12: Tree Ctrl 的check box为什么不能工作?-- 即使设置了TVS_CHECKBOXES风格,在WM_INITDIALOG里调用 SetCheck(true) 仍然没有出现预期的效果,(WTL下用SetCheckState)。原因可能是 WM_INITDIALOG 时,状态图标没有被加载,虽然设置了状态,但没有显示出来。解决方法,在调用 SetCheck 前先调用下面两行代码:Tree.ModifyStyle( TVS_CHECKBOXES, 0 ) ;Tree.ModifyStyle( 0 , TVS_CHECKBOXES ) ;
FAQ13: check box风格的Tree Ctrl 如何响应用户点击check box的消息?-- NM_CLICK , 代码如下: CPoint pt; GetCursorPos(&pt); pTree->ScreenToClient(&pt); UINT flag; HTREEITEM hItem = pTree->HitTest(pt,&flag); if( hItem && flag == TVHT_ONITEMSTATEICON ) { // 鼠标点击了 check box }