[VC++]VC技巧收集 - 來自網上的收集

VC技巧收集

1.         改變視圖背景色:
CViewOnDraw函數中添寫如下一段程序代碼:

void CFileNameView::OnDraw(CDC* pDC)

{

   CFileNameDoc* pDoc = GetDocument();

   ASSERT_VALID(pDoc);

   CRect rectClient;

   CBrush brushBkColor;

   GetClientRect(rectClient);

   brushBkColor.CreateSolidBrush(RGB(255,0,0)); //顏色設置

   pDC->DPtoLP(rectClient);

   pDC->FillRect(rectClient,&brushBkColor);

   // …

}

2.         往基於對話框的程序添加菜單:
(1).
先添加菜單(IDR_MENU1)資源,並加上需要的菜單項。
(2).
編輯對話框資源IDD_DLGMENUTOOLBAR_DIALOG的屬性,在屬性對話框中選擇IDR_MENU1即可。

(3).
假如您不希望在對話框屬性中直接設置菜單,而通過代碼在程序中動態生成可以採用如下方法
:
CFileNameDlg類聲名中添加成員變量CMenu m_menu,再在CFileNameDlg::OnInitDialog() 中添加如下代碼:

//
加載菜單

m_menu.LoadMenu(IDR_MENU1);
//
設置當前菜單

SetMenu(&m_menu);
//
當你不需要菜單時可以用 SetMenu(NULL);來取消當前菜單

 

3.         往基於Dialog的程序添加工具欄:

(1). 先添加工具欄(IDR_TOOLBAR1)資源,並畫好各個按鈕。
(2).
CFileNameDlg類聲名中添加成員變量
CToolBar m_wndtoolbar;
(3).
CFileNameDlg::OnInitDialog() 中添加如下代碼

//
添加一個平面工具條

if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT ,  WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(4,4,0,0)) || !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )

{
    TRACE0("failed to create toolbar/n");
    return FALSE;
};

m_wndtoolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

 

4.         改變對話框背景色:
CDlgMenuToolbarDlg::OnPaint()中修改代碼實現Dialog 填充顏色:
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
dc.FillSolidRect(rect, RGB(60,110,170));
方法二、在InitInstance()(不是OnInitDialog())中加入:

SetDialogBkColor(RGB(255,0,0),RGB(0,255,0));
注意:要放在InitInstance函數的最前面!

 

5.         dialog的工具欄添加工具提示:
[1]
CFileNameDlg類定義中手工添加消息映射函數的定義,如下黑體部分
   //{{AFX_MSG(CFileNameDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnPaint();
 afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
[2]
CFileNameDlg.cpp添加函數的實現代碼

//
工具欄提示

BOOL CFileNameDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
 ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); 
 // UNICODE
消息

 TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
 TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
 //TCHAR szFullText[512];
 CString strTipText;
 UINT nID = pNMHDR->idFrom;
 
 if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
  pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
 {
  // idFrom
爲工具條的
HWND
  nID = ::GetDlgCtrlID((HWND)nID);
 }
 
 if (nID != 0) //
不爲分隔符

 {
  strTipText.LoadString(nID);
  strTipText = strTipText.Mid(strTipText.Find(
/n
,0)+1);
  
#ifndef _UNICODE
  if (pNMHDR->code == TTN_NEEDTEXTA)
  {
   lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
  }
  else
  {
   _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
  }
#else
  if (pNMHDR->code == TTN_NEEDTEXTA)
  {
   _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
  }
  else
  {
   lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
  }
#endif  
  *pResult = 0;  
  //
使工具條提示窗口在最上面

  ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
   SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
  return TRUE;
 }
 return TRUE;
}
[3]
CFileNameDlg.cpp中添加消息映射,請看如下代碼中的黑體部分

BEGIN_MESSAGE_MAP(CFileNameDlg, CDialog)
 //{{AFX_MSG_MAP(CFileNameDlg)
 ON_WM_PAINT()
 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
[4]
CFileNameDlg.h中添加聲明:

BOOL CFileNameDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)

 

6.         給沒有工具欄的窗口添加工具欄:
在資源管理器中編輯工具欄,並將其屬性改爲IDR_MAINFRAME,然後在MainFrm.h中聲明:
CToolBar m_wndToolBar;
MainFrm.cpp中添加:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 m_wndToolBar.Create(this);
 m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
 
……;


停靠工具欄:在剛纔添加的後面加入下面代碼:

m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);//
控制是否開啓任意停靠

完善一下功能:

在菜單中添加一項“工具欄”,ID設爲ID_VIEW_TOOLBAR,一切OK,試試吧!

 

7.         創建分隔窗口:
只有框架類可以創建分隔,分隔可以嵌套。
.h文件中聲明 CSplitterWnd m_wndSplitter;並且包含COneView.h(新建視圖類)和CWinFrame.h(新建框架類)文件;

然後在.cpp文件中加入:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 if(!m_wndSplitter.CreateStatic(this,1,2))
    return FALSE;
 if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(COneView),CSize(240,420),pContext))
    return FALSE;
 if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CWinFrame),CSize(300,500),pContext))
    return FALSE;
 return TRUE;
}
當用戶創建好分割窗口後,有時並不希望通過拖動切分條來調節窗口的大小。這時就必須鎖定切分條。鎖定切分條的最簡單的方法莫過於不讓CSplitterWnd來處理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是將這些消息交給CWnd窗口進行處理,從而屏蔽掉這些消息。拿WM_LBUTTONDOWN處理過程來說。修改爲如下:

void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point)
{
  CWnd::OnLButtonDown(nFlags,point);
}
其餘的處理方法類似。

 

8.         “打開”按鈕的設置:
用類嚮導創建該按鈕的click函數,選擇默認值OnOpen,加入以下代碼:

void CYourDlg::OnOpen()

{

  char szFileFilter[]=

      "BIN File(*.bin)|*.bin|"

      "All File(*.*)|*.*||";//文件類型過濾

  CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);

  /* CFileDialog dlg(FALSE);

  dlg.m_ofn .lpstrFilter =_T("文本文件(*.txt)/0*.txt/0所有文件(*.*)/0*.*/0");

  dlg.m_ofn.lpstrDefExt=_T("txt"); */

  if(dlg.DoModal()==IDOK)

  {

m_path = dlg.GetPathName();//將顯示路徑的Edit控件命名爲m_path,並增加CString變量m_path

      UpdateData(FALSE); 

  }

}

 

9.         窗口居中:
在初始化(OnInit)函數中增加:CenterWindow();即可

 

10.    對話框加狀態條:
UINT indicators[]={ID_INITMESSAGE,ID_SEPARATOR,ID_TIMEMESSAGE,ID_PROGRESS};
m_statusbar.CreateEx(this,0,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM);
m_statusbar.SetIndicators(indicators,4);
m_statusbar.ShowWindow (SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

 

11.    設置初始窗口狀態:
BOOL CObjectNameApp::InitInstance()
{
 m_pMainWnd->SetWindowText(""); //
設置初始窗口標題文本
 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);//
設置初始窗口爲最大化

 m_pMainWnd->UpdateWindow();

對於MDI函數SetWindowText無效,主窗口的標題只能在資源列表中修改,子窗口標題在**doc.cpp中重載OnNewDocument(),調用SetTitle("LGdownload中文版");來修改。

設置初始窗口最大化的另一優化方法:

void CMainFrame::ActivateFrame(int nCmdShow)
{
    // TODO: Add your specialized code here and/or call the base class
    nCmdShow=SW_MAXIMIZE;
    CFrameWnd::ActivateFrame(nCmdShow);
}

 

12.    對話框透明特效:
OnInitDialog()中加入以下代碼:
//
加入WS_EX_LAYERED擴展屬性

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
 typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
 MYFUNC fun = NULL;
 //
取得SetLayeredWindowAttributes函數指針

 fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
 if(fun)fun(this->GetSafeHwnd(),0,128,2);
 FreeLibrary(hInst);
}
注意:fun的參數128不能太小,否則就完全透明瞭!

 

13.    設置對話框裏的STATIC控件顏色屬性:
在該對話框增加WM_CTLCOLOR事件,加入以下代碼:
if( nCtlColor==CTLCOLOR_STATIC )
{
    pDC->SetTextColor(RGB(255,255,255));
    pDC->SetBkColor(RGB(91,145,244));
  pDC->SetBkMode(TRANSPARENT); //
設置透明

}
設置STATIC控件背景透明:

if( nCtlColor==CTLCOLOR_STATIC )
{
 pDC->SetBkMode(TRANSPARENT); //
設置透明

 return (HBRUSH)::GetStockObject(NULL_BRUSH);
}

 

14.    使窗口的最大化和最小化按鈕消失:
PreCreateWindow函數中添加以下代碼即可:
    int xSize = ::GetSystemMetrics( SM_CXSCREEN );
    int ySize = ::GetSystemMetrics( SM_CYSCREEN );
    cs.cx = xSize * 6 / 10;
    cs.cy = ySize * 6 / 10;
    cs.x = ( xSize - cs.cx ) / 2;
    cs.y = ( ySize - cs.cy ) / 2;

    cs.style &= ~WS_THICKFRAME;
    cs.style &= ~( WS_MAXIMIZEBOX | WS_MINIMIZEBOX );

    cs.dwExStyle |= WS_EX_TOOLWINDOW;

 

15.    設置控件字體顏色:(例如STATIC控件)
OnCtlColor函數中添加如下代碼:(可能需要選擇STATIC的簡單屬性)
if(nCtlColor==CTLCOLOR_STATIC)  
{  pDC->SetTextColor(RGB(255,0,0));
   pDC->SetBkColor(RGB(128,128,128));//
設置文本背景色

 pDC->SetBkMode(TRANSPARENT);//
設置背景透明

}
其他控件的宏定義爲:

  .CTLCOLOR_BTN      
按鈕控件

  .CTLCOLOR_DLG      
對話框

  .CTLCOLOR_EDIT      
編輯框

  .CTLCOLOR_LISTBOX  
列表控件

  .CTLCOLOR_MSGBOX    
消息控件

  .CTLCOLOR_SCROLLBAR
滾動條控件

  .CTLCOLOR_STATIC    
靜態控件 

 

16.    將字符轉換爲數字:
int i = atoi("12345");
sscanf("12345","%d",&i);  

 

17.    調用外部應用程序可使用的函數:
CreateProcess
WinExecShellExecute
例:
ShellExecute(pWnd->m_wnd, "open", "my.exe", NULL, NULL, SW_NORMAL)
一、父窗體句柄,二、命令"open",三、文件路徑,四、參數,五、運行路徑,六、顯示方式

 

18.    經典安裝程序製作軟件:

InstallShield for Microsoft Visual C++6.0

release 方式是在build菜單中的Set Active configuration中改

project菜單裏面,Add to Projectcomponent and control來加入ocx控件

 

19.    控件的註冊:
1.
註冊

regsvr32 x:/xxx/demo.ocx
不一定非得在 Windows 系統目錄
2.
卸載

regsvr32 /u x:/xxx/demo.ocx

 

20.    獲取當前時間:
CTime m_time=CTime::GetCurrentTime();
char szText[100];
memset(szText,0,100);
sprintf(szText,"%d_%d_%d",m_time.GetHour(),m_time.GetMinite(),m_time.GetSecond());
  //
如何得到當前時間日期
    CTime time = CTime::GetCurrentTime();  
    CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");
    //
方法二

    SYSTEMTIME ti;
    GetSystemTime(&ti); //
如何得到當前時間日期

    ti.wMilliseconds; //
得到毫秒時間

SYSTEMTIME time;
CString str;
GetLocalTime( &time );
str.Format( "%04d:%02d:%02d",time.wYear,time.wMonth.....);

 

21.    修改單文檔程序的標題:
OnCreat()中加入  SetWindowText("weichao");
CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
中加入  cs.style =WS_OVERLAPPEDWINDOW;

 

22.    隱藏程序在任務欄的圖標:
對話框程序放OnInitDialog()函數:
SetWindowLong(this->m_hWnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//
隱藏任務攔按

 

23.    讀取編輯框內容:
GetDlgItemText(IDC_EDIT_TXDATA,m_strTXData);

 

24.    自繪菜單寬度不對,高度是對的,解決辦法:
ClassWizard中的ClassName,CMianFrame,Messages下選WM_CONTEXTMENU並生成相應的函數,如下:
 void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
 {
  CMenu menu;
     menu.LoadMenu(IDR_MENU1);//IDR_MENU1
是你要彈出菜單的ID
.
     CMenu *popup=menu.GetSubMenu(0);
     popup->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
 }

 

25.    重啓計算機:
調用一個API函數ExitWindowsEx就可以了, 兩個參數:UFlag,標記,可以選擇EWX_REBOOT,EWX_SHUTDOWN,EWX_POWEROFF再或上EWX_FORCE第二個參數就是0

 

26.    title對話框的移動:
void CScreenSnapDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    //
實現窗體無標題移動
    PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
    
    CDialog::OnLButtonDown(nFlags, point);
}

27.    獲取操作系統版本:
OSVERSIONINFO OsVersionInfo;//包含操作系統版本信息的數據結構
OsVersionInfo.dwOSVersionInfoSize= sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo);//
獲取操作系統版本信息

 

28.    設置對話框爲最頂層:(在OnInitDialog中添加)
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

 

29.    對話框程序不在任務欄顯示:(在OnInitDialog中添加)
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);

 

30.    向對話框窗口添加右鍵菜單:
 CMenu  menu,*pmenu;  
 menu.LoadMenu(IDR_MENU1);  
 pmenu=menu.GetSubMenu(0);  
 
 CPoint  ptScreen(point);  
 ClientToScreen(&ptScreen);  
 
 pmenu->TrackPopupMenu(TPM_RIGHTBUTTON,ptScreen.x,ptScreen.y,this); 

 

31.    文件查找:(例查找連續的換行符)
 FILE *fp,*fp1;
 int flag=0;
 int ch;
 fp=fopen("c://test.txt","r");
 fp1=fopen("c://wrttest.txt","w");
 while(!feof(fp))
 {
  ch=fgetc(fp);
  if(feof(fp))
   break;
  if(ch==
/n&&flag==1)
   continue;
  else if(ch==
/n
&&flag==0)
   flag=1;
  else
   flag=0;
  fputc(ch,fp1);
 }
 fclose(fp1);
 fclose(fp);

 

32.    托盤菜單不點擊不能消失的解決辦法:
在菜單之後使用下述代碼:
CPoint pt;
GetCursorPos(&pt);
SetForegroundWindow();
NotifyMenu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
PostMessage(WM_NULL,0,0);

 

33.    對話框由小到大顯示的動畫效果:

InitDialog中增加:
 ShowWindow(SW_HIDE);
 CRect dlgRect;
 GetClientRect(&dlgRect);
 CPoint centerPoint;
 centerPoint.x=dlgRect.Width()/2;
 centerPoint.y=dlgRect.Height()/2;//
得到對話框的中點座標
 CRgn testrgn;
 this->ShowWindow(SW_HIDE);  
 int m=GetSystemMetrics(SM_CYSIZEFRAME);
//
以下代碼實現對話框的動態彈出
 
 for (int i=10;i<dlgRect.Width()/2+m;i+=1)
 {   
  testrgn.CreateRectRgn(centerPoint.x-i,centerPoint.y-i,centerPoint.x+i,centerPoint.y+i);
  SetWindowRgn((HRGN) testrgn,TRUE);
  ShowWindow(SW_SHOW);
  CenterWindow();
  testrgn.DeleteObject();
 }

 

34.    按行讀出文本文件:

下面的例子演示了一行一行取,直到取完。
CStdioFile myFile;
CString ReadFileString;
if(myFile.Open("C://Readme.txt", Cfile::modeRead) == TRUE)

{

   while(myFile.ReadString(ReadFileString) != FALSE)

   { //... 處理代碼 }

}

35.    使用IDC_HAND時提示未定義,加入以下代碼:
#if(WINVER >= 0x0500)
#define IDC_HAND            MAKEINTRESOURCE(32649)
#endif /* WINVER >= 0x0500 */

 

36.    使應用程序啓動時不自動創建新文檔
在默認情況下,用AppWizard開發的SDI/MDI應用程序在啓動時創建一個新的文檔。如果要使應用程序在啓動時不創建新文檔,只需在應用類CmyApp::InitInstance()函數的ProcessShellCommand調用前加上下面的語句就可以了:
 cmdInfo.m_nShellCommand = CComandLineInfo::FileNothing;

 

37.    播放mp3
    CFileDialog file(true);
    if(file.DoModal()==IDOK)
    {
        CString filename=file.GetFileName();
        if(hwnd!=NULL)
        {
            MCIWndDestroy(hwnd);
        }
        hwnd=MCIWndCreate(this->m_hWnd,NULL,MCIWNDF_NOPLAYBAR,filename);
        ::ShowWindow(hwnd,SW_HIDE);
        MCIWndSetVolume(hwnd,1000);
        MCIWndPlay(hwnd);
    }

 

38.    獲取屏幕RGB值:OnTimer中添加
 CPoint pos;
 GetCursorPos(&pos);//
獲取鼠標座標
 HDC hDC = ::GetDC(NULL);
 COLORREF clr = ::GetPixel(hDC, pos.x, pos.y);
    
 CString ClrText;
 ClrText.Format("R:%d G:%d B:%d",GetRvalue(clr),GetGvalue(clr),GetBvalue(clr));

 

39.    打開一個網址:
打開http://www.sina.com.cn/這個站點如下:
ShellExecute(NULL, "open", "http://www.sina.com.cn",NULL, NULL, SW_MAXIMIZE );
此命令將以默認瀏覽器打開http://www.sina.com.cn,並將加開後的窗口最大化。

又例:

ShellExecute(NULL, "open", "IEXPLORE.exe http://www.sina.com.cn",NULL, NULL, SW_MAXIMIZE );
此命令將直接用IE打開一個sina的站點。不過將開一個新的窗口。

 

40.    位圖按鈕:
CButton *pRadio = (CButton*)GetDlgItem(IDC_RADIO);
pRadio->SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP)));

 

41.    如何創建快捷方式

// 創建快捷方式

BOOL CCreateLnkDlg::CreateLink(LPSTR szPath,LPSTR szLink)

{

      CoInitialize(NULL);

      HRESULT hres;

      IShellLink* psl;

      IPersistFile* ppf;

      WORD wsz[MAX_PATH];

  

      hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,

             IID_IShellLink, (void**)&psl);

      if(FAILED(hres))

             return FALSE;

 

      psl->SetPath(szPath);

  

      hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);

      if(FAILED(hres))

             return FALSE;

  

      MultiByteToWideChar(CP_ACP, 0, szLink, -1, wsz, MAX_PATH);

  

      hres = ppf->Save(wsz, STGM_READWRITE);

  

      ppf->Release();

      psl->Release();

  

      CoUninitialize();

      return TRUE;

}

// 如何使用

CreateLink("c://a.txt",  "d://a.lnk");

 

42.    在程序裏知道程序所在的絕對路徑

// 在程序裏知道程序所在的絕對路徑+文件名
TCHAR exeFullPath[MAX_PATH];
GetModuleFileName(NULL,exeFullPath,MAX_PATH);
MessageBox(exeFullPath,"FullPath",0);

// 絕對路徑
char dir[255];
GetCurrentDirectory(255,dir);
AfxMessageBox(dir);

 

43.    如何創建Hotkey[熱鍵]

// Member ID
UINT m_nIDHotKey; // hot key identifier

// OnInitDialog()
m_nIDHotKey = GlobalAddAtom("registerHotKeyWindow");
RegisterHotKey(m_hWnd, m_nIDHotKey, MOD_WIN|MOD_CONTROL|MOD_SHIFT|MOD_ALT, VK_F1);

// MESSAGE_MAP
ON_MESSAGE(WM_HOTKEY, OnHotKey)

// Function
LRESULT CMyDialog::OnHotKey(WPARAM wp, LPARAM lp)
{
 if (wp==m_nIDHotKey && !IsWindowVisible())
 {
  ShowWindow(SW_SHOWNORMAL);
 }
 return 0;
}

// OnDestroy()
::UnregisterHotKey(HWND hWnd,int id);

 

44.    打開多個文件

set<CString> filenameSet; // 保存文件名們

    CString filename; // 當前讀到的文件名

    TCHAR sBuffer[10000]; // 保存

    sBuffer[0] = 0;

    POSITION pos;

 

CFileDialog filedlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT|OFN_OVERWRITEPROMPT,

"代碼文件(*.c; *.cpp; *cxx; *.tli; *.tlh; *.inl; *.h; *.hpp; *.hxx)|*.c; *.cpp; *cxx; *.tli; *.tlh; *.inl; *.h; *.hpp; *.hxx

        |文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||" );

 

    filedlg.m_ofn.lpstrFile = sBuffer;

    filedlg.m_ofn.nMaxFile = 10000;

 

    if ( filedlg.DoModal() == IDOK )

    {

        pos = filedlg.GetStartPosition();

        while ( pos!=NULL)

        {

            filename = filedlg.GetNextPathName(pos);

            filenameSet.insert( filename );

        }

    }

    // 文件們保存在 filenameSet裏面了。。。

 

 

45.    把符號轉化爲字符串的宏技巧

#include <iostream>

using namespace std;

 

#define Enum2Str(e) #e
enum VALUE{ ONE ,TWO ,THREE };
void test(VALUE v);
void main()

{
test(ONE);
}

void test(VALUE v)
{
switch(v)
{
case ONE: cout << Enum2Str(ONE) << endl;break;
case TWO: cout << Enum2Str(TWO) << endl;break;
case THREE: cout << Enum2Str(THREE) << endl;break;
}
}

看了結果之後,相信你對這個宏有了初步的認識,事實上,它可以把任意的符號轉化爲字符串,也就是說,你不僅可以用來輸出enum值,而且可以用來輸出函數名,變量名等。
很容易想到的一個用途就是用來做log或者用以輸出調試信息。
這裏提供一個簡單的例子:

#include <iostream>

#include <windows.h>

using namespace std;

#define Symbol2Str(s) #s
//
利用OutputDebugString輸出調試信息:

#define MyCase(e) case e: OutputDebugString("VALUE is "); /
OutputDebugString(Symbol2Str(e) ); /
OutputDebugString("/n")
//
改寫上面的例子
enum VALUE{ ONE ,TWO ,THREE };
void test(VALUE v);

void main()
{
test(ONE);
}

void test(VALUE v)
{
switch(v)
{
MyCase(ONE);break; // F5 Debug
走到這裏的時候會顯示出來的
MyCase(TWO);break;
MyCase(THREE);break;
}
}

注意,爲了使用OutputDebugString(),你必須包含windows.h
到此爲止,相信你已經可以用這個宏爲自己的log或者調試信息的輸出搭建一個簡潔方便的平臺了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章