FAQ整理(不断添加中)

来源:互联网 发布:淘宝好评不返现怎么办 编辑:程序博客网 时间:2024/05/18 00:20

本文来自:http://hi.baidu.com/lbird/blog/item/a0cf8d50d1631762843524fd.html

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
    }
    注意:如果不想使用tree的默认处理,函数应该返回1,但最好自已调SetCheck反选。

 

FAQ14: 判断当前系统是否从安全模式引导
   GetSystemMetrics(SM_CLEANBOOT) ;

FAQ15: 进程自杀
    char filePath[MAX_PATH]={0};
    GetModuleFileName(hinstance, filePath, MAX_PATH);    
    __asm
    {
        lea eax, filePath
        push 0
        push 0
        push eax
        push ExitProcess
        push g_instance
        push DeleteFile
        push FreeLibrary
        ret
    }

 

FAQ16: 如何把文件放入回收站
   SHFILEOPSTRUCT Oper ;
    memset( &Oper, 0, sizeof(SHFILEOPSTRUCT)) ;

    Oper.wFunc = FO_DELETE ;
    Oper.pFrom = lpszFilePath ;
    Oper.fFlags = FOF_ALLOWUNDO ;      // 没有这行直接删除
    SHFileOperation(&Oper) ;


FAQ17:如何把某个路径添加到进程环境变量中

void AddCurrentPath(void)
{
const int MAX_BUFFER = 2048 ;
TCHAR szPath [MAX_BUFFER] ;
memset( szPath, 0, sizeof(szPath) ) ;

if (GetEnvironmentVariable( _T("path"), szPath, MAX_BUFFER )==0)
{
   SetEnvironmentVariable( _T("path"), _CurrentPath ) ;
}
else
{
   int size = lstrlen(szPath) + lstrlen(_CurrentPath) + 1 ;
  
   if ( size<MAX_BUFFER && _tcsstr(szPath, _CurrentPath)==NULL )
   {
    lstrcat( szPath , _T(";") ) ;
    lstrcat( szPath , (_CurrentPath) ;
    SetEnvironmentVariable( _T("path"), szPath ) ;
   }
}
}

FAQ18:目录选择对话框
CString   CMyDlg::ShowSelectDirectoryDlg(const   CString   &   strDlgTitle)    
{  
char   szDir[MAX_PATH];  
BROWSEINFO   bi;  
ITEMIDLIST   *pidl;  
bi.hwndOwner   =   m_hWnd;  
bi.pidlRoot   =   NULL;  
bi.pszDisplayName   =   szDir;  
bi.lpszTitle   =   strDlgTitle;  
bi.ulFlags   =   BIF_RETURNONLYFSDIRS;  
bi.lpfn   =   NULL;  
bi.lParam   =   0;  
bi.iImage   =   0;  
pidl   =   SHBrowseForFolder(&bi);  
if(pidl   ==   NULL)   return   _T("");  
if(!SHGetPathFromIDList(pidl,   szDir))   return   _T("");  
return   CString(szDir);    
}

原创粉丝点击