FAQ整理(不断添加中)

来源:互联网 发布:手机预装软件卸载 编辑:程序博客网 时间:2024/05/18 00:41

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
   }

原创粉丝点击