MFC 基礎知識:對話方塊背景新增圖片和按鈕Button新增圖片
阿新 • • 發佈:2019-02-18
很長時間沒有接觸MFC相關的知識了,我大概是在大二時候學習的MFC相關知識及影象處理,現在由於要幫個朋友完成個基於C++的程式,所以又回顧了下相關知識。的確,任何知識一段時間過後都比較容易忘記,但回顧起來還是很有印象的。
這篇文章主要是回顧以前的MFC基礎知識,給對話方塊新增背景圖片和給按鈕button新增背景圖片;希望此篇基礎性文章對大家有所幫助!同時為下次做MFC相關知識提供點此時所想所感吧。內容比較簡單,高手飄過~
一. 對話方塊背景新增圖片
首先通過VS2012建立MFC對話方塊應用程式,專案名為RecoveryMovie;然後在資源檢視中開啟Dialog,即IDD_RECOVERYMOVIE_DIALOG,再編輯對話方塊刪除預設內容。
第二步右鍵“資源檢視”中的專案名稱,新增資源。
第三步新增選擇Bitmap匯入圖片,圖片檔案最好放在專案res目錄中,同時是BMP格式圖片。上傳後的圖片如下圖所示IDB_BITMAP1。
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/)