MFC 基础知识:对话框背景添加图片和按钮Button添加图片
? ? ? ? 很長時(shí)間沒有接觸MFC相關(guān)的知識(shí)了,我大概是在大二時(shí)候?qū)W習(xí)的MFC相關(guān)知識(shí)及圖像處理,現(xiàn)在由于要幫個(gè)朋友完成個(gè)基于C++的程序,所以又回顧了下相關(guān)知識(shí)。的確,任何知識(shí)一段時(shí)間過后都比較容易忘記,但回顧起來還是很有印象的。
? ? ? ? 這篇文章主要是回顧以前的MFC基礎(chǔ)知識(shí),給對(duì)話框添加背景圖片和給按鈕button添加背景圖片;希望此篇基礎(chǔ)性文章對(duì)大家有所幫助!同時(shí)為下次做MFC相關(guān)知識(shí)提供點(diǎn)此時(shí)所想所感吧。內(nèi)容比較簡(jiǎn)單,高手飄過~
一. 對(duì)話框背景添加圖片
? ? ? ? 首先通過VS2012創(chuàng)建MFC對(duì)話框應(yīng)用程序,項(xiàng)目名為RecoveryMovie;然后在資源視圖中打開Dialog,即IDD_RECOVERYMOVIE_DIALOG,再編輯對(duì)話框刪除默認(rèn)內(nèi)容。
? ? ? ? 第二步右鍵“資源視圖”中的項(xiàng)目名稱,添加資源。
? ? ? ? 第三步添加選擇Bitmap導(dǎo)入圖片,圖片文件最好放在項(xiàng)目res目錄中,同時(shí)是BMP格式圖片。上傳后的圖片如下圖所示IDB_BITMAP1。
?? 第四步打開“解決方案”中XXXDlg.cpp文件(該對(duì)話框?qū)?yīng)的源文件),找到OnPaint()函數(shù),修改else部分代碼,如下: else{//注釋該語句:防止重復(fù)調(diào)用重畫函數(shù)//CDialogEx::OnPaint();//添加代碼對(duì)話框背景貼圖CPaintDC dc(this); CRect rect; GetClientRect(&rect); //獲取對(duì)話框長寬 CDC dcBmp; //定義并創(chuàng)建一個(gè)內(nèi)存設(shè)備環(huán)境dcBmp.CreateCompatibleDC(&dc); //創(chuàng)建兼容性DCCBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); //載入資源中的IDB_BITMAP1圖片BITMAP m_bitmap; //圖片變量 bmpBackground.GetBitmap(&m_bitmap); //將圖片載入位圖中CBitmap *pbmpOld=dcBmp.SelectObject(&bmpBackground); //將位圖選入臨時(shí)內(nèi)存設(shè)備環(huán)境 //調(diào)用函數(shù)顯示圖片 StretchBlt顯示形狀可變dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcBmp,0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,SRCCOPY); /******************************************************//** StretchBlt() **//** 參數(shù)x、y位圖目標(biāo)矩形左上角x、y的坐標(biāo)值 居中 **//** nWidth、nHeigth位圖目標(biāo)矩形的邏輯寬度和高度 **//** pSrcDC表示源設(shè)備CDC指針 **//** xSrc、ySrc表示位圖源矩形的左上角的x、y邏輯坐標(biāo)值 **//** dwRop表示顯示位圖的光柵操作方式 **//** SRCCOPY用于直接將位圖復(fù)制到目標(biāo)環(huán)境中 **//******************************************************/}? ? ? ? ? 此時(shí)運(yùn)行程序即可顯示背景圖片,同時(shí)你拉伸對(duì)話框時(shí)可能會(huì)出現(xiàn)閃動(dòng)Bug。
? ? ? ? 因此你可以設(shè)置Dialog的屬性Border為Dialog Frame(對(duì)話框外框),默認(rèn)的Resizing是可以調(diào)控大小的。
? ? ? ? 注意:如果圖像出現(xiàn)失貞,添加代碼如下: dc.SetStretchBltMode(COLORONCOLOR);// 若不設(shè)置這個(gè)模式,圖片會(huì)嚴(yán)重失真 dc.StrtchBlt....
二. 按鈕BUTTON添加背景圖片
首先在“資源視圖”中給Dialog添加3個(gè)按鈕,分別為IDC_BUTTON1、IDC_BUTTON2和IDC_BUTTON3,如下圖所示: 第二步按照前面的方法添加資源:按鈕背景圖片,即“播放視頻”圖片。添加后在資源視圖中選中圖片資源,點(diǎn)擊屬性可以修改ID值。如下圖所示,把IDB_BITMAP2修改為IDB_StartMovie1。 第三步通過快捷鍵(Ctrl+Shift+X或視圖->類向?qū)?#xff09;打開“類向?qū)А?#xff0c;選擇類名為CRecoverMovieDlg,在成員變量中點(diǎn)擊添加變量,如下圖添加3個(gè)按鈕的成員變量。 ? 此時(shí)你會(huì)發(fā)現(xiàn)在XXXDlg.cpp中函數(shù)DoDataExchange()中會(huì)自動(dòng)增加下面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中找到初始化函數(shù)OnInitDialog(),在“// TODO:在此添加額外的初始化代碼”中添加如下代碼: // TODO: 在此添加額外的初始化代碼//初始化窗口 設(shè)置窗口為500*500大小MoveWindow(0,0,500,500); /*******************************************************************************//* (重點(diǎn)知識(shí):實(shí)現(xiàn)按鈕位置設(shè)置) *//* 1.使用Ctrl+Shift+X打開類資源導(dǎo)向 增加開始\結(jié)束按鈕的成員變量 Button型 *//* 2.使用函數(shù)SetWindowPos()設(shè)置兩個(gè)按鈕的位置 *//*******************************************************************************//*******************************************************************************//* SetWindowPos()函數(shù) *//* 參數(shù):const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags *//* hwnd是窗口的句柄,x、y、cx、cy分別是窗口的x和y坐標(biāo)、寬和高度 *//* hWndInsertAfter用來指定窗口的Z位置,代表深度.這個(gè)參數(shù)接受5種值: *//* HWND_BOTTOM、 HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST或者另一個(gè)窗口的句柄 *//* wFlags用來指定附加的選項(xiàng) *//*******************************************************************************///窗口句柄設(shè)置為NULL SWP_SHOWWINDOW顯示窗口 SWP_NOSIZE保持當(dāng)前大小忽略cx\xy故設(shè)置為0m_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); //設(shè)置按鈕屬性 點(diǎn)擊按鈕背景圖片變換m_buttonstart.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);m_buttonfix.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);m_buttonexit.LoadBitmaps(IDB_StartMovie1,IDB_StartMovie2);return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE ? ? ? ?此時(shí)你運(yùn)行程序會(huì)出現(xiàn)如下錯(cuò)誤:Error class "CButton"沒有成員“LoadBitmaps”。函數(shù)LoadBitmaps()的功能是點(diǎn)擊按鈕實(shí)現(xiàn)兩張背景圖片的替換。 ? ? ? ? 第五步需要在XXXDlg.h頭文件中把public成員變量CButton全部修改為CBitmapButton,如下圖為修改第一個(gè)變量所示: // CRecoveryMovieDlg 對(duì)話框 class CRecoveryMovieDlg : public CDialogEx { // 構(gòu)造 public:CRecoveryMovieDlg(CWnd* pParent = NULL); // 標(biāo)準(zhǔn)構(gòu)造函數(shù)// 對(duì)話框數(shù)據(jù)enum { IDD = IDD_RECOVERYMOVIE_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實(shí)現(xiàn) protected:HICON m_hIcon;// 生成的消息映射函數(shù)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; }; ? ? ? ? 第六步:此時(shí)雖然你能運(yùn)行程序,但是按鈕背景依然沒有,因?yàn)槟氵€需要分別設(shè)置三個(gè)按鈕的屬性“Owner Draw”為True,它指定按鈕為所有者描述的按鈕。? ? ? ? 運(yùn)行結(jié)果如下圖所示: ?
? ? ? ? 最后希望文章對(duì)大家有所幫助,如果文章中有不足之處或錯(cuò)誤的地方,還請(qǐng)海涵!個(gè)人推薦初學(xué)者尤其很多老師布置作業(yè)需要用MFC完成的可以學(xué)習(xí),沒有什么語言流行,它們都是貫通的,都需要一步一個(gè)腳印的去學(xué)習(xí)。
? ? ? ? (By:Eastmount 2015-4-27 深夜3點(diǎn) ??http://blog.csdn.net/eastmount/)
?
總結(jié)
以上是生活随笔為你收集整理的MFC 基础知识:对话框背景添加图片和按钮Button添加图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [python+nltk] 自然语言处理
- 下一篇: Java+MyEclipse+Tomca