MFC使用總結

來源:互聯網
上載者:User

1. DoDataExchange(CDataExchange* pDX)函數

這是MFC APPWizard自動產生的對話方塊類的成員函數,其功能是用於完成對話方塊控制項和與之對應的成員變數的資料交換,函數的定義如下:

void CServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CServerDlg)
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Control(pDX, IDC_EDIT_IPADDRESS, m_ip);
DDX_Text(pDX, IDC_EDIT_PORT, m_port);
DDV_MinMaxUInt(pDX, m_port, 0, 65535);
//}}AFX_DATA_MAP
}

DDX_Control(pDX, IDC_LIST, m_list); 用於實現控制類控制項資料交換。DDX_Text(pDX, IDC_EDIT_PORT, m_port);用於一般用於完成編輯類如edit控制項的資料交換。它管理著對話方塊、表格視或控制項視對象中的編輯控制項(ID)與int,UINT,long,DWORD,CString,float或double型資料成員之間的資料交換。DDX_Text的函數原形為:

void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, TYPE& value );

參數: pDX    指向CDataExchange對象的指標。架構提供了這個對象,用於建立資料交換的環境及方向。      nIDC 對話方塊、表格視或控制項視中編輯控制項的ID。
            value 對對話方塊、表格視或控制項視對象的成員變數的引用,其類型取決於你使用了DDX_Text的哪一個重載版本。TYPE可以是int,UINT,long,DWORD,CString,float或double型。

DDV_MinMaxUInt(pDX, m_port, 0, 65535);函數是限定了成員變數m_port(整型)的取值範圍,當超出範圍時,系統會自動彈出警告。另外如果是字串類型的成員變數,還可以設定其字元數的上界。

上面的一切都是用MFC 的Class Wizard自動產生,在源檔案中則顯示為灰色。

2.DoModal()函數

用於產生模態對話方塊。一般這樣使用:

MyDlg mydlg;
mydlg.DoModal();

這裡mydlg是 MyDlg 的一個對象,調用這個函數,即產生了一個MyDlg類型的對話方塊。

MSDN上解釋如下:

Call this member function to invoke the modal dialog box and return the dialog-box result when done.

*Return Value
An int value that specifies the value of the nResult parameter that was passed to the CDialog::EndDialog member function, which is used to close the dialog box. The return value is –1 if the function could not create the dialog box, or IDABORT if some other error occurred, in which case the Output window will contain error information from GetLastError.

*Remarks
This member function handles all interaction with the user while the dialog box is active. This is what makes the dialog box modal; that is, the user cannot interact with other windows until the dialog box is closed.
*If the user clicks one of the pushbuttons in the dialog box, such as OK or Cancel, a message-handler member function, such as OnOK or OnCancel, is called to attempt to close the dialog box. The default OnOK member function will validate and update the dialog-box data and close the dialog box with result IDOK, and the default OnCancel member function will close the dialog box with result IDCANCEL without validating or updating the dialog-box data. You can override these message-handler functions to alter their behavior.

3.UpdateData(TRUE)與UpdateData(FALSE)

UpdateData(TRUE):是把當前螢幕上控制項顯示的值賦給它所對應的成員變數。UpdateData(FALSE)則與之相反,把修改後的變數值傳給它所對應的控制項更新顯示出來。

例如:你在你的表單中有一個Edit控制項,為這個控制項關聯了CString類型的變數m_strName;    你在控制項中添入內容之後,必須調用UpdateData(true);才能把你添入的內容傳給m_strName這個變數;而當你在程式中改變了m_strName變數的內容的時候,如果你想讓那個Edit也顯示更新後的m_strName,就必須調用UpdateData(false);    這樣在你的Edit中才能顯示更新完的變數的值!  

這裡需要注意的是,使用UpdateData()函數時,當前介面上所有綁定了的變數(即通過MFC ClassWizard給控制項添加了對應的變數)都會被UpdateData(TRUE)更新成對應控制項中的內容;同樣所有綁定了變數的控制項中的內容也會UpdateData(FALSE)更新成對應變數中的內容。所以資料量不多的話,最好用SetDlgItemText()和GetDlgItemText()。

4.AfxMessageBox()與MessageBox()

AfxMessageBox()一般應用於表單之中,沒有表單,或者是全域函數,不能使用該函數;   MessageBox()可以應用於沒有表單和有表單的兩種情況。

在有表單的情況下,兩者用法一樣,只需要三個參數,一個是顯示文本,一個是對話方塊名稱Caption,一個是顯示方式;如 MessageBox( "我的對話方塊", title, MB_OK); 不過後兩個參數是可以省略不寫的。在沒有表單或者全域函數中,他必須傳入一個表單控制代碼才可能執行,如果沒有,用NULL代替也可,但是此時該訊息框屬於案頭,可能達不到我們所需要的目的,所以一般要傳入一個視窗控制代碼。函數原形如下:

int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);例如::MessageBox(NULL, "我的對話方塊", title, MB_OK);

5.AfxEnableControlContainer()

顧名思義,AfxEnableControlContainer()函數是允許應用程式作為控制項容器來使用,也就是說你可以在這個應用程式中使用ocx之類的控制項。對於用MFC嚮導自動產生的單文檔架構程式的CXXXAPP::InitInstance()函數中自動加了這一句 AfxEnableControlContainer();

6.幾個DC

我的聊天程式中沒用到這個東西,無意中在網上搜到的,也貼下來。

CPaintDC      無效區dc,相當於BeginPaint,   EndPaint  
CClientDC     客戶區dc,相當於GetDC,   ReleaseDC  
CWindowDC     整視窗dc,   相當於GetWindowDC,   ReleaseDC  
CDC           任何dc,       相當於CreateDC,   DeleteDC        
  
CWindowDC   包括   由CClientDC+標題列;  
CClientDC     標題列以下部分;
CPaintDC   是CClientDC的真子集,且是無效的地區,重新繪製時要用到BeginPaint,EndPaint.
如果往一個對話方塊上繪整個客戶區大小的圖應該可以用CClientDC,如果小於整個客戶區請用CPaintDC

7._T()和_TEXT()

在VC6中,_T()和_TEXT()是一樣的,定義如下:
#define _T() __T()
#define _TEXT() __T() 為了相容老版本。

8.給CListCtrl控制項添加圖表

m_image.Create(16,16,TRUE|ILC_COLOR24,3,1);//m_image是個CImageList對象
clientlist.SetImageList(&m_image,LVSIL_SMALL);
m_image.Add(hIcon);//
HICON hIcon;
hIcon=AfxGetApp()->LoadIcon(IDI_XXX);
插入記錄時LV_ITEM lvitemAdd={0};
lvitemAdd.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;

9.線程處理函數寫在哪?

建立線程函數 AfxBeginThread(ProcThread,(LPVOID)m_Sock);寫在需要建立線程的地方,可線程處理函數ProcThread(LPVOID pParam)寫在哪呢?這個問題對初學者有點困惑吧?比如你的建立線程函數寫在對話方塊一個按鈕按下的處理函數OnButtonDown()中,那麼ProcThread是不是要作為該對話方塊類的成員函數呢?還是寫成全域?

正確答案是,要麼把該線程處理函數ProcThread(LPVOID pParam)寫成全域函數,要麼寫成該對話方塊類的成員函數,注意一定要把該成員函數定義為靜態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.