1. 程式人生 > >MFC對話方塊程式設計雜談

MFC對話方塊程式設計雜談

  1. 區分BITMAP、CBitmap和HBITMAP

    ①BITMAP   BITMAP是一個結構體,封裝著bitmap的一些資訊。定義了邏輯點陣圖的寬高、顏色格式和位值。 ②CBitmap   CBitmap是MFC中封裝bitmap的類,包含著被點陣圖的屬性和對點陣圖的操作。 ③HBITMAP   HBITMAP是bitmap的控制代碼,也就是bitmap資源的標識。 ④三者的聯絡   通過CBitmap類的attach操作,可以將代表Windows資源的HBITMAP物件關聯到CBitmap物件;   通過CBitmap類的GetBitmap操作,可以得到CBitmap物件中封裝的bitmap成員;   通過CBitmap類的GetSafeHandle操作,可以得到CBitmap物件所關聯的代表Windows資源的HBITMAP物件。

  2. 在控制元件上繪圖   可以在對話方塊資源中放置圖片控制元件,並對其型別屬性選Frame。可在對話方塊的繪圖訊息響應函式OnPaint或其他函式中,用CWnd類的函式GetDlgItem:CWnd* GetDlgItem( int nID ) const;來獲得圖片控制元件的視窗物件,再用函式GetDC:CDC* GetDC( );由視窗物件得到DC,然後就可以用該DC在控制元件中畫圖。   CWnd *pWin = GetDlgItem(IDC_HUESAT);   CDC *pDC = pWin->GetDC();   pDC->SetPixel(i, j, RGB(r, g, b));   在非Frame類靜態控制元件上繪圖,必須先按順序依次呼叫CWnd類的Invalidate和UpdateWindow函式後,再開始用DC畫圖。如在一個ID為IDC_COLOR的按鈕上繪圖:   CWnd* pWnd = GetDlgItem(IDC_COLOR);   CDC* pDC = pWnd->GetDC();   CRect rect;   pWnd->GetClientRect(&rect);   pWnd->Invalidate();   pWnd->UpdateWindow();   pDC->FillRect(&rect, new CBrush(m_crCol));   一般的對話方塊類,預設時都沒有明寫出OnPaint函式。可以自己在對話方塊類中新增WM_PAINT訊息的響應函式OnPaint來進行一些繪圖工作。 為了在滑鼠指向按鈕時,讓按鈕上自己繪製的圖形不被消去,可以設定按鈕控制元件的“Owner Draw”屬性為“True”。   如果希望非按鈕控制元件(如圖片控制元件和靜態文字等),也可以響應滑鼠訊息(如單擊、雙擊等),需要設定控制元件的“Notify”屬性為“True”。   使用OnPaint函式在對話方塊客戶區的空白處(無控制元件的地方)繪製自己的圖形,必須遮蔽掉其中預設的對對話方塊基類的OnPaint函式的呼叫。   如果讓控制元件大小適應圖片大小可以用SizeToContent()函式。
  3. MFC中獲取按鈕控制元件的尺寸的方法: CRect rectTemp; GetDlgItem(IDC_BUTTON1)->GetWindowRect(rectTemp); 該函式返回指定視窗的邊框矩形的尺寸。該尺寸以相對於螢幕座標左上角的螢幕座標給出。left ;top; right;bottom;分別表示該視窗的/左側/頂部/右側/底部座標。
  4. 影象控制的建立也包括兩個步驟,首先建立影象列表結構,然後建立影象列表控制。   構造CImageList物件,呼叫其Create函式的一個過載來建立影象列表並將影象列表附加到CImageList物件;如果在建立影象列表時沒有新增影象,則呼叫Add或Read成員函式向影象列表新增影象;通過呼叫控制元件的適當成員函式,將影象列表與此控制元件相關聯。影象控制的屬性類包括返回m_hImageList.控制控制代碼GetSafeHandle、取得影象列表中的影象數量GetImageCount、設定影象列表的背景顏色SetBkColor、取得影象列表的背景顏色GetBkColor和取得影象的有關資訊SetBkColor。
  5. MFC單文字結構中通過選單彈出新對話方塊: ①在資源中建立新對話方塊 ②在ClassView為新對話方塊新增類,如Cdlg1,同時自動生成檔案dlg1.h,dlg1.cpp ③在選單中新增對話方塊子選單,並在ClassView為該項新增相應的訊息響應函式 ④在建立響應函式所在的檔案前加入#include ‘dlg1.h’標頭檔案 ⑤在相應響應函式裡新增程式碼Cdlg1 ss; ss.DoModal();
  6. CPaintDC 、CWindowDC、 CClientDC、 CDC的區別與聯絡

    CPaintDC 無效區dc, 相當於BeginPaint, EndPaintCClientDC 客戶區dc,相當於GetDC, ReleaseDCCWindowDC 整個視窗dc,相當於GetWindowDC, ReleaseDCCDC 任何dc,相當於CreateDC, DeleteDC

      CPaintDC物件通常響應WM_PAINT訊息時,在OnPaint訊息處理函式中被使用。CPaintDC在建構函式中呼叫BeginPaint()取得裝置上下文,在解構函式中呼叫EndPaint()釋放裝置上下文。EndPaint()除了釋放裝置上下文外,還負責從訊息佇列中清除WM_PAINT訊息。因此,在處理視窗重畫時,必須使用CPaintDC,否則WM_PAINT訊息無法從訊息佇列中清除,將引起不斷的視窗重畫。CPaintDC也只能用在WM_PAINT訊息處理之中。   CClientDC(客戶區裝置上下文)用於客戶區的輸出,它在建構函式中封裝了GetDC(),在解構函式中封裝了ReleaseDC()函式。一般在響應非視窗重畫訊息(如鍵盤輸入時繪製文字、滑鼠繪圖)繪圖時要用到它。CClientDC用於視窗的客戶區(不包括標題欄、邊框)。   CwindowDC是從CDC類繼承,用於得到桌面視窗裝置環境指標。CwindowDC用於整個視窗,包括非客戶區。

  7. 全域性變數,全域性靜態變數,區域性變數,區域性靜態變數區別   全域性變數:作用於所有原始檔,整個程式週期。在某個類執行檔案的所有函式外定義,每次使用時,在需要使用的地方加註extern ,變數型別,變數名宣告一下即可使用。注意不要在標頭檔案裡宣告。   全域性靜態變數,作用範圍限於定義這個變數的執行檔案中,整個程式週期。   區域性變數:作用於定義它的函式內,函式返回時,該變數銷燬。   區域性靜態變數:作用於定義它的函式內,函式返回時,該變數仍然存在,下次直接使用該值。
  8. 單文字文件頁顯示內容   在CXXXXView類的OnDraw函式中進行顯示內容的編寫,有兩種方法:   ① 用客戶區指標,將函式改寫成void CXXXView::OnDraw(CDC* pDC) pDC->TextOutW();   ② 用客戶區物件,在函式中新增CClientDC dc(this); dc. TextOutW(); 客戶區文字顯示可用TextOutW()函式,數字顯示可用Formate()函式將數字寫進字串再進行顯示。但TextOut只支援單行輸出,不支援換行。DrawText支援在矩形框內換行,進行多行輸出。
  9. 讓int型別控制元件預設不顯示0:可在對話方塊初始化時用SetDlgItemTextW(IDC_XXX,_T(“”));語句將該控制元件初始化為空。
  10. 使用指標需注意:   使用前不光要定義,還一定要初始化賦值,讓其指向一個有意義的空間才可使用。可以通過new的方法讓指標指向一片新空間,也可以通過給指標變數賦一個明確的地址值的方法。否則執行時會報錯指標訪問衝突。
  11. 如需重繪客戶區,只需在該類中呼叫Invalidate();函式即可。如需關閉對話方塊重繪,可以在建立對話方塊的語句下加Invalidate();,即可在關閉對話方塊時重繪。
  12. 建立摸態對話方塊:主要利用DoModal()函式   在當前的工程中,利用對話方塊模板新增需要顯示的對話方塊,併為其新增類CModalDlg,主框架的程式檔案包含該類的標頭檔案,再將主框架上對應的選單響應函式OnModal編輯如下:CModalDlg dlg; dlg.DoModal();
  13. 建立非模態對話方塊:主要利用Create()函式   在當前的工程中,利用對話方塊模板新增需要顯示的對話方塊,併為其新增類CModallessDlg,主框架的程式檔案包含該類的標頭檔案,再將主框架上對應的選單響應函式OnModalessl編輯如下:   CModallessDlg*pdlg;   pdlg=new CModallessDlg();   pdlg->Create(IDD_MODALLESS);   pdlg->ShowWindow(SW_SHOW);   關閉視窗時,利用類嚮導響應類CModallessDlg的訊息WM_NCDESTROY,函式名為OnNcDestroy,編輯如下:   CDialogEx::OnNcDestroy();   delete this;   對於非模態對話方塊的程式設計必須過載OnOK和OnCancel函式,取消呼叫基類函式,新增銷燬非模態對話方塊視窗語句:DestroyWindow();
  14. 改變字型顏色。   CFont類,以及LOGFONT邏輯字型結構中都不包含字型顏色的成員變數。要想改變字型顏色需要自定義COLORREF型別物件傳遞字型顏色。例如先用CFontDialog字型選擇通用對話方塊的物件得到字型顏色,  COLORREF m_color;   CFontDialog fontDlg;   m_color=fontDlg.GetColor();   然後再在需要顯示的地方設定輸出字型顏色:   CClientDC dc(this);   dc.SetTextColor(m_color);
  15. 開啟檔案通用對話方塊的使用。   首先建立CFileDialog類的物件filedialog,true為開啟檔案對話方塊,false為儲存檔案對話方塊,然後呼叫DoModal()成員函式建立該對話方塊,進而可以使用其他成員函式來進行獲取檔名及路徑。例如:   GetFileExt():獲得選定檔案的字尾名。   GetFileName():獲得選定檔案的名稱,包括字尾名。   GetFileTitle():獲得選定檔案的標題,即不包括字尾名。   GetFolderPath():獲得選定檔案的目錄。   GetNextPathName():獲得下一個選定的檔案的路徑全名。   GetPathName():獲得選定檔案的路徑全名。   CFileDialog可用於建立通用對話方塊及獲取檔名和路徑,其他關於檔案的操作則多用CFile類完成,比如獲取檔案狀態以及讀寫。
  16. 對話方塊間通訊通常有全域性變數,物件訪問,傳送訊息等方法。   父對話方塊和模態子對話方塊之間傳遞可用物件訪問的方法。父對話方塊的值傳給非模態子對話方塊可以用物件訪問方法,非模態子對話方塊的值傳遞給父對話方塊可以用傳送訊息或利用父對話方塊指標。例如:   C父類名 * parent = (C父類名 *)GetParent();   parent->m_parentnum=m_subnum;
  17. 指標應用基本流程。①定義指標②將指標初始化為NULL③判斷指標釋放為空,若不為空,則刪除指標,使其指向空④給指標new一片空間,最後進行使用。
  18. MFC中load圖片路徑名都用雙\\間隔。