1. 程式人生 > >MFC 基礎知識:對話方塊背景新增圖片和按鈕Button新增圖片

MFC 基礎知識:對話方塊背景新增圖片和按鈕Button新增圖片

        很長時間沒有接觸MFC相關的知識了,我大概是在大二時候學習的MFC相關知識及影象處理,現在由於要幫個朋友完成個基於C++的程式,所以又回顧了下相關知識。的確,任何知識一段時間過後都比較容易忘記,但回顧起來還是很有印象的。
        這篇文章主要是回顧以前的MFC基礎知識,給對話方塊新增背景圖片和給按鈕button新增背景圖片;希望此篇基礎性文章對大家有所幫助!同時為下次做MFC相關知識提供點此時所想所感吧。內容比較簡單,高手飄過~

一. 對話方塊背景新增圖片

        首先通過VS2012建立MFC對話方塊應用程式,專案名為RecoveryMovie;然後在資源檢視中開啟Dialog,即IDD_RECOVERYMOVIE_DIALOG,再編輯對話方塊刪除預設內容。
        第二步右鍵“資源檢視”中的專案名稱,新增資源。


        第三步新增選擇Bitmap匯入圖片,圖片檔案最好放在專案res目錄中,同時是BMP格式圖片。上傳後的圖片如下圖所示IDB_BITMAP1。

           第四步開啟“解決方案”中XXXDlg.cpp檔案(該對話方塊對應的原始檔),找到OnPaint()函式,修改else部分程式碼,如下:
	else
	{
		//註釋該語句:防止重複呼叫重畫函式
		//CDialogEx::OnPaint();

		//新增程式碼對話方塊背景貼圖
		CPaintDC   dc(this);   
		CRect   rect;   
		GetClientRect(&rect);                                 //獲取對話方塊長寬       
		CDC   dcBmp;                                           //定義並建立一個記憶體裝置環境
		dcBmp.CreateCompatibleDC(&dc);                         //建立相容性DC
		CBitmap   bmpBackground;   
		bmpBackground.LoadBitmap(IDB_BITMAP1);                 //載入資源中的IDB_BITMAP1圖片
		BITMAP   m_bitmap;                                     //圖片變數                
		bmpBackground.GetBitmap(&m_bitmap);                    //將圖片載入點陣圖中
		CBitmap   *pbmpOld=dcBmp.SelectObject(&bmpBackground); //將點陣圖選入臨時記憶體裝置環境  
		//呼叫函式顯示圖片 StretchBlt顯示形狀可變
		dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcBmp,0,0,
			m_bitmap.bmWidth,m_bitmap.bmHeight,SRCCOPY);   	

		/******************************************************/
		/** StretchBlt()                                     **/
		/** 引數x、y點陣圖目標矩形左上角x、y的座標值 居中      **/
		/** nWidth、nHeigth點陣圖目標矩形的邏輯寬度和高度      **/
		/** pSrcDC表示源裝置CDC指標                          **/
		/** xSrc、ySrc表示點陣圖源矩形的左上角的x、y邏輯座標值 **/
		/** dwRop表示顯示點陣圖的光柵操作方式                  **/
		/** SRCCOPY用於直接將點陣圖複製到目標環境中            **/
		/******************************************************/
	}


        此時執行程式即可顯示背景圖片,同時你拉伸對話方塊時可能會出現閃動Bug。
        因此你可以設定Dialog的屬性Border為Dialog Frame(對話方塊外框),預設的Resizing是可以調控大小的。
        注意:如果影象出現失貞,新增程式碼如下:
dc.SetStretchBltMode(COLORONCOLOR);// 若不設定這個模式,圖片會嚴重失真
dc.StrtchBlt....

二. 按鈕BUTTON新增背景圖片

        首先在“資源檢視”中給Dialog新增3個按鈕,分別為IDC_BUTTON1、IDC_BUTTON2和IDC_BUTTON3,如下圖所示:

        第二步按照前面的方法新增資源:按鈕背景圖片,即“播放視訊”圖片。新增後在資源檢視中選中圖片資源,點選屬性可以修改ID值。如下圖所示,把IDB_BITMAP2修改為IDB_StartMovie1。
          第三步通過快捷鍵(Ctrl+Shift+X或檢視->類嚮導)開啟“類嚮導”,選擇類名為CRecoverMovieDlg,在成員變數中點選新增變數,如下圖新增3個按鈕的成員變數。



        此時你會發現在XXXDlg.cpp中函式DoDataExchange()中會自動增加下面DDX_Control()的程式碼:
void CRecoveryMovieDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_BUTTON1, m_buttonstart);
	DDX_Control(pDX, IDC_BUTTON2, m_buttonfix);
	DDX_Control(pDX, IDC_BUTTON3, m_buttonexit);
}
        第四步在XXXDlg.cpp中找到初始化函式OnInitDialog(),在“// TODO:在此新增額外的初始化程式碼”中新增如下程式碼:
	// TODO: 在此新增額外的初始化程式碼

	//初始化視窗 設定視窗為500*500大小
	MoveWindow(0,0,500,500);  

	/*******************************************************************************/
	/* (重點知識:實現按鈕位置設定)                                                 */
	/*    1.使用Ctrl+Shift+X開啟類資源導向 增加開始\結束按鈕的成員變數 Button型    */
	/*    2.使用函式SetWindowPos()設定兩個按鈕的位置                               */
	/*******************************************************************************/

	/*******************************************************************************/
	/* SetWindowPos()函式                                                          */
	/*		引數:const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags */
	/*      hwnd是視窗的控制代碼,x、y、cx、cy分別是視窗的x和y座標、寬和高度           */
	/*      hWndInsertAfter用來指定視窗的Z位置,代表深度.這個引數接受5種值:         */
	/*  HWND_BOTTOM、 HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST或者另一個視窗的控制代碼   */
	/*      wFlags用來指定附加的選項                                               */
	/*******************************************************************************/

	//視窗控制代碼設定為NULL SWP_SHOWWINDOW顯示視窗  SWP_NOSIZE保持當前大小忽略cx\xy故設定為0
	m_buttonstart.SetWindowPos(NULL,20,280,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);   
	m_buttonfix.SetWindowPos(NULL,20,325,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);  
	m_buttonexit.SetWindowPos(NULL,20,370,0,0,SWP_SHOWWINDOW|SWP_NOSIZE);  

	//設定按鈕屬性 點選按鈕背景圖片變換
	m_buttonstart.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);
	m_buttonfix.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);
	m_buttonexit.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);

	return TRUE;  // 除非將焦點設定到控制元件,否則返回 TRUE
       此時你執行程式會出現如下錯誤:Error class "CButton"沒有成員“LoadBitmaps”。函式LoadBitmaps()的功能是點選按鈕實現兩張背景圖片的替換。
        第五步需要在XXXDlg.h標頭檔案中把public成員變數CButton全部修改為CBitmapButton,如下圖為修改第一個變數所示:
// CRecoveryMovieDlg 對話方塊
class CRecoveryMovieDlg : public CDialogEx
{
// 構造
public:
	CRecoveryMovieDlg(CWnd* pParent = NULL);	// 標準建構函式

// 對話方塊資料
	enum { IDD = IDD_RECOVERYMOVIE_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支援

// 實現
protected:
	HICON m_hIcon;

	// 生成的訊息對映函式
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CBitmapButton m_buttonstart;
	CBitmapButton m_buttonfix;
	CBitmapButton m_buttonexit;
};
        第六步:此時雖然你能執行程式,但是按鈕背景依然沒有,因為你還需要分別設定三個按鈕的屬性“Owner Draw”為True,它指定按鈕為所有者描述的按鈕。
        執行結果如下圖所示:
 
        最後希望文章對大家有所幫助,如果文章中有不足之處或錯誤的地方,還請海涵!個人推薦初學者尤其很多老師佈置作業需要用MFC完成的可以學習,沒有什麼語言流行,它們都是貫通的,都需要一步一個腳印的去學習。
        (By:Eastmount 2015-4-27 深夜3點   http://blog.csdn.net/eastmount/