MFC 控件使用教程


 

combo box控件用法:

下拉選擇控件,首先將控件拖動到你需要使用控件的地方,用ClassWizard為它關聯一個變量,我們注意到變量類型是CString型的。右擊屬性,General中可以設置一般屬性類容Data中可以設置該控件下拉選擇的內容,Styles中設置combo box控件風格,Extended Styles設置擴展風格,主要的設置在Data中,Data中設置了下拉菜單的所有下拉內容,如圖所示。

在Data中每一行作為一個下拉菜單的一行內容,其中要注意的是換行應該用Ctrl+Enter。

在確定按鈕添加消息響應函數為

[cpp]  view plain  copy
 
  1. UpdateData(TRUE);  
  2. char *   sz   =   m_nihao.GetBuffer(m_nihao.GetLength());  
  3. MessageBox(sz,"ss",MB_OK);  

 


Button:

按鈕控件是最簡單的一個控件,將按鈕拖動到要顯示的地方,右擊屬性設置按鈕的ID,名稱,也可以使用SetDlgItemText來設置按鈕的文本,雙擊拖動好的按鈕為按鈕添加消息響應函數即可,有一個小竅門,要實現單擊按鈕后實現按鈕文本改變的方法,直接在消息響應函數中添加SetDlgItemText函數即可,在按鈕單擊時改變按鈕的文本。

[cpp]  view plain  copy
 
  1.         int ret;  
  2. UpdateData(TRUE);  
  3. SetDlgItemText(IDOK,"已經按下");  
  4. char *   sz   =   m_nihao.GetBuffer(m_nihao.GetLength());  
  5. ret=MessageBox(sz,"ss",MB_OK);  
  6. if (ret==IDOK)  
  7. {  
  8.     SetDlgItemText(IDOK,"確定");  
  9. }  

 

 


Check Box控件:

Check Box控件是一個多選控件,首先添加一個Check Box控件到你的用戶界面,用ClassWizard關聯變量時發現這個控件的變量類型是BOOL型變量,那么我們就基本上了解這個控件的用法了,檢查這個控件是否被按下的一個簡單方法就是判斷這個控件的虛擬變量值是TRUE還是FLASE。但是首先需要UpdateData(TRUE);

那么我們就為OnOK這個按鈕添加消息響應函數:

[cpp]  view plain  copy
 
  1. UpdateData(TRUE);  
  2. if (m_check==TRUE)  
  3. {MessageBox("Check Box按下",NULL,MB_OK);}  

就能實現我們的功能。

 

 

Radio Button:

這個按鈕實現的目的和Check Box差不多但是不同的是Check Box控件是在最終我們需要執行的消息響應函數中才檢查這個選項是否被選中,而Radio Button是按下后,界面立即響應,執行這個按鈕的消息響應函數,所以這個控件沒有虛擬變量,而是直接為這個控件添加消息響應事件,和按鈕的添加方法相同,不做過多贅述。

 

 

List Control:

List Control這個控件比較有意思,我對這個控件使用的也比較少,這里只提供一種使用方法,這里以我做過的一個網絡嗅探器為例:

這里以***代表工程名,如sniffer。

首先拖動控件到你需要使用控件的地方,打開ClassWizard,為其關聯一個變量,如:m_CtrList。然后找到***Dlg.cpp文件,在對話框函數中(文檔工程也許不同,但都在主窗口函數中)BOOL C***Dlg::OnInitDialog()中添加如下代碼設置空間風格:

[cpp]  view plain  copy
 
  1. DWORD dwStyle=GetWindowLong(m_CtrList.GetSafeHwnd(),GWL_STYLE);                   
  2. dwStyle&=~LVS_TYPEMASK;  
  3. dwStyle|=LVS_REPORT;  
  4. SetWindowLong(m_CtrList.GetSafeHwnd(),GWL_STYLE,dwStyle);  


最后插入想要輸入的列名:

[cpp]  view plain  copy
 
  1. m_CtrList.InsertColumn(0,"數據",LVCFMT_LEFT,525);  
  2.     m_CtrList.InsertColumn(0,"目的端口",LVCFMT_LEFT,60);  
  3.     m_CtrList.InsertColumn(0,"源端口",LVCFMT_LEFT,50);  
  4.     m_CtrList.InsertColumn(0,"協議",LVCFMT_LEFT,40);  
  5.     m_CtrList.InsertColumn(0,"目的IP地址",LVCFMT_LEFT,100);  
  6.     m_CtrList.InsertColumn(0,"源IP地址",LVCFMT_LEFT,100);      

這個基本上控件就設置好了,下面說明如何顯示需要輸出的文本:

假設每一列的數據都依次在S[3],port1,port2,date中,都是字符串

[cpp]  view plain  copy
 
  1. index=m_CtrList.InsertItem(0,s1);//創建一行  
  2. m_CtrList.SetItemText(index,1,s2);  
  3. m_CtrList.SetItemText(index,2,s3);  
  4. m_CtrList.SetItemText(index,3,port1);  
  5. m_CtrList.SetItemText(index,4,port2);  
  6. m_CtrList.SetItemText(index,5,date);  

這樣就可以顯示出正確的文本了。

 

 

Edit Box:

這個控件是MFC的主要輸入控件,從英文名稱就可以看出來。

這個控件的使用也相當簡單,用鼠標拖動控件到想要使用的地方,打開ClassWizard為其關聯虛擬變量,關聯的時候可以選擇這個變量的類型,有INT,CString,UINT。。。。等等N多種類型,幾乎涵蓋了所有常用變量類型。關聯好變量之后就可以使用了。

[cpp]  view plain  copy
 
  1. UpdateData(TRUE);  
  2. char *   sz   =m_edit.GetBuffer(m_edit.GetLength());  
  3. MessageBox(sz,"ss",MB_OK);  

另外用Edit Box控件輸出一些內容也是可以的,只需要把要輸出的內容直接賦值給這個控件的關聯變量即可,最后刷新數據。

[cpp]  view plain  copy
 
  1. void CAaDlg::OnOK()   
  2. {  
  3.     // TODO: Add extra validation here  
  4.     m_edit="你好";  
  5.     UpdateData(FALSE);//注意這里UpdateData的參數是FALSE,至於參數問題,可以自行查找MSDN  
  6. }  
  7.   
  8.    

 

 

Process:

進度條控件也是一個常用控件,當我們將進度條拖動到界面上時為其添加一個消息響應函數,我們會看到消息響應函數的類型是CProcessCtrl,我們通過查詢MSDN不難發現,微軟為我們提供了很多進度條函數。最常用的就是三個函數。

SetRange    設置進度條最大最小值

SetStep      設置進度條步長

StepIt       增加一個步長

至於進度條的風格,可以右擊進度條屬性設置,也可以CProcessCtrl類中的成員函數。

首先和List Box控件一樣,我們需要在C***Dlg::OnInitDialog()函數中設置好進度條的最大最小值,以及步長等一些必要屬性,包括進度條風格等等。

然后就要在需要的時候增加步長,我們還以上面網絡嗅探器為例,,我們循環500次,嗅探500個網絡數據包,那么設置進度條最小值為0最大值為500,步長為1,那么每次循環增加一次步長就可以了,這個很好理解。

[cpp]  view plain  copy
 
  1. C***Dlg::OnInitDialog()中添加如下代碼:  
  2. m_process.SetRange(0,500);//設置進度條進度范圍  
  3. m_process.SetStep(1);//設置進度條步長  

循環部分添加如下代碼:

每一次循環中m_process.StepIt();

 

 

Hot Key:

熱鍵是MFC中非常重要的一個控件之一,熱鍵可以輕松實現一個甚至多個組合鍵的熱鍵,如果沒有熱鍵,假使你要用動態鏈接庫dll或者其他什么全局鈎子的方法實現熱鍵功能的話可謂相當麻煩,甚至很難解決數量不定的多個組合鍵的熱鍵,所以掌握好熱鍵可以幫助我們很多事情。

MFC封裝的熱鍵使得我們編程起來也是相當容易。步驟大概就是輸入熱鍵->注冊熱鍵->填寫消息映射->填寫熱鍵響應函數,這里有兩個小細節。

1.       根據資料,注冊熱鍵之后有兩種方法實現熱鍵,此處寫的是RegisterHotKey方法實現的熱鍵。

2.       根據網上的資料,MFC的熱鍵的宏定義和API函數RegisterHotKey的宏定義是有誤差的,這算是一個BUG,導致CTRL和Shift鍵相互顛倒,但是不幸的是我在寫程序的時候並沒有遇到這種情況,也不能妄下定論。

下面我們來看看Hot Key控件時如何使用的。

1.首先按照步驟輸入熱鍵:

拖動一個Hot Key控件到想設置的地方,用ClassWizard為其關聯一個變量,比如m_Hotkey,這樣就可以接受到輸入的熱鍵了。

2.注冊熱鍵:

這一步的目的是為了向窗口注冊一個熱鍵,當熱鍵來到的時候向窗口發送WM_HOTKEY的消息。我們在我們的“注冊”按鈕的消息響應函數中添加如下代碼:

[cpp]  view plain  copy
 
  1. WORD virtualcode,modifiers;  
  2. m_Hotkey.GetHotKey(virtualcode,modifiers);            //接收熱鍵信息存儲下來  
  3. if (!RegisterHotKey(this->m_hWnd,100,modifiers,virtualcode))     //注冊熱鍵  
  4. {  
  5.     MessageBox("熱鍵設置沖突","錯誤",MB_OK);  
  6. }  
  7. else  
  8.     MessageBox("熱鍵設置成功","成功",MB_OK);  

3.填寫消息映射:

到這一步我們的熱鍵已經注冊成功了,但是我們按下熱鍵時,時沒有反應的,因為我們並沒有告訴計算機,按下熱鍵以后干什么。MFC是一個基於消息驅動的框架代碼。所以我們要為我們要就收WM_HOTKEY的窗口添加消息映射,使得當窗口接收到WM_HOTKEY消息的時候能夠執行我們的熱鍵函數。打開ClassWizard

我們在其中並沒有發現WM_HOTKEY消息,微軟並沒有為我們封裝,所以我們只有自己動手了。

在***Dlg.cpp文件中找到如下代碼:

[cpp]  view plain  copy
 
  1. BEGIN_MESSAGE_MAP(CMFCHotKeyDlg, CDialog)  
  2.     //{{AFX_MSG_MAP(CMFCHotKeyDlg)  
  3.     ON_WM_SYSCOMMAND()  
  4.     ON_WM_PAINT()  
  5.     ON_WM_QUERYDRAGICON()  
  6.     ON_BN_CLICKED(IDOK, OnSet)  
  7.     //}}AFX_MSG_MAP  
  8. END_MESSAGE_MAP()  

這是MFC自定義的一個消息映射處理代碼,在其中添加ON_MESSAGE(WM_HOTKEY,MyHotKey),這里的MyHotKey是我們等會需要定義的自定義熱鍵處理函數。

4.填寫熱鍵響應函數:

找到***Dlg.h的頭文件,在窗口類的protected中添加一個消息響應函數申明afx_msg void MyHotKey(WPARAM wp,LPARAM lp);

然后再***Dlg.cpp文件中添加消息響應函數的定義:

[cpp]  view plain  copy
 
  1. void CMFCHotKeyDlg::MyHotKey(WPARAM wp,LPARAM lp)  
  2. {  
  3.     MessageBox("熱鍵運行成功","SUCCESS",MB_OK);  
  4. }  


這樣基本上就可以了。

 

 

IP Address:

IP控件也是常用的控件之一,也是最簡單的一個控件,MFC對他的封裝無非就是一個字符串的處理。使用起來也相當簡便。

首先拖動控件到指定的地方,用ClassWizard為其關聯一個變量,我們看到變量的類型任然是一個類,IPAddressCtrl的類,下面介紹幾種常用的操作:

1,  將IP地址輸出到Ip控件顯示:只需要短短兩行代碼,假定要顯示的IP地址是192.168.1.1,則在確定的消息相應函數添加

[cpp]  view plain  copy
 
  1. CString a="192.168.1.1";  
  2. m_ip.SetWindowText(a);  


 

2.     將IP地址輸入到程序中:

[cpp]  view plain  copy
 
  1. BYTE a1,a2,a3,a4;  
  2. m_ip.GetAddress(a1,a2,a3,a4);  
  3. CString str;  
  4. str.Format("%d.%d.%d.%d",a1,a2,a3,a4);//這里的nf得到的值是IP值了.  
  5. MessageBox(str);  


 


免責聲明!

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



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