VC/MFC 編程技巧大總結


 1 toolbar默認位圖左上角那個點的顏色是透明色,不喜歡的話可以自己改。
  2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 為系統關機消息。
  3 Java學習書推薦:《java編程思想》
  4 在VC下執行DOS命令
   a. system("md c:\\12");
   b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE);
   c. ShellExecute
   ShellExecute(NULL,"open","d:\\WINDOWS\\system32\\cmd.exe","/c md d:\\zzz","",SW_SHOW);
   d. CreateProcess
   下面這個示例的函數可以把給定的DOS命令執行一遍,並把DOS下的輸出內容記錄在buffer中。同時示范了匿名管道重定向輸出的用法:
   -------------------------------------------------------------------------------------
   BOOL CDOSDlg::ExecDosCmd()
   { 
   #define EXECDOSCMD "dir c:" //可以換成你的命令
  
   SECURITY_ATTRIBUTES sa;
   HANDLE hRead,hWrite;
  
   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
   sa.lpSecurityDescriptor = NULL;
   sa.bInheritHandle = TRUE;
   if (!CreatePipe(&hRead,&hWrite,&sa,0)) 
   {
   return FALSE;
   } 
   char command[1024]; //長達1K的命令行,夠用了吧
   strcpy(command,"Cmd.exe /C ");
   strcat(command,EXECDOSCMD);
   STARTUPINFO si;
   PROCESS_INFORMATION pi; 
   si.cb = sizeof(STARTUPINFO);
   GetStartupInfo(&si); 
   si.hStdError = hWrite; //把創建進程的標准錯誤輸出重定向到管道輸入
   si.hStdOutput = hWrite; //把創建進程的標准輸出重定向到管道輸入
   si.wShowWindow = SW_HIDE;
   si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
   //關鍵步驟,CreateProcess函數參數意義請查閱MSDN
   if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,π)) 
   {
   CloseHandle(hWrite);
   CloseHandle(hRead);
   return FALSE;
   }
   CloseHandle(hWrite);
  
   char buffer[4096] = {0}; //用4K的空間來存儲輸出的內容,只要不是顯示文件內容,一般情況下是夠用了。
   DWORD bytesRead; 
   while (true) 
   {
   if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
   break;
   //buffer中就是執行的結果,可以保存到文本,也可以直接輸出
   AfxMessageBox(buffer); //這里是彈出對話框顯示
   }
   CloseHandle(hRead); 
   return TRUE;
   }
   -------------------------------------------------------------------------------------
  5 刪除目錄,包含刪除子文件夾以及其中的內容
   -------------------------------------------------
   BOOL DeleteDirectory(char *DirName)//如刪除 DeleteDirectory("c:\\aaa")
   {
   CFileFind tempFind;
   char tempFileFind[MAX_PATH];
   sprintf(tempFileFind,"%s\\*.*",DirName);
   BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
   while(IsFinded)
   {
   IsFinded=(BOOL)tempFind.FindNextFile();
   if(!tempFind.IsDots())
   {
   char foundFileName[MAX_PATH];
   strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
   if(tempFind.IsDirectory())
   {
   char tempDir[MAX_PATH];
   sprintf(tempDir,"%s\\%s",DirName,foundFileName);
   DeleteDirectory(tempDir);
   }
   else
   {
   char tempFileName[MAX_PATH];
   sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
   DeleteFile(tempFileName);
   }
   }
   }
   tempFind.Close();
   if(!RemoveDirectory(DirName))
   {
   MessageBox(0,"刪除目錄失敗!","警告信息",MB_OK);//比如沒有找到文件夾,刪除失敗,可把此句刪除
   return FALSE;
   }
   return TRUE;
   }
   -------------------------------------------------------------
  6 讓程序暫停:system("PAUSE");
  7 在PreTranslateMessage中捕捉鍵盤事件
  
   if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)return TRUE; //注意return的值
  8 更改按鍵消息(下面的代碼可把回車鍵消息改為TAB鍵消息)
   -------------------------------------------------------
      BOOL CT3Dlg::PreTranslateMessage(MSG* pMsg) 
      {
  
      if(pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam) 
       {
      pMsg->wParam = VK_TAB;
       }
       return CDialog::PreTranslateMessage(pMsg);
      }
   ------------------------------------------
  9 MoveWindow: 一個可以移動、改變窗口位置和大小的函數
  10 16進制轉化成10進制小數的問題
       用一個讀二進制文件的軟件讀文件
       二進制文件中的一段 8F C2 F5 3C 最后變成了 0.03
       請問這是怎么轉換過來的??
     方法一:浮點技術法,如
      DWORD dw=0x3CF5C28F; 
      float d=*(float*)&dw;//0.03;
       方法二:浮點的儲存方式和整數完全兩樣,你想了解的話可以去
           http://www.zahui.com/html/1/3630.htm
          看一看,不過通常我們都不必了解它就可以完成轉換。
          char a[4] = {0x8F, 0xC2, 0xF5, 0x3C};
          float f;
          memcpy(&f,a,sizeof(float));
   TRACE("%d",0x3CF5C28F);
  11 EDIT控件的 EM_SETSEL,EM_REPLACESEL消息
   12 在其它進程中監視鍵盤消息:用SetWindowsHookEx(WH_KEYBOARD_LL,...);
  13 在桌面上任意位置寫字
   --------------------------------------------------
   HDC deskdc = ::GetDC(0);
   CString stext = "我的桌面";
   ::TextOut(deskdc,100,200,stext,stext.GetLength());
   ::ReleaseDC(0,deskdc);
   ------------------------------------------------------
  14 HWND thread_hwnd=Findwindow(NULL,"你要監控的進程窗體(用SPY++看)"),
   if (thread_hwnd==NULL) 。。。。。。。。。。
   else DWORD thread_id=GetWindowThreadProcessId(thread_hwnd,NULL)
  15 waveOutGetVolume()可以得到波形音量大小
  16 隱藏桌面圖標並禁用右鍵功能菜單:
   ------------------------------------
   HWND Hwd = ::FindWindow("Progman", NULL);
   if (bShowed)
   ::ShowWindow(Hwd, SW_HIDE);
   else
   ::ShowWindow(Hwd, SW_SHOW);
   bShowed = !bShowed;
   ---------------------------------------
  17 獲得程序當前路徑:
   ---------------------------------------------
   char ch[256];
   GetModuleFileName(NULL,ch,255);
   for(int i=strlen(ch);i && ch[i]!='\\';i--);
   ch[i]=0;
   AfxMessageBox(ch);
   ----------------------------------------------
  18 KeyboardProc的lParam中包含着許多按鍵信息,其中第31位(從0開始)為0表示是按下按鍵,為1表示松開按鍵。
   (lParam & 0x80000000)進行二進制'與'計算,效果是取第31位的值。
   (lParam & 0x40000000)是取第30位,30位表示按鍵的上一個狀態,為1表示之前鍵已經是按下的,0表示松開。
    lParam
    [in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values. 
    0-15
    Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.
    16-23
    Specifies the scan code. The value depends on the OEM.
    24
    Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
    25-28
    Reserved.
    29
    Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
    30
    Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
    31
    Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
  19 復制文件應該用到CopyFile或是CopyFileEx這兩個API
  20 移動窗口的位置或改變大小:MoveWindow/SetWindowPos
  21 我的程序是當前運行的程序時,可以用setcursor()來設置光標的圖標。
   而且可以用setcapture()是鼠標移動到我得程序窗口之外時也是我設置的圖標
   但是如果我得程序不是當前的運行程序的,鼠標就會變會默認的。
   怎樣能夠,使得不變回默認的,還是用我設置的光標?
   SetSystemCursor
  22 SendMessage函數的幾個用法:
   控制按鈕按下的,是這么用的
   SendMessage(n1, WM_COMMAND, MAKELPARAM(ID,BN_CLICKED),(LPARAM )n2); (n1,n2是句柄)
   而得到文本內容,是這樣用的,
   SendMessage(hWnd,WM_GETTEXT,10,(LPARAM)buf),
  23 處理一個單行EDIT的WM_CTLCOLOR要同時響應nCtlColor = CTLCOLOR_EDIT和CTLCOLOR_MSGBOX的兩個情況,參考http://msdn.microsoft.com/library /default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.onctlcolor.asp
  24 設備發生改變處理函數可在CWnd::OnDeviceChange中,捕獲WMDEVICECHANGE事件不能區分諸如設備插入、拔下消息。
  25 把字符"abc\n123"存入文本文件中時,文件內容沒看見換行,其實用word打開該文件是有換行的。另外用"abc\r\n123"代替也可看見換行。
  26 ::SetFocus(::GetDesktopWindow()); 或::BringWindowToTop(::GetDesktopWindow());
    ::GetDesktopWindow()這里可獲得桌面窗口的句柄
  27 數組初始化:
   int a[24][34]; //聲明數組
   memset(a,-1,24*34); //全部元素初始化成-1,但初始化成除0和-1以外的數值是不行的
  28 SHGetFileInfo函數可獲得文件信息。
   29 創建一個控件:
   HWND hEdit=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE |ES_LEFT,50,20,50,20,hwnd,NULL,hInst,NULL); //hwnd參數為父窗口句柄
  30 VC中對聲音文件的操作:http://www.pujiwang.com/twice /Article_Print.asp?ArticleID=550
  31 調用其它程序又要隱藏窗口:用CreateProcess函數調用,再拿到窗口句柄,然后::ShowWindow(hWnd,SW_HIDE);
  32 讀取文本文件中的一行:
     用CFile類的派生類:CStdioFile的方法:CStdioFile::ReadString
  33 刪除非空文件夾:
   ------------------------------------------------
   SHFILEOPSTRUCT shfileop; 
   shfileop.hwnd = NULL; 
   shfileop.wFunc = FO_DELETE ; 
   shfileop.fFlags = FOF_SILENT|FOF_NOCONFIRMATION; 
   shfileop.pFrom = "c:\\temp"; //要刪除的文件夾
   shfileop.pTo = ""; 
   shfileop.lpszProgressTitle = ""; 
   shfileop.fAnyOperationsAborted = TRUE; 
   int nOK = SHFileOperation(&shfileop); 
   -------------------------------------------------
  34 函數前面加上::是什么意思?
     叫域運算符...在MFC中表示調用API...或其它全局函數...為了區分是mfc函數還是api
     詳見:http://search.csdn.net/Expert/topic/1183 /1183492.xml?temp=.9471247
  35 CImageList的用法:http://www.study888.com/computer/pro/vc/desktop/200506 /39027.html
  36 有關控件的一些常見問答:
   http://fxstudio.nease.net/article/ocx/ <==========================很不錯的地方哦
  37 在多文檔客戶區中增加位圖底圖演示程序: 
   http://www.study888.com/computer/pro/vc/desktop/200506/39028.html
   我的對應工程:AddBackgroundBitmap
  38 用VC++6.0實現PC機與單片機之間串行通信
   http://www.zahui.com/html/1/1710.htm
  39 日期到字符串:
   --------------------------------------------------
   SYSTEMTIME sys;
   GetSystemTime(&sys);
   char str[100];
   sprintf(str,"%d%d%d_%d%d%d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour+8,sys.wMinute,sys.wSecond);
   //這里的小時數注意它的0:00點是早上8:00,所以要加上8,因為這是格林威治時間,換成我國時區要加8
   --------------------------------------------------
   CString m_strTemp;
   SYSTEMTIME systemtime;
   GetLocalTime(&systemtime); //這個函數可獲得毫秒級的當前時間
   m_strTemp.Format("%d年%d月%d日%d:%d:%d:%d 星期%d",systemtime.wYear,systemtime.wMonth,systemtime.wDay,systemtime.wHour,systemtime.wMinute,systemtime.wSecond,systemtime.wMilliseconds,systemtime.wDayOfWeek);
   --------------------------------------------------
  40 任務欄上的圖標閃爍:
     The FlashWindow function flashes the specified window once, whereas the FlashWindowEx function flashes a specified number of times. 
  
   BOOL FlashWindow(
   HWND hWnd, // handle to window to flash
   BOOL bInvert // flash status
   );//閃爍一次
   FlashWindowEx()//閃爍多次
  41 十六進制字符轉浮點數:http://community.csdn.net/Expert/topic/4379 /4379713.xml?temp=.7092096
     long lValue = 0xB28A43;
   float fValue;
   memcpy(&fValue,&lValue,sizeof(float));
  42 在一個由漢字組成的字符串里,由於一個漢字由兩個字節組成,怎樣判斷其中一個字節是漢字的第一個字節,還是第二個字節,使用IsDBCSLeadByte 函數能夠判斷一個字符是否是雙字的第一個字節,試試看:) 
   _ismbslead 
   _ismbstrail
   43 如何實現對話框面板上的控件隨着對話框大小變化自動調整
     在OnSize中依其比例用MoveWindow同等縮放.http://www.codeproject.com/dialog/dlgresizearticle.asp
  44 向 CListCtrl中插入數據后,它總是先縱向再橫向顯示,我希望他先橫向再縱向
   在CListCtrl的ReDraw()中處理(見http://community.csdn.net/Expert/topic/4383 /4383963.xml?temp=.3442041)
   如:
   m_list.ReDraw(FALSE);
   m_list.ReDraw(TRUE);
  45 給你的程序加上splash:http://www.vckbase.com/document/finddoc.asp?keyword=splash
   如何添加閃屏:Project->Add to Project->Components and Controls->Gallery\\Visual C++ Components->Splash screen
  46 實現象快速啟動欄的"顯示/隱藏桌面"一樣的功能:http://fxstudio.nease.net/article/form/55.txt
  47 如何設置listview某行的顏色:
     CSDN上的貼子:http://community.csdn.net/Expert /topic/4386/4386904.xml?temp=2.422512E-03
     Codeguru上相關鏈接:http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c1093/
  48 如何得到窗口標題欄尺寸:http://community.csdn.net/Expert /topic/4387/4387830.xml?temp=.6934168
   GetSystemMetrics(SM_CYCAPTION或者SM_CYSMCAPTION);
  
   SM_CYCAPTION Height of a caption area, in pixels. 
   SM_CYSMCAPTION Height of a small caption, in pixels.
   --------------------------------------------------------
   GetWindowRect(&rect);
   rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) + 3;
   --------------------------------------------------------
  49 如何將16進制的byte轉成CString:
   ---------------------------------
   BYTE p[3];
   p[0]=0x01;
   p[1]=0x02;
   p[2]=0x12;
   CString str;
   str.Format("%02x%02x%02x", p[0], p[1], p[2]);
   -------------------------------------
  50 怎樣查找到正處在鼠標下面的窗口(具體到子窗口和菜單),無論是這個窗口是否具有焦點:
   -----------------------------------------------------------
   POINT pt;
   CWnd* hWnd; // Find out which window owns the cursor
   GetCursorPos(&pt);
   hWnd=CWnd::WindowFromPoint(pt);
   if(hWnd==this)
   {
   //鼠標在窗體中空白處,即不在任何控件或子窗口當中
   }
  
  51 得到CListCtrl控件點擊事件時點擊的位置:
   -----------------------------------------------
   void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
   {NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
   if(pNMListView->iItem != -1)
   {
   CString strtemp;
   strtemp.Format("單擊的是第%d行第%d列", 
   pNMListView->iItem, pNMListView->iSubItem);
   AfxMessageBox(strtemp);
   }
   *pResult = 0;
   }
   ------------------------------------------------
  52 如何在clistctrl的單元格里添加圖片?http://community.csdn.net/Expert/topic/4388 /4388748.xml?temp=.2233393
  
  53 自己處理按鍵響應函數:
   -------------------------------------------------
   BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg) 
   {
   if( pMsg->message == WM_KEYDOWN )
   { 
   if(pMsg->hwnd == GetDlgItem(IDC_EDIT1)->m_hWnd) //判斷當前控件是不是編輯框
   {
   switch( pMsg->wParam )
   {
   case VK_RETURN: //如果是回車鍵的話
   Onbutton1(); //就調用Button1的響應函數
   }
   }
   return CDialog::PreTranslateMessage(pMsg);
   }
   ---------------------------------------------------
  54 如何在VC中操縱word:http://www.vckbase.com/document/viewdoc/?id=1174
  55 兩個像素(用RGB表示)如何確定亮度等級: 
   加權算出灰度值:R*0.21+Green*0.70+Blue*0.09,或:
   ((紅色值 X 299) + (綠色值 X 587) + (藍色值 X 114)) / 1000
  56 對已畫在CDC上的圖片進行處理,實現任意比例的透明度。
   MSDN:http://msdn.microsoft.com/msdnmag/issues/05/12/CatWork/
  實現方法是:
  1、用GetCurrentBitmap得到DC上的CBitmap指針;
  2、用GetBitmapBits得到CBitmap上的圖像數據流;
  3、對圖像數據流中每個字節進行轉換,轉換的公式為
   pBits[i] += (255 - pBits[i]) * nTransparent / 100;//nTransparent為透明度的百分率
  
  57 MFC很多API函數的源代碼都在:VC安裝目錄\VC98\MFC\SCR\WINCORE.cpp文件中。
  58 自己寫了個函數,用來獲得ANSI字符串中真實字符的個數,如“I服了U”的長度返回4:
   --------------------------------------------------
   int GetCount(CString str)
   {
   int total=0;
   for(int i=0;i
   {
   if (127<(unsigned int)str.GetAt(i))
   {
   total++;
   i++;
   }
   else
   total++;
   }
   return total;
   }
   ----------------------------------------------------
  59 消息傳遞中pMSG中一些參數的意義:
   hwnd-------接收消息的窗口句柄;
   message----發送的消息號;
   wParam-----消息參數,具體意義同發送的消息有關;
   lParam-----同上;
   time-------發送消息時的時間,數值大小為自系統啟動以來經歷的時間,單位是毫秒;
   pt---------發送消息時鼠標在屏幕上的絕對坐標,單位是像素。
  60 刷新屏幕局部:
  刷新控件區域:
  控件 ID:IDC_STATIC_STATIC
   ------------------------------------
   CRect static_rect;
   CWnd *pwnd = GetDlgItem(IDC_STATIC_STATIC);
   if (pwnd == NULL)
   {
   return;
   }
   pwnd->GetWindowRect(&static_rect);
   ScreenToClient(&static_rect);
   InvalidateRect(&static_rect); //注意這個函數,會調用OnEraseBkgnd
   --------------------------------------
  61 VC實現錄音,放音,保存,打開功能: http://www.pconline.com.cn/pcedu/empolder/gj/vc/0412/509819.html
  62 獲得任務欄高度:
   ----------------------------------
   HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
   RECT rc;
   ::GetWindowRect(hWnd, &rc);
   int iHeight = rc.bottom -rc.top;
   -----------------------------------
  63 vc控制word、excel的問題:http://msdn.microsoft.com/library/default.asp?url= /library/en-us/dnoxpta/html/vsofficedev.asp
   下面還有范例兩個:
           http://www.vckbase.com/code/downcode.asp?id=2415
            http://www.vckbase.com/code/downcode.asp?id=2397
  
  64 給ListBox控件加上水平滾動條:m_list.SetHorizontalExtent(100); //m_list為和listbox控件綁定的CListBox變量
  65 下拉式的工具條按鈕:http://community.csdn.net/Expert/topic/4413 /4413094.xml?temp=.2334864
  66 如何讓MFC基於Dialog的程序在任務欄中顯示:http://community.csdn.net/Expert/topic/4413/4413492.xml?temp=.3407404
  67 制作一個沒有標題欄.菜單欄和工具欄的視窗,就象游戲界面一樣:
      http://community.csdn.net/Expert/topic/4396/4396239.xml?temp=.568783
  68 為何組合框Droplist風格時響應鍵盤PreTranslateMessage函數,而dropdown風格時不響應:
      http://community.csdn.net/Expert/topic/4412/4412791.xml?temp=.8741419
  69 直接用特殊字符的編碼:s=WCHAR(0x00e6); //還沒試過
  70 在標題欄上畫圖:http://community.csdn.net/Expert/topic/4416/4416434.xml?temp=.8910944
  71 如何精確延時:http://www.vckbase.com/document/viewdoc/?id=1301
  72 怎樣給 TreeView控件中的結點重命名:http://community.csdn.net/Expert/topic/4409 /4409069.xml?temp=.1730463
  73 從內存中加載並啟動一個exe :http://community.csdn.net/Expert/topic/4418/4418306.xml?temp=.7619135
  74 修改一個EXE的資源:http://community.csdn.net/Expert/topic/4420 /4420755.xml?temp=.5104029
  75 使用並顯示64bit數值的方法:
      __int64 ld = 2000000000*4500000000; //64bit數的范圍:-9223372036854775808~+9223372036854775807
   printf("%I64d\n",ld);
  76 在程序中使用console窗口顯示:http://www.codeguru.com /Cpp/W-D/console/
   在里面找一下:Redirection
  77 用代碼畫鼠標圖案並限定鼠標移動區域(用 ClipCursor函數):
       http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/cursors/usingcursors.asp
  78 改變編輯框字體的大小:http://community.csdn.net/Expert/topic/4389 /4389148.xml?temp=.2317163
    先在對話框類的內部聲明一個CFont對象,如:CFont myfont;
   ---------------------------------
   myfont.CreatePointFont(500, "Arial");
   GetDlgItem(IDC_EDIT1)->SetFont(&myfont);
   ---------------------------------
  79 bmp圖片怎么轉換為jpg:
    用cximage
    www.codeproject.com上有
  80 字符串轉成UTF-8格式參考CSDN上的 FAQ:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=191432
  81  將16進制字符串轉換成10進制整數:
     char a[3]="ab";
     DWORD val = strtoul(a, NULL, 16);
  82 快速從數字的字符串中提取出特定長度的數字:
   -------------------------------------------------------
   int a[4];
   sscanf("2004115819185","%07d%02d%02d%02d",&a[0],&a[1],&a[2],&a[3]); //按指定長度分隔
   --------------------------------------------------------
    或:
   -------------------------------------------------------
   CString s="aaa,bbb,ccc,ddd";
   char a1[4],a2[4],a3[4],a4[4]; //這里要注意多留點空間以存放各子串的長度
   sscanf(s,"%[^,],%[^,],%[^,],%[^,]",a1,a2,a3,a4); //按指定字符(這里是逗號)分隔
   AfxMessageBox(a4);//顯示ddd
   -------------------------------------------------------
  83 配置文件的配置項可不可以刪除:http://community.csdn.net/Expert/topic/4402 /4402346.xml?temp=.4008448
  84 如何改變CListCtrl包括Scrollbars和Column Headers的顏色和風格:http://www.codeguru.com/Cpp/controls/listview /backgroundcolorandimage/print.php/c4185/
  85 根據ComboBox加入的字符串的長度自動調整ComboBox控件的寬度:
    //這里假設為ComboBox加入兩個字符串
    CString str1="中華人民共和國中華人民共和國",str2="1234567890123中國89012345678";
     m_combo.AddString(str1); //m_combo為綁定在組合框控件的變量
     m_combo.AddString(str2);
    int len=str1.GetLength()*6.2; //根據加入的字符串長度(以字節為單位)和組合框使用的默認字體的大小計算組合框實際需要的寬度,計算中間用到了整數->浮點數->整數的兩次數值類型隱式轉換,也可以用winAPI函數GetTextExtentPoint32()或GetTextExtent計算
     m_combo.SetDroppedWidth(len);
  86 彈出U盤:http://community.csdn.net /Expert/topic/4432/4432968.xml?temp=.8724634
  87 往另一個程序的編輯框中發送文字:句柄 ->SendMessage(WM_SETTEXT,strlen(buf),(LPARAM)buf); //buf為你要加入的char*
  88 如何在RichEdit中加超鏈接:http://community.csdn.net /Expert/topic/4434/4434686.xml?temp=9.524173E-02
  89 VC控件的用法:http://www.vckbase.com/document/indexold.html
  90 學習資源:http://code.ddvip.net/list/sort000081_1.html
  91 在初始時候定位到LIST的指定行 (如第100行)開始顯示:EnsureVisible(100) //未驗證
  92 如何在app中 SetTimer():http://community.csdn.net/Expert/topic/4437 /4437002.xml?temp=6.014651E-02
                http://search.csdn.net/Expert/topic/1422/1422546.xml?temp=.5501825
   93 一個基於SDK的軟鍵盤的范例,可以學習如何發送虛擬按鍵或鼠標消息:http://www.codeproject.com/cpp/togglekeys.asp
  94 MDI文檔中的字體、及其顏色怎么設置:http://community.csdn.net /Expert/topic/4396/4396003.xml?temp=.7866938
  95 自己捕捉特定的組合鍵:http://community.csdn.net/Expert/topic/4439/4439270.xml?temp=.7411157
   http://community.csdn.net/Expert/topic/4484/4484120.xml?temp=.3993799
   --------------------------------------------------------------
   BOOL CMMDlg::PreTranslateMessage(MSG* pMsg) 
   {
   // TODO: Add your specialized code here and/or call the base class
   BOOL b = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(short) * 8)-1);
   if(b)
   { 
   b = GetAsyncKeyState(VK_MENU) >> ((sizeof(short) * 8)-1);
   if(b)
   { 
   b = GetAsyncKeyState(65) >> ((sizeof(short) * 8)-1); //這里不分大小寫
   if(b)
   {
   AfxMessageBox("你按下了Ctrl+Alt+A組合鍵。") ;
   }
   }
   }
   
   return CDialog::PreTranslateMessage(pMsg);
   }
   -------------------------------------------------------------
   另外,GetAsyncKeyState和::GetKeyState這兩個函數也可以幫你檢測Shift、Ctrl和Alt這些鍵的狀態。
   96 快速從得到的全路徑文件名中分離出盤符、路徑名、文件名和后綴名:
   ------------------------------------------------
   char path_buffer[_MAX_PATH]; 
   char drive[_MAX_DRIVE]; 
   char dir[_MAX_DIR];
   char fname[_MAX_FNAME]; 
   char ext[_MAX_EXT];
   GetModuleFileName(0,path_buffer,_MAX_PATH);
   _splitpath( path_buffer, drive, dir,fname , ext); //用這個函數轉換
   ------------------------------------------------
  97 如何debug除零錯誤:http://community.csdn.net/Expert/topic/4440/4440273.xml?temp=.2427484
  98 修改VS.net“工具”欄中菜單的默認圖標:http://www.codeproject.com/dotnet/vsnet_addin_icon_change.asp
  99 在窗口的標題欄和菜單欄上象realplayer那樣添加自己的 logo:http://www.codeproject.com/menu/menuicon.asp
  100 個性化的位圖菜單,自己從 CMenu派生子類實現:http://www.codeguru.com/Cpp/controls/menu/bitmappedmenus /article.php/c165
   http://www.codeguru.com/Cpp/controls/menu/bitmappedmenus/article.php/c163
  101 怎樣取得程序自己占用的內存和CPU占用率:GetProcessMemoryInfo和GetPerformanceInfo
   102 如何讓你的程序運行在release模式下:build->set active configuration
  103 監視文件夾是否被更新:FindFirstChangeNotification、FindNextChangeNotification、 FindCloseChangeNotification這三個函數
   范例見:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/obtaining_directory_change_notifications.asp
  105 動態菜單:http://community.csdn.net/Expert/topic/4441/4441893.xml?temp=.2887384
   http://community.csdn.net/Expert/topic/4506/4506791.xml?temp=.2409326
  106 如何獲取客戶區的中心坐標:http://community.csdn.net/Expert/topic/4449 /4449444.xml?temp=8.642215E-02
  107 強行操作內存虛擬地址中某個指定地方的內容:
   ----------------------------------------------
      int *a=(int*)0x00440000; //這里以訪問0x00440000地址為例
   cout<<*a<
   ----------------------------------------------
  108 如何響應條碼機:http://community.csdn.net/Expert/topic/4453/4453026.xml?temp=.1966516
       條碼掃描儀主要有三種接口: 1.RS232 2.共用接盤接口 3.USB外設. 對於RS232,需要編程來監視和讀取條碼; 對於共用接盤接口,條碼信息被轉換成相應的鍵盤消息,具有輸入焦點的應用程序會收到鍵盤輸入消息,我們以前的做法是做一個全局keyboard Hook或應用程序級別上 keyboard hook, 監視鍵盤消息,當有連續的鍵盤消息(在很短的時間內),並且這些鍵盤字符能構成完成的條碼信息,就產生一條自定義消息,通知窗口(向監視程序注冊的窗口) 條碼信息到達,條碼機只是相當於一個鍵盤,所以你也可以在界面上放一個edit框,條碼機讀出條碼后還會在字符串后面加一個回車(這個一般是可設置的,可加可不加),如果條碼機自動加回車,則你重寫OnOK函數,將edit框的內容取出放入list即可。
  
  當然也可不放edit框,而直接接收鍵盤字符(比如重寫OnChar函數等,方法很多),但要考慮到這種情況:條碼讀不出來的情況,此時應該用手動輸入條碼,所以還是放一個 edit框為好。
  
  109 檢查指定文件夾是否存在:PathIsDirectory()
   方法一:
   檢查給定路徑是否根目錄:BOOL PathIsRoot(LPCTSTR pPath);
   說明:Returns TRUE for paths such as “\”, “ X:\”, “\\ server\ share”, or “\\ server\”。Paths such as “..\path2” will return FALSE.
       用這兩個函數要先:#include ;
   再把這個文件加入工程:shlwapi.lib
   方法二:
   GetFileAttributes檢查文件是否存在,並且檢查是否文件夾屬性FILE_ATTRIBUTE_DIRECTORY
   ----------------------------------------------------------
   DWORD = GetFileAttributes(_T("f:\\win98"));
   if(dwAttr != 0xFFFFFFFF && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
   cout<<"exist"<
   else
   cout<<"NOT exist"<
   ----------------------------------------------------------
   方法三:
   用下面第113條的_access函數同樣可以
   ----------------------------------------------------------
   if(_access("f:\\win98",0)!=-1)
   cout<<"exist"<
   else
   cout<<"NOT exist"<
   ----------------------------------------------------------
   方法四:
   用PathFileExists函數,見MSDN介紹,需要的條件同方法一。
   還有一個:BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath);
     Converts an item identifier list to a file system path.
  110 去掉單文檔標題欄上的“無標題— ”:http://community.csdn.net/Expert/topic/4454/4454093.xml?temp=.2896997
  111 打開顯示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, -1); //從bobob的blog上抄來的^_^
     關閉顯示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, 1); //從bobob的blog上抄來的^_^
     得到它的工作狀態:
  休眠狀態是指用SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1)關閉的
   --------------------------------------------------------------------------------
  The GetDevicePowerState function is supposed to retrieve the current power state of the specified device. However, Apps may fail to use GetDevicePowerState on the display, as they can't get a handle on "\\.\Display#", while the # index is 1-based, or "\\.\LCD", for security reasons. 
  If you are trying to do this on Windows XP, then you can use SetupDiGetDeviceRegistryProperty and Property: SPDRP_DEVICE_POWER_DATA to get the power management information. This is documented in the Windows XP DDK. 
  The WMI Class Win32_DesktopMonitor does not report the power state. use SPI_GETPOWEROFFACTIVE or DeviceIOControl with IOCTL_VIDEO_GET_POWER_MANAGEMENT will simply reports power management is enabled or not. SPI_GETPOWEROFFACTIVE just determines whether the power-off phase of screen saving is enabled or not.
  BTW, you can always use the SetThreadExecutionState or other APIs (you have used) to switch ON the monitor no matter the monitor is in the ON or OFF state. 
  References
   http://msdn.microsoft.com/library/en-us/Display_r/hh/Display_r/VideoMiniport_Functions_b47b2224-5e0b-44af-9d04-107ff1299381.xml.asp
   http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_desktopmonitor.asp
  112 得到系統時間、語言等的設置
   GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, lpLCData, cchData); //從bobob的blog上抄來的^_^
  113 文件是否存在 (記得先包含頭文件#include )
   ----------------------------------
   if(_access("c:\\somefile.txt",0)!=-1)
   //存在
   else
   //不存在
   ---------------------------------
   還有一個方法:
   ---------------------------------------------
   if(GetFileAttributes("f:\\test.txt")!=0xFFFFFFFF)
   {
   //存在
   }
   else
   {
   //不存在
   }
   ---------------------------------------------
  114 得到剪貼板數據
   -------------------------------------------------
   if ( OpenClipboard() ) 
   {
   HANDLE hData = GetClipboardData(CF_TEXT);
   char * buffer = (char*)GlobalLock(hData); //剪貼板中的文本內容保存在buffer中
   GlobalUnlock(hData);
   CloseClipboard();
   }
   ----------------------------------------------
  115 在CStatic上面關聯圖片
   ----------------------------------------------
   CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC);
   pWnd->ModifyStyle(0, SS_BITMAP);
   pWnd->SetBitmap((HBITMAP)::LoadImage(0,
   "c:\\zzzzz.bmp", //只能顯示.bmp文件
   IMAGE_BITMAP,
   0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));
   ----------------------------------------------
  116 顯示一個打開文件夾的對話框,並得到用戶選擇的目錄:
   -------------------------------------------
   char szDir[MAX_PATH];
   BROWSEINFO bi;
   ITEMIDLIST *pidl;
   bi.hwndOwner = this->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;
   if(!SHGetPathFromIDList(pidl, szDir)) 
   return;
   AfxMessageBox(szDir); //szDir中存放的內容為用戶選定的目錄
   ------------------------------------------------
  117 去除字符串中指定的字符:
   -----------------------------------------
   CString strtemp;
   strtemp.Format("%s","abc\n123\ndef");
   strtemp.Remove('\n'); //這里以去除換行符為例,結果保存在strtemp中了
   -------------------------------------------
  118 有關數據結構的地址:http://student.zjzk.cn/course_ware/data_structure/web/main.htm
   119 假如當前時間2005-09-09,如何計算在該時間前12345天,是哪年哪月哪日?
   ---------------------------
   CTime tm(2005,9,9,0,0,0);
   tm-=86400*12345;
   cout<<
   ----------------------------
  120 PeekMessage是干什么用的: http://community.csdn.net/Expert/topic/4462/4462828.xml?temp=.8852045
  121 拖動控件時實現類似windows拖動窗口的效果:CRectTracker
   Mackz朋友的blog中有它的范例:http://blog.csdn.net/Mackz/archive/2005/10/27 /517747.aspx
  122 有關UNICODE、ANSI字符集和相關字符串操作的總結:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=199372
  123 尋找系統中的打印機:EnumPrinters 
  124 用代碼加入外部模塊的方法:#pragma comment(lib,"mylib.lib")
  125 判斷指定點是否在一個矩形框內:CRect::PtInRect(POINT point)
  126 winAPI 函數GetTextExtentPoint32()可以得出一個以像素為單位的字符串的寬度。
  127 RGB轉換成YV12(YUV 4:2:0)的方法:http://www.fourcc.org/fccyvrgb.php
   128 獲得指定進程占用內存的情況,用GetProcessMemoryInfo()函數。
  129 把CONSOLE程序的輸出導入到文件中,用程序控制:http://community.csdn.net/Expert/topic/4403/4403431.xml?temp=.7469599
   http://www.codeproject.com/dialog/quickwin.asp
  130 把 CRichEditCtrl中的文字保存到rtf文件:http://community.csdn.net/Expert/topic/4478 /4478640.xml?temp=.1313135 
     在codeproject上還有從CRichEditCtrl類派生新類的,功能增強了很多:http://www.codeproject.com/richedit/autoricheditctrl.asp
     還有一個開發類似寫字板那樣程序的完整范例:http://www.codeproject.com/tools/simplewordpad.asp
  131 MFC中使用ATL字符轉換宏:在你的函數開關加上USES_CONVERSION;語句,詳見MSDN或這里:http://community.csdn.net/Expert/topic/4479/4479609.xml?temp=.6256983
  132 如何建立共享目錄:直接調用標准的Win32API函數NetShareAdd和NetShareDel
     詳見MSDN 及:http://community.csdn.net/Expert/topic/4481/4481371.xml?temp=.4405023
  133 位圖文件讀寫基礎:http://www.vckbase.com/document/viewdoc/?id=674
  134 用 VC實現支持多語言的程序:http://www.vckbase.com/document/viewdoc/?id=1102 //還沒試過,以后用到了再仔細研究吧
  135 Menu系列函數:
   GetMenu
   GetMenuInfo
   GetMenuItemCount
   GetMenuItemID
   GetMenuString
   EnableMenuItem 
   CheckMenuItem
   ModifyMenu
   RemoveMenu
   InsertMenu
   GetSystemMenu
   ::LoadMenu
   ::SetMenu
  136 得到 SYSTEMMENU(系統菜單)的高度:GetSystemMetrics(SM_CYMENU);
     得到當前屏幕分辨率:
   GetSystemMetrics(SM_CXFULLSCREEN); //得x值(如1024)
   GetSystemMetrics(SM_CYFULLSCREEN); //得y值( 如768-任務欄高度)
   此外這個函數還可以得到很多別的系統設置值,詳見MSDN:http://msdn.microsoft.com/library /default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp
   137 在屬性頁控件的標簽上加圖片:http://www.codeguru.com/cpp/controls/propertysheet/article.php/c611/
   http://community.csdn.net/Expert/topic/4492/4492593.xml?temp=.9977991
   --------------------------------------------------
   BOOL CMyPropSheet::OnInitDialog()
   {
   BOOL bResult = CPropertySheet::OnInitDialog();
   m_imageTab.Create( IDB_TABIMAGES, 13, 1, RGB(255,255,255) );
   CTabCtrl *pTab = GetTabControl();
   pTab->SetImageList( &m_imageTab );
  
   TC_ITEM tcItem;
   tcItem.mask = TCIF_IMAGE;
   for( int i = 0; i < 3; i++ )
   {
   tcItem.iImage = i;
   pTab->SetItem( i, &tcItem );
   }
   return bResult;
   }
   ----------------------------------------------------
  138 這里有很多 CRichEditCtrl控件的高級用法:http://www.codeguru.com/Cpp/controls/richedit/
  139 CGridCtrl控件的一些應用:http://www.vckbase.com/code/listcode.asp?mclsid=3& amp;sclsid=327
  140 一個不錯的地方:http://www.vckbase.com/document /listdoc.asp?mclsid=3&sclsid=323
  141 怎樣使右鍵菜單也能變灰、打勾:http://community.csdn.net/Expert/topic/4501/4501123.xml?temp=.4074823
  142 MD5加密解密的API:http://community.csdn.net/Expert/topic/4502 /4502325.xml?temp=.6894647
   MD5Init
   MD5Final
   MD5Update
  143 用CBrush::CreateStockObject(HOLLOW_BRUSH);或 CBrush::CreateStockObject(NULL_BRUSH);這兩個可以創建鏤空的畫刷。
  144 創建不規則窗體:http://www.vckbase.com/document/viewdoc/?id=1345
  145 拖動一個沒有標題欄的窗體:http://community.csdn.net/Expert/topic/4499 /4499796.xml?temp=6.763858E-02
  146 屏蔽瀏覽器中的彈出廣告,下面地址中是在ATL中采用BHO服務的方法:http://www.codeproject.com/atl/popupblocker2.asp
   CSDN上有個討論貼:http://community.csdn.net/Expert/topic/4496 /4496918.xml?temp=.157284
  147 遠程線程注入:
   http://www.codeproject.com/threads/RmThread.asp
   http://www.codeproject.com/library/InjLib.asp
   http://www.codeproject.com/win32/Remote.asp
  148 CEditView中兩個函數的用法:
   GetEditCtrl().ModifyStyle (0 , WS_VSCROLL |ES_AUTOHSCROLL |ES_AUTOVSCROLL |WS_HSCROLL |ES_WANTRETURN | ES_MULTILINE);
   GetEditCtrl().GetSel(m_nStartChar, m_nEndChar ) ;
  149 給對話框窗體底部加上狀態條,把下面代碼加進對話框的OnInitDialog()函數中:
   -----------------------------------------------------------
   static UINT indicators[] =
   {
   ID_SEPARATOR, // status line indicator
   ID_INDICATOR_CAPS,
   ID_INDICATOR_NUM,
   ID_INDICATOR_SCRL,
   }; 
   //下面m_wndStatusBar必須先在對話框類中聲明:CStatusBar m_wndStatusBar;
   if (!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|WS_BORDER)||
   !m_wndStatusBar.SetIndicators(indicators,
   sizeof(indicators)/sizeof(UINT)))
   {
   AfxMessageBox("Status Bar not created!", NULL, MB_OK );
   
   }
   CRect rect;
   this->GetWindowRect(&rect);
   m_wndStatusBar.MoveWindow(2,rect.bottom-GetSystemMetrics(SM_CYSIZE)-27,rect.Width()-4,20);
   m_wndStatusBar.ShowWindow(SW_SHOW);
   m_wndStatusBar.SetWindowText("Ready");
   -----------------------------------------------------------
   把上面代碼加在OnInitDialog里,注意:m_wndStatusBar變量的聲明語句CStatusBar m_wndStatusBar;要放在你的對話框類C****Dlg中才行。
  150 從注冊表中讀取cpu的頻率:
   讀取 ~MHz 這個鍵值 ,記住那鍵前有個~別忘了,在注冊表的HKEY_LOCAL_MACHINE\\Hardware\\Description\\System \\CentralProcessor\\0 //0 為第一個cpu
   Hardware\\Description\\System\\CentralProcessor\\1 //1 為第二個cpu
    得到cpu的數量,摘自:http://community.csdn.net/Expert/topic/4635 /4635246.xml?temp=.7182123
   -----------------------------------------------------------------------
   SYSTEM_INFO siSysInfo;
   GetSystemInfo(&siSysInfo); 
   printf(" Number of processors: %u\n", siSysInfo.dwNumberOfProcessors);
   -----------------------------------------------------------------------
  151 改變CStatic控件的前景、背景色:http://community.csdn.net/Expert/topic/4507 /4507710.xml?temp=.1524164
   處理WM_CTLCOLOR消息:
   ---------------------------------------------------------------------
   HBRUSH CQQDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
   {
   HBRUSH hbr;
   
   // TODO: Change any attributes of the DC here
   if(CTLCOLOR_STATIC == nCtlColor)
   //if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID()==IDC_TOOL) //改成這樣就只對IDC_TOOL這一個靜態文本控件起作用了
   {
   pDC->SetBkColor(RGB(255,255,255)); //背景色為白
   pDC->SetTextColor(RGB(0,0,0)); //前景色為黑
   hbr = CreateSolidBrush(RGB(255,255,255)); //其它區域也為白
   //上面三行代碼改成下面這三行就創建空心刷子,就可以實現在背景上寫字的效果了
   //pDC->SetBkMode(TRANSPARENT);
   //pDC->SetTextColor(RGB(0,0,0));
   //hbr = CreateStockObject(NULL_BRUSH); 
   }
   else
   hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   // TODO: Return a different brush if the default is not desired
   return hbr;
   }
   ----------------------------------------------------------------------
   再加一個判斷if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改變哪個的顏色了,其它控件的顏色的改變方法和這個大同小異。
  152 怎樣獲得字體得寬度,高度,間距等信息:GetTextMetrics
  153 為了讓你對i++有個更清楚的認識,先看如下代碼:
   -------------------
   int i=2;
   i=(i++) % 3;
   printf("i=%d",i); //這里輸出i=?呢
   -------------------
   下面是前兩行代碼的匯編代碼:
   ------------------------------------------------------------------------------------------------------------------
   00401778 mov dword ptr [ebp-4],2 把值2寫入內存中[ebp-4]指向的位置(后面稱變量i) //相當於i=2
   0040177F mov eax,dword ptr [ebp-4] 把i的當前值2賦於eax中 //把eax當成了i的臨時變量了
   00401782 cdq
   00401783 mov ecx,3 把3賦於ecx中 //同樣ecx也成了臨時變量了
   00401788 idiv eax,ecx eax % ecx(2%3),結果放入edx中(等於2)
   0040178A mov dword ptr [ebp-4],edx 把edx中的值2寫入變量i //相當於計算i=2 % 3 
   0040178D mov edx,dword ptr [ebp-4] 把i的值2賦於edx //現在edx成了i的臨時變量
   00401790 add edx,1 edx中的值加上1
   00401793 mov dword ptr [ebp-4],edx 把edx中的值3寫入變量i //上面三條命令完成i=i+1
   ------------------------------------------------------------------------------------------------------------------
   最終的結果i=3,如果把運算符%換成+,則結果i=6(注意,這是在VC下得到的結果,不同的編譯器得到的結果可能會不同!)
  154 我的程序知道一個應用程序的句柄,如何使該應用程序得到焦點:http://community.csdn.net/Expert/FAQ /FAQ_Index.asp?id=192872
   ---------------------------------------------------------------
   if(::GetForegroundWindow()!=m_MainWnd) 
   ::SetForegroundWindow(m_MainWnd); 
   ::SetFocus( m_MainWnd); 
   --------------------------------------------------------------- 
   或:
   ------------------------------------
   ::ShowWindow(m_MainWnd, SW_SHOW); 
   ::SetForegroundWindow(m_MainWnd);
   ------------------------------------
  155 在對話框的標題欄上添加按鈕:http://www.codeguru.com/Cpp/W-D/dislog/titlebar/article.php/c1897
  156 判斷當前線程的當前輸入法是中文還是英文輸入法(至於到底是哪種中文輸入法我也不知道):
   -------------------------------------------------------------------------
   HKL hKl = GetKeyboardLayout(0); //這里0表示當前線程,要查指定線程的話可以用指定線程的標識符代替
   if (ImmIsIME(hKl))
   AfxMessageBox("當前是中文輸入法。");
   -------------------------------------------------------------------------
   其它地區語言輸入法的信息在MSDN中搜索:Table of Language Identifiers
  157 動態創建靜態控件並加載.bmp圖片,先在對話框類中定義成員變量:
   ----------------------------------------------------
   public:
   CStatic m_pp; //這個是在對話框類中定義的
   再:
   CBitmap cb;
   cb.LoadBitmap(IDB_BITMAP1);
   m_pp.Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,CRect(10,10,200,200),this,101);
   m_pp.SetBitmap((HBITMAP)cb);
   ----------------------------------------------------
  158 DLL中創建窗口時對於資源等,需要先進行狀態處理:AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
  159 把圖片中某種指定色變成透明色,在對話框的OnPaint()中加入類似如下代碼:
   -------------------------------------------------------------------------------
   //CImage imgOriginal;
   int XWitdh=imgOriginal.GetWidth();
   int XHeight=imgOriginal.GetHeight();
   COLORREF TransparentColor= RGB(0x00,0x00,0x00); //這里黑色變成透明色
   CPaintDC dc(this);
   imgOriginal.TransparentBlt(dc.m_hDC,0,0,XWitdh,XHeight,TransparentColor);
   imgOriginal.StretchBlt(dc,0,0,imgOriginal.GetWidth()/2,imgOriginal.GetHeight()/2,SRCCOPY);
   -------------------------------------------------------------------------------
  160 怎么修改MFC單文檔程序的標題,經常有人在網上問這個問題,在C****App::InitInstance()的代碼中加入一行就行了:
   -----------------------------------------------------------
   BOOL CJPGGifApp::InitInstance()
   {
   AfxEnableControlContainer();
   ...... //這里省略自動生成的代碼
   // The one and only window has been initialized, so show and update it.
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   m_pMainWnd->SetWindowText("我的標題"); //加入這一行就可以了,注意要加在ShowWindow和UpdateWindow的后面
  
   return TRUE;
   }
   ------------------------------------------------------------
  161 怎么使用雙緩沖防閃爍:http://community.csdn.net/Expert/topic/4236 /4236258.xml?temp=5.736941E-02 <==========還沒試,不知道有沒有效果
  162 鼠標左右鍵同時按下與鼠標與鍵盤同時按下的識別:http://www.vckbase.com/article/misc/0017.htm
  
    玩過Windows的掃雷游戲嗎?該游戲中就有一個同時按下鼠標左右鍵的操作,其實對同時按下鼠標左右鍵的判斷並不復雜,判斷方法與判斷鼠標按鍵是否與Ctrl和Shift同時按下的方法相同,這里要用到鼠標消息中的wparam項,其中含有我們想要的幾個按鍵的狀態。定義如下: 
  
    (1)MK_CONTROL:Ctrl鍵按下時置1; 
  
    (2)MK_LBUTTON:鼠標左鍵按下時置1; 
  
    (3)MK_MBUTTON:鼠標中鍵按下時置1; 
  
    (4)MK_RBUTTON:鼠標右鍵按下時置1; 
  
    (5)MK_SHIFT:Shift鍵按下時置1。 
  
    通過判斷這幾個標志位可以得到同時按下的幾個鍵的狀態,從而判斷是否有其它鍵同時按下。 
  
  
  163 數據庫方面:http://community.csdn.net /Expert/topic/4500/4500287.xml?temp=.2734644 <===================還沒試
  164 取得Excel中文本框的內容:http://community.csdn.net/Expert/topic/4356/4356294.xml?temp=.41
   165 Microsoft Office Development with Visual Studio:http://msdn.microsoft.com/library/default.asp?url=/library/en-us /dnoxpta/html/vsofficedev.asp
  166 讓編譯器忽略某種警告:
   --------------------------------
   #pragma warning (disable : 4101)
   --------------------------------
   上面的代碼加上后編譯器不會再出現warning C4101: 'i' : unreferenced local variable這樣的警告了。 
  167 枚舉網頁各個元素,參考:
   http://www.vckbase.com/document/viewdoc/?id=288
   http://www.vckbase.com/document/viewdoc/?id=1446
  168 rundll32.exe,這個程序很方便,用它可以調用任何 DLL 中的函數。你只要給它提供 DLL、函數名以及要傳遞的參數即可。Rundll32.exe 絕對多才多藝,你可以用它來關閉和重啟 Windows,創建快捷方式以及啟動控制面板程序。只要知道要調用的DLLs,一切都搞掂。你可以象下面這樣用 rundll32.exe 從命令行打開一個 URL:
   --------------------------------------------------------
   rundll32.exe url.dll,FileProtocolHandler www.vckbase.com
   --------------------------------------------------------
   url.dll 中的函數 FileProtocolHandler 負責這個工作。
  169 HDC===>CDC*
   ----------------------------------
   HDC hdc=::GetWindowDC(this->m_hWnd); //獲得窗口標題欄區域
   CDC* pDC = CDC::FromHandle(hdc);
   ----------------------------------
   CDC*===>HDC,可以通過CDC的操作符HDC()來實現:
   ------------------
   HDC hdc=HDC(pDC); //或:HDC hdc=pDC->m_hdc;
   ------------------
  170 操作狀態欄,下面以在狀態欄中顯示鼠標當前坐標為例,代碼如下:
   -------------------------------------------------------------------------------------------
   CMyView::OnMouseMove(UINT nFlag,CPoint point)
   {
   CClientDC dc(this);
   CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
   CStatusBar *pStatusBar = (CStatusBar *)&pFrame->m_wndStatusBar;
   CString str;
   str.Format("x:%d,y:%d",point.x,point.y);
   CSize size = dc.GetTextExtent(str); //得到文本所需的大小尺寸
   int nIndex = pStatusBar->CommandToIndex(ID_INDICATOR_MOUSEPOS);
   pStatusBar->SetPaneInfo(nIndex,ID_INDICATOR_MOUSEPOS,SBPS_NORMAL,size.cx); //按文本所需的寬度設置狀態欄寬度
   pStatusBar->SetPaneText(nIndex,str);
  
   CView::OnMouseMove(nFlags, point);
   }
   -------------------------------------------------------------------------------------------
  171 一些工具的簡單介紹:http://www.yesky.com/SoftChannel/72347895172431872/20050306/1918484.shtml
  172 一個有爭論的問題,關於delete p和delete []p的區別所在:http://community.csdn.net/Expert/topic/4402/4402653.xml
   http://community.csdn.net/Expert/topic/4411/4411478.xml?temp=.5596582
  173 GetDeviceCaps,一個可得到很多關於指定設備的具體信息的函數
  174 注冊表中:HKEY_CURRENT_USER\KeyboardLayout\preload分支下分別有輸入法對應的1、2、3、4幾個主鍵,其鍵值一一對應已安裝的輸入法,如:1的鍵值00000409是英文輸入法,知道具體輸入法和鍵值的對應關系后,我們可以根據得到的鍵值判斷用戶的當前輸入法了。
  175 在托盤區處顯示氣泡提示:http://msdn.microsoft.com/library/default.asp?url= /library/en-us/shellcc/platform/shell/reference/ifaces/iusernotification/SetBalloonInfo.asp
  176 設置對話框的背景色的簡單方法,其實只要在CWinapp的InitInstance的里面添加一行代碼就行了:
   ---------------------------------------------------------
   BOOL CBOOKApp::InitInstance()
   { 
   AfxEnableControlContainer();
   SetDialogBkColor(RGB(213,240,227),RGB(173,7,95)); //添加這行,前者為背景色,后者為前景色
   ..... 
   }
   ---------------------------------------------------------
  177 顯示gif 動畫表情的CRechEdit控件:http://lzzqqq.blogchina.com/2819759.html
  178 單文檔程序,如何使程序窗口一開始就固定在某一尺寸:PreCreateWindow中指定大小.可以去掉框架窗口的WS_THICKFRAME風格來使窗口不可改變大小,可以選擇性的去掉WS_MAXIMIZEBO風格。也可以處理WM_GETMINMAXINFO消息來限制視圖的大小。
  179  CSpinButtonCtrl:http://www.ruanxun.com/HArticle78020.aspx
  180 限制用戶調整窗口的最大、最小尺寸,在窗口的WM_GETMINMAXINFO消息響應函數中處理,如:
   ---------------------------------------------------------------------------
   void CQQDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
   {
   // TODO: Add your message handler code here and/or call default
   lpMMI->ptMinTrackSize.x=200; //限制最小寬度,單位為像素,下同
   lpMMI->ptMinTrackSize.y=400; //限制最小高度
   lpMMI->ptMaxTrackSize.x=250; //限制最大寬度
   lpMMI->ptMaxTrackSize.y=500; //限制最大高度
   CDialog::OnGetMinMaxInfo(lpMMI);
   }
   ---------------------------------------------------------------------------
  181 獲取桌面所有圖標的標題,代碼示范了如何使用VirtualAlloc(),WriteProcessMemory() 和 ReadProcessMemory() 在不同的進程中分配內存。用Windows的消息獲得圖標的名稱:
     下載源碼:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101& page=6
  182 一台機器可能有不止一個CD-ROM驅動器。現在CD-ROM已經是PC機的標准配置,此外再裝個可擦寫的光盤驅動,甚至是DVD都是很常見的事情。不管一台機器上裝多少個不同的驅動器,如何找到它們呢?下載源碼:http://www.vckbase.com/code /listcode.asp?mclsid=1&sclsid=101&page=6
  183 做一個類似文件快捷方式中查找目標的功能,Net 2003中的MSDN,找到了可以實現該功能的API,SHOpenFolderAndSelectItems()函數.....本程序可以調用 Explore打開指定文件夾,並把指定文件置為選定狀態,下載源碼:http://www.vckbase.com/code /listcode.asp?mclsid=1&sclsid=101 
  184 字符串轉為Unicode:
   -----------------------------------------------------------------
   WCHAR wsz[MAX_PATH];
   CString str="字符串";
   #ifdef _UNICODE
   wcscpy(wsz, str); //如果工程支持Unicode的話用wcscpy函數
   #else
   //工程不支持的話用MultiByteToWideChar函數轉換 
   MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH); 
   #endif
   -----------------------------------------------------------------
     也可以用c的函數庫的函數:
   mbtowc 轉一個字符
   mbstowcs 轉字符串
  185 向一個進程外窗口發送WM_SHOWWINDOW消息,隱藏或顯示該窗口:
   -----------------------------------------------------
   HWND hwnd=::FindWindow(0,"ddd"); //隱藏"ddd"窗口
   ::PostMessage(hwnd,WM_SHOWWINDOW,FALSE,SW_OTHERZOOM); //參數3為FALSE時隱藏,為TRUE則顯示該窗口
   -----------------------------------------------------
   上面代碼有可能失敗,因為WM_SHOWWINDOW只是窗口准備改變狀態時,系統發出的消息,並不能控制窗口狀態的改變。另一個方法可以把后面一句改成:ShowWindow(hwnd,SW_HIDE);
  186 使用24位色彩圖標的工具條,有源碼范例的:http://www.codeguru.com/Cpp/controls/toolbar/article.php/c2537
   187 設置CListCtrl控件圖標間距離的方法:CListCtrl::SetIconSpacing
  188 設置層疊窗口的透明色函數:SetLayeredWindowAttributes,部分代碼參考:
   -------------------------------------------------------------------------
   SetWindowLong(this->m_hWnd,GWL_EXSTYLE,GetWindowLong(this->m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
   HWND hWnd=this->m_hWnd; 
   typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
   PSLWA pSetLayeredWindowAttributes;
   HMODULE hDLL = LoadLibrary ("user32");
   pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
   if (pSetLayeredWindowAttributes != NULL)
   {
   pSetLayeredWindowAttributes (hWnd,0,20,LWA_ALPHA);
   }
   FreeLibrary(hDLL);
   -------------------------------------------------------------------------
  189 關於滾動條方面的,GetScrollInfo獲得滾動條位置信息:
   ------------------------------------
   SCROLLINFO si;
   ZeroMemory(&si, sizeof(si));
   si.cbSize = sizeof(si);
   si.fMask = SIF_TRACKPOS;
   // Call GetScrollInfo to get current tracking position in si.nTrackPos
   GetScrollInfo(hwnd, SB_HORZ, &si);
   -----------------------------------
   讓滾動條滾動需要發送相應的WM_VSCROLL和WM_HSCROLL消息:
   SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;
   SetScrollInfo函數改變滾動條的位置。
  190 切換到軟鍵盤:call ImmSetConversionStatus with IME_CMODE_SOFTKBD
  191 用 SetVolumeLabel函數修改U盤卷標時據說windows會刷新里面的內容。 <===================還沒試
  192 基於對話框的MFC程序想要具有打印功能:http://community.csdn.net/Expert/topic/4557/4557847.xml?temp=.5908472
  193 打開那個標題為"打開方式..."的對話框來選擇程序:WinExec("rundll32.exe shell32.dll,OpenAs_RunDLL path\filename",SW_RESTORE);
  194 如何屏蔽主窗口的最大化按鈕,並讓其自動最小化:http://community.csdn.net/Expert/topic/4563/4563807.xml?temp=.9465906
  195 從立體聲的wave文件中分別提出左聲道和右聲道的聲音數據,實現音頻文件的播放——單聲道錄音、立體聲錄音並保存為.wav文件,以及VC.NET簡單實現GIF動畫:
   http://www.vckbase.com/code/listcode.asp?mclsid=7
  196 DirectX Input獲得鼠標輸入:http://www.vckbase.com/code/listcode.asp?mclsid=7& sclsid=&page=2
  197 數字水印算法的實現:http://www.vckbase.com/code /listcode.asp?mclsid=7&sclsid=&page=3
  198 程序如何加入全局熱鍵:RegisterHotKey注冊熱鍵,響應WM_HOTKEY消息來截獲熱鍵:http://www.xiaozhou.net/cooldog /blogview.asp?logID=78
  199 讀取其它進程內存中的數據:ReadProcessMemory
  200 給程序加上系統托盤圖標:http://www.vckbase.com/bbs/prime/viewprime.asp?id=260
   下面是簡單的代碼:
   --------------------------------------------------------------
   NOTIFYICONDATA nid;
   //初始化系統托盤圖標
   nid.cbSize = sizeof(NOTIFYICONDATA);
   nid.hWnd = m_hWnd;
   nid.uID = 100;
   nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
   nid.uCallbackMessage = WM_USER+20;
   nid.hIcon=LoadIcon(NULL,IDI_APPLICATION); //圖標
   strcpy(nid.szTip, "My Tooltip Text"); //提示
   Shell_NotifyIcon(NIM_ADD, &nid);
   --------------------------------------------------------------
  201 單文檔中打印預覽,發送消息模擬點擊菜單中“打印預覽”:
   ---------------------------------------------------------------------------------
   ::SendMessage(this->GetSafeHwnd(), WM_COMMAND, ID_FILE_PRINT_PREVIEW, 0);
   ---------------------------------------------------------------------------------
  202 得到當前登陸用戶的用戶名:GetUserName/GetUserNameEx
  203 設置發生改變后系統會自動更新,要善加利用:::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL);
  204 拖動一個沒有標題欄的窗口:
   -----------------------------------------------------------------------
   void CMyControl::OnLButtonDown(UINT nFlags, CPoint point) 
   {
   // TODO: Add your message handler code here and/or call default
   UNUSED_ALWAYS(nFlags);
   if (!(GetWindowLong(m_hWnd, GWL_STYLE) & WS_CHILD))
   PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
   else
   GetParent()->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
   }
   -----------------------------------------------------------------------
  205 用指定字體在dc中寫字:
   -------------------------------------------------------
   HDC hdc = ::GetDC(NULL);
   HFONT hfont,holdfont;
   hfont = (HFONT)GetStockObject(OEM_FIXED_FONT);
   holdfont = (HFONT)SelectObject(hdc,hfont);
   TextOut(hdc,10,50,"\1\2\3\4",8);
   SelectObject(hdc,holdfont);
   DeleteDC(hdc);
   -------------------------------------------------------
  206 桌面主題更改的消息:WM_THEMECHANGED
  207 修改菜單項的名稱:
   CMenu *pMenu = AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
   pMenu->ModifyMenu(0,MF_BYPOSITION,0,"Test");
  208 __LINE__表示本行代碼在程序中第幾行,同樣:__FILE__表示當前文件的全路徑
   ----------------------------------
   CString str;
   str.Format("Line is %d", __LINE__); //指這行
   AfxMessageBox(str);
   ----------------------------------
  209 查看系統函數的源代碼的方法:裝一個Visual Assist X,想看某個函數的時候ALT + G
  210 一直以來,想實現窗口透明程度不同,或局部透明,局部不透明,但這也只是夢想,下面這個函數看來可以讓我們夢想成真:UpdateLayeredWindow
  211  LOGFONT各成員的意義:
   ---------------------------------------------------------------------------------
   LOGFONT lf;
   lf.lfHeight=-80; //字體字符的高度
   lf.lfWidth=0; //字符平均寬度
   lf.lfEscapement=45; //文本行逆時針旋轉45度
   lf.lfOrientation=0; //字符角度
   lf.lfWeight=FW_HEAVY; //字符的粗細度
   lf.lfItalic=FALSE; //傾斜
   lf.lfUnderline=FALSE; //下划線
   lf.lfStrikeOut=FALSE; //刪除線
   lf.lfCharSet=GB2312_CHARSET; //中文字符集
   lf.lfOutPrecision=OUT_STROKE_PRECIS; //字體輸出結果和要求的匹配程度
   lf.lfClipPrecision=CLIP_STROKE_PRECIS; //如何裁剪落於裁剪區之外的字符
   lf.lfQuality=DRAFT_QUALITY; //字體屬性匹配的精確程度
   lf.lfPitchAndFamily=VARIABLE_PITCH | FF_MODERN; //字體間距和字體族
   strcpy(lf.lfFaceName,"楷體_GB2312"); //楷體
   m_font.CreateFontIndirect(&lf); //m_font為類的成員變量:CFont m_font;
   ---------------------------------------------------------------------------------
  212 指向指象主對話框的指針:AfxGetApp()->m_pMainWnd或AfxGetApp()->GetMainWnd()
  213 去除F1的幫助功能,重載WM_HELPINFO消息:
   ------------------------------------------------------
   BOOL CYourdlgDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
   {
   return TRUE;//CDialog::OnHelpInfo(pHelpInfo);
   }
   ------------------------------------------------------
  214 串口(包括USB 轉串口)幾個小問題:http://community.csdn.net/Expert/topic/4470 /4470922.xml?temp=.9018061
  215 控制輸入法相關的幾個函數:ImmGetContext、 ImmGetConversionStatus、ImmSetConversionStatus、ImmReleaseContext等
   216 限定輸出字符的矩形范圍:ExtTextOut或DrawText
  217 控制滾動條的顯示或隱藏:CWnd::ShowScrollBar(UINT nBar,BOOL bShow = TRUE)
  218 注冊表中:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum下IDE和SCSI分支中枚舉所有這兩種設備。
  219 更改當前時區:SetTimeZoneInformation
     獲得當前時區:GetTimeZoneInformation
  220 直接讀取硬盤的指定扇區:
   (1)用匯編;
   (2)直接用CreateFile("\\.\PHYSICALDRIVE0", ...)打開物理磁盤設備即可(物理磁盤設備都是從0開始排號的,0表示第一塊硬盤,1表示第二塊硬盤....),這樣用SetFilePointer可以隨意讀取硬盤上任何位置的東西!至於扇區嘛,一般都是512字節為1扇區的,自己換算就是了~           <===================還沒試,不過這里有更多內容:http://www.51cto.com/html/2005/1110 /11133.htm
  221 獲得本機並口的起始地址:
  可以讀取bios數據區域,當然只能在未進入保護模式的操作系統前或 dos下讀取
  段地址:00H 
   
  408H 字 計算機上0號並行打印機適配器的基地址, 
  40AH 字 計算機上1號並行打印機適配器的基地址。 
  40CH 字 計算機上2號並行打印機適配器的基地址。 
  40EH 字 計算機上3號並行打印機適配器的基地址。(PS2型此值為擴展BIOS數據區段地址) 
  SetupAPI可以得到所有設備的信息包括IO端口,內存資源,中斷號碼
  222 更換桌面背景:
   方法一:
     看這里:http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/atlcomocx_02 /1002001.htm,用了com中IActiveDesktop,這是個活動桌面的COM接口,還有智能指針,可以順便學習一下這方面內容;
   方法二:
     SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\\aa.bmp", 1); //jpg圖片不行,無法顯示
  223 讓多行風格的編輯框控件顯示指定行又一法:m_txt.LineScroll(m_txt.GetLineCount()); //m_txt為CEdit控件綁定變量
  224 控制音量API:waveOutSetVolume
  225 在程序運行期間,怎樣禁止窗口右上方的關閉按鈕
   ---------------------------------------------------------------
   CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
   if (pMenu)
   pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
   // 變為非禁止狀態
   CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
   if (pMenu)
   pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_ENABLED) ;
   ---------------------------------------------------------------
  226  請問如何讓SDI程序啟動時自動隱藏:http://community.csdn.net/Expert/topic/4602 /4602225.xml?temp=.1871607
   http://blog.csdn.net/enoloo/archive/2004/06/07/17638.aspx //這個是要最大化的
   把pMainFrame->ShowWindow(SW_HIDE);這句加在ParseCommandLine(cmdInfo);的后面,if (!ProcessShellCommand(cmdInfo))的前面
  227 經常有人問有沒有高效的方法,可以知道一個文本文件有多少行,抽空寫了幾行代碼回復在貼子中:http://community.csdn.net/Expert/topic/4601 /4601972.xml?temp=.5953943
  228 精確的計時: <========================還沒試
  __int64 lfreq;
  BOOL bret=QueryPerformanceFrequency((LARGE_INTEGER*)&lfreq);
  __int64 lstart;
  QueryPerformanceCounter((LARGE_INTEGER*)&lstart);
  //... call your function
  __int64 lstop;
   QueryPerformanceCounter((LARGE_INTEGER*)&lstop);
  __int64 lruntime=lstop - lstart;
  double dsec= lruntime/lfreq;
   229 命令行處理的封裝類CCommandLineInfo和CCommandLineInfoEx
  230 操作臨時文件,臨時文件的使用方法基本與常規文件一樣,只是文件名應該調用函數GetTempFileName()獲得。它的第一個參數是建立此臨時文件的路徑,第二個參數是建立臨時文件名的前綴,第四個參數用於得到建立的臨時文件名:
   -----------------------------------------
   char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH]; 
   GetTempPath(_MAX_PATH, szTempPath); 
   GetTempFileName(szTempPath,_T("my_"),0,szTempfile);
   -----------------------------------------
  231 彈出USB設備安全刪除對話框:WinExec("C:\\WINDOWS\\system32\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll",SW_SHOW);
  232 彈出“數據鏈接屬性”對話框:IDataSourceLocatorPtr::PromptNew();
  233 ActiveSkin 4.3 軟件換膚在VC中的實現:http://www.vckbase.com/document/viewdoc/?id=1288
  234  CBitmap=====>HBITMAP:
   -------------------------------------------------------------------------------------
   CBitmap bitmap;
   HBITMAP hbitmap=(HBITMAP)bitmap; //CBitmap中重載了HBITMAP()操作符,可以方便地用它來強制轉換
   -------------------------------------------------------------------------------------
     HBITMAP=====>CBitmap:
   ---------------------------------------
   HBITMAP hbitmap;
   CBitmap bitmap;
   bitmap.FromHandle(hbitmap);
   ---------------------------------------
  235 從其它.exe文件提取.ico圖標作為自己程序的圖標:
   ----------------------------------------------------------------------
   HINSTANCE hInst = LoadLibrary("b.exe");
   HRSRC hRc = FindResource(hInst, (LPCSTR)1, (LPCSTR)RT_ICON);
   LPVOID lpResource = LockResource(LoadResource(hInst,hRc));
  
   HANDLE hUpdate = BeginUpdateResource("a.exe", FALSE);
   UpdateResource(hUpdate, (LPCSTR)RT_ICON, (LPCSTR)1, 0, lpResource, SizeofResource(hInst, hRc));
   EndUpdateResource(hUpdate, FALSE);
  
   CloseHandle(hRc);
   FreeLibrary(hInst);
   -----------------------------------------------------------------------
  236 得到當前屏幕的參數,最好是用函數EnumDisplaySettings(其它的方法如:GetSystemMetrics(SM_CYFULLSCREEN);會因為任務欄是否隱藏而可能得不到真實高度),這個函數功能強大,可根據指定的設備名(第一個參數)返回它的顯示信息:
   -------------------------------------------------------------------------------
   CString strCurrentDifferency,strCurrentColorMode; //分別用來存放屏幕當前分辨率、色彩位數的字符串
   LPDEVMODE gpCurrentMode = new DEVMODE; //用來存儲屏幕當前設置的結構指針
   EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, gpCurrentMode); //獲得當前分辨率的大小和其它信息
   strCurrentDifferency.Format("分辨率:%d* %d",gpCurrentMode->dmPelsWidth,gpCurrentMode->dmPelsHeight);
   strCurrentColorMode.Format("當前顏色位數:%d",gpCurrentMode->dmDisplayFrequency);
   AfxMessageBox(strCurrentDifferency);
   AfxMessageBox(strCurrentColorMode);
   delete gpCurrentMode;
   gpCurrentMode=NULL;
   --------------------------------------------------------------------------------
   用CDC::GetDeviceCaps函數也可以:
   -------------------------------------------------------------------------------------------------------
   CString strCurrentDifferency;
   CDC *pDC=CDC::FromHandle(::GetDC(0)); //隨便獲得一個DC指針就可以了,這里是獲得桌面的DC
   strCurrentDifferency.Format("分辨率:%d* %d",pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
   AfxMessageBox(strCurrentDifferency);
   -------------------------------------------------------------------------------------------------------
  237 組合框控件在Dropdown類型時,如何設置其為只讀的:
   -----------------------------------------------------------------------------
   CComboBox *pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
   HWND hEdit = ::FindWindowEx(pCombo->GetSafeHwnd(), NULL, _T("EDIT"), NULL);
   if (hEdit)
   ::SendMessage(hEdit, EM_SETREADONLY, TRUE, 0);
   -----------------------------------------------------------------------------
  238 解決這個工程出現重復編譯的錯誤:http://community.csdn.net/Expert/topic/4610 /4610652.xml?temp=.9251825
  239 偵測計算機是否連上網絡:InternetGetConnectedStateEx
  240 枚舉軟件或硬件設備:IMDServiceProvider::EnumDevices
  241 對話框中控件內容的打印:http://community.csdn.net/Expert/topic/4609/4609829.xml?temp=.1613275
     使你的dialog支持打印預覽:http://www.codeproject.com/printing/#Print+Preview 
     http://www.codeproject.com/listctrl/listprintdemo.asp
     現在沒有打印機可試,記在這里先,以后有了再測試。
  242 結束其它的進程:GetWindowThreadProcessId和 TerminateProcess函數,不過TerminateProcess盡量少用,它可以直接結束目標進程,目標進程死都不知道是自己怎么死的,來不及保存自己的數據結果,也來不及通知自己所調用的.dll文件不用給自己做晚飯了,當然也來不及打電話給它的子進程說:“阿珍,其實我一直都想對你說:我愛你!”
   這里還有個貼子:http://community.csdn.net/Expert/topic/4608 /4608816.xml?temp=.9869654
  243 用LockFile函數鎖定一個打開文件的某一個區域,可以防止其它進程訪問該區域。
  244 使CListCtrl控件的Item標簽可以修改:ModifyStyle(0,LVS_EDITLABELS);
  245 如何動態的改變菜單項在狀態欄中的提示:http://community.csdn.net/Expert/topic/4615 /4615363.xml?temp=2.514064E-03
   重載CFrameWnd的virtual void GetMessageString(UINT nID, CString& rMessage) const;函數
  
   實現:
   --------------------------------------------------------------------------------
   void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
   {
   if(nID == ID_FILE_NEW) //這里可以動態改變
   {
   rMessage = "Create new file!";
   return;
   }
   CFrameWnd::GetMessageString(nID,rMessage); //調用默認的處理過程
   }
   --------------------------------------------------------------------------------
   對話框工程中:
  Handle the WM_MENUSELECT message. The wParam is the menu index, which is also the index of the stringtable entry that describes the menu. This prompting is ordinarily handled by the mainframe, but in a dialog-based app you have to add your own handler 
  246 修改.exe或其它模塊的資源,參考下面幾個函數:            <===========沒試過,不過看上去可行,用到時再試吧^_^
   LoadLibrary
   FindResource
   LoadResource
   LockResource
   BeginUpdateResource
   UpdateResource
   EndUpdateResource
   FreeResource
   具體見MSDN,上面同時給出了調用順序,看了參數就明白了
  247 請問NULL和 null,TRUE和true,FALSE和false等有啥區別?
   1.FALSE/TRUE與false/true的區別:
   false/true是標准C++語言里新增的關鍵字,而FALSE/TRUE是通過#define,這要用途是解決程序在C與C++中環境的差異,以下是FALSE/TRUE在windef.h的定義:
   #ifndef FALSE
   #define FALSE 0
   #endif
   #ifndef TRUE
   #define TRUE 1
   #endif
   也就是說FALSE/TRUE是int類型,而false/true是bool類型;所以兩者不一樣的,只不過我們在使用中沒有這種感覺,因為C++會幫你做隱式轉換。
   2.bool的大小與BOOL的區別:
   bool在C++里是占用1字節,而BOOL是int類型,int類型的大小是視具體環境而定的;所以來說:false/true只占用1個字節,而 TRUE/FALSE視具體環境而言
  248 CFile::GetStatus也可以獲得文件的屬性信息
  249 獲取桌面所有頂級窗口:EnumDesktopWindows、EnumWindowsProc
  250 顯示用DirectShow捕捉下來的視頻:
   DirectShow的 IVideoWindow可以設置
   ---------------------------------------------------------------------
   IVideoWindow *pVidWin = NULL;
   pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
   pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
   RECT grc;
   GetClientRect(hwnd, &grc);
   pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
   ---------------------------------------------------------------------
  251 改變編輯框控件中光標的圖形:
   ----------------------------------------------------------
   CBitmap* pBitmap = new CBitmap;
   pBitmap->LoadBitmap(IDB_HAPPY_BITMAP); //IDB_HAPPY_BITMAP為工程中.bmp資源,大小任意,但顏色超過16色的話色彩會失真
   m_editCtrl.CreateCaret(pBitmap); //m_editCtrl為編輯框控件變量
   POINT point;
   point.x=0;
   point.y=0;
   m_editCtrl.SetCaretPos(point); //改變光標的位置,以像素為單位
   m_editCtrl.ShowCaret();
   ----------------------------------------------------------
  252 用主題函數改變對話框窗口的可視風格(MSDN上可查到更多這方面的函數):
   ----------------------------------------------------------------
   #include 
   #pragma comment(lib,"uxtheme.lib")
   void CMyDlg::OnTest() 
   {
   EnableThemeDialogTexture(m_hWnd,ETDT_ENABLE | ETDT_USETABTEXTURE);
   Invalidate();
   }
   ----------------------------------------------------------------
   253 如何讓MDI程序在啟動的時候不新建子窗口:http://community.csdn.net/Expert/topic/4619/4619802.xml?temp=.2809107
   在App的InitInstance中加一行:
   --------------------------------------------------------
   CCommandLineInfo cmdInfo;
   ParseCommandLine(cmdInfo);
   cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing; //添加這一句
   // Dispatch commands specified on the command line
   if (!ProcessShellCommand(cmdInfo))
   return FALSE;
   --------------------------------------------------------
  254 關機:ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0 ) <=====還沒試
   強制關機ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0 );
  255 hook:http://community.csdn.net/Expert/topic /4615/4615606.xml?temp=.7596094
  256 字符串====>日期時間:
   -------------------------------------------------
   COleDateTime dt;
   dt.ParseDateTime(_T("2006-2-14 8:00:00"));
   SYSTEMTIME st={0};
   dt.GetAsSystemTime(st);
   //SetLocalTime(&st); //設置電腦中時間
   -------------------------------------------------
     日期時間====>字符串:
   -------------------------------------------------
   SYSTEMTIME st={0};
   st.wYear=2006;
   st.wMonth=3;
   st.wDay=23;
   st.wHour=8;
   st.wMinute=30;
   st.wSecond=59;
   COleDateTime dt(st);
   AfxMessageBox(dt.Format());
   -------------------------------------------------
  257 typeid函數可以判斷一個對象的類型,詳見MSDN,上面有示例代碼,不過有點小問題:http://msdn.microsoft.com/library /default.asp?url=/library/en-us/vclang/html/_pluslang_typeid_operator.asp
  258 系統休眠,摘自:http://community.csdn.net/Expert/topic/4637 /4637403.xml?temp=.8914301
   ------------------------------------------------------------------------------------------------
   if(MessageBox("確實要休眠嗎?","關機程序",MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)==IDYES)
   {
   static HANDLE hToken;
   static TOKEN_PRIVILEGES tp;
   static LUID luid;
   if(::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
   {
   ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
   tp.PrivilegeCount=1;
   tp.Privileges[0].Luid =luid;
   tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
   ::AdjustTokenPrivileges(hToken,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
   }
   ::SetSystemPowerState(false,true); 
   }
   -------------------------------------------------------------------------------------------------
  259 在錄音時如何控制錄音屬性中麥克風或者線路輸入的音量
   1.mixerGetNumDevs獲取混音設備數量 
   2.循環獲取設備信息mixerOpen/mixerGetLineInfo 
   3.根據獲得的MIXERLINE中dwComponentType判斷類型來確定是線入/麥克風 
   MIXERLINE_COMPONENTTYPE_SRC_LINE/MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE 
   4.mixerSetControlDetails設置音量
  260 用資源管理器打開指定文件夾,並置目標文件夾為選定狀態:WinExec("explorer /n,/select,f:\\win98", SW_SHOWNORMAL );
  261 打開或關閉輸入法:IActiveIME::SetActiveContext 
  262 提取.exe或.dll文件中的圖標:ExtractIcon
  263 捕捉其他程序最大、最小化消息:http://community.csdn.net/Expert /topic/4647/4647630.xml?temp=.8477289
  264 WM_DEVICECHANGLE消息配合 DeviceIoControl函數可禁用U盤
  265 判斷編輯框控件是否為只讀的:
   ----------------------------------------------------
   CEdit *temp=(CEdit *)GetDlgItem(IDC_EDIT1);
   DWORD a=temp->GetStyle();
   if(a & ES_READONLY) //ES_READONLY=0x800
   AfxMessageBox("Read only");
   else
   AfxMessageBox("NOT read only");
   ----------------------------------------------------
   266 獲得系統電源狀態:
   GetSystemPowerStatus
  
   Retrieves the power status of the system. The status indicates whether the system is running on AC or DC power, whether the battery is currently charging, and how much battery life remains.
  267 桌面元素的操作:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/activedesktop.asp
  268 如何判斷是鍵盤左邊的Shift還是右邊的Shift鍵,摘自:http://community.csdn.net/Expert/topic/4661/4661661.xml?temp=8.190554E-02
   http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp
   上面URL中MSDN給出了所有按鍵的ASCII碼。
  
   VK_LSHIFT (A0)
   Left SHIFT key
  
   VK_RSHIFT (A1)
   Right SHIFT key
  269  C++開發常用工具:http://blog.vckbase.com/FlowSand/archive/2006/01/27/17447.html
  270 sprintf中打印百分號%的方法,摘自:http://blog.vckbase.com/smileonce/archive/2006/03/16/18521.html
   ------------------------------------------------------------
   int percent = 50;
   char buf[100];
   sprintf(buf, "%d%%%% complete\n! ", percent);
   printf(buf); //這樣就只打印一個%了
   printf("%s",buf); //改成這樣后打印出兩個%了,恰如我們期望的
   ------------------------------------------------------------
  271 精確延時,KeStallExecutionProcessor函數來幫你,摘自:http://blog.vckbase.com/zaboli/archive/2006/03/24/18705.html
  但是問題是KeStallExecutionProcessor的文檔說,他的最小周期不能大於 50微秒!不然會造成系統停頓。。
  測試得出 KeStallExecutionProcessor(416)在有的機器上會造成鼠標停頓 -_-但是KeDelayExecutionThread(KernelMode, FALSE, &WaitTime); 無論再怎么設置小的超時,結果都如下10毫秒???差太多了吧。。。
  272 向控件發送鼠標滾輪的消息:
   ::SendMessage(m_cListCtrl.m_hWnd,WM_MOUSEWHEEL,(WPARAM)-7864320,0); //參數三是向下滾動的參數,7864320則為向上滾動
  273 數日前收到天影朋友的23種設計模式的例子,很淺顯易懂。下面的blog中亦有設計模式的探討,借古喻今,文筆不錯,可供參考:
   http://blog.csdn.net/junguo/
  274 獲得文件夾大小的方法,摘自:http://community.csdn.net/Expert/topic/4672 /4672088.xml?temp=.2216761
   ----------------------------------------------------------------------------------
   #include 
   #import "scrrun.dll" raw_interfaces_only 
   int main()
   {
   CoInitialize(NULL);
   {
   try
   {
   Scripting::IFileSystem3Ptr fs;
   fs.CreateInstance(__uuidof(Scripting::FileSystemObject));
   Scripting::IFolderPtr folder;
   fs->GetFolder(_bstr_t("f:\\win98"),&folder);
   _variant_t vsize;folder->get_Size(&vsize);
   cout<<"f:\\win98 size:"<<(long)vsize<<" bytes"<
   }
   catch(_com_error &e)
   {
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());
   cout<<"Get directory size via FileSystemObject, by masterz"<
   cout<<"COM error occurred,source:"<<(LPCTSTR)bstrSource<
   cout<<"Description:"<<(LPCTSTR)bstrDescription<
   }
   }
   CoUninitialize();
   return 0;
   }
   ----------------------------------------------------------------------------------
  275 打開控制台界面,寫點文字在上面:
   ----------------------------------------------------------------------------------
   AllocConsole();//打開控制台窗口
   HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//得到控制台句柄
   unsigned long lgsize;
   char *strbuf="顯示這行信息。";
   WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
   FreeConsole();//關閉釋放用於輸入新信息的控制台窗口

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sunyikuyu/archive/2010/06/27/5697250.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM