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:this

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

[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控件:.net

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

那麼咱們就爲OnOK這個按鈕添加消息響應函數:orm

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

就能實現咱們的功能。blog

 

 

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);  


相關文章
相關標籤/搜索