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); //創建兼容性DCCBitmap 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故設置為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); //設置按鈕屬性 點擊按鈕背景圖片變換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/)
?
總結
以上是生活随笔為你收集整理的MFC 基础知识:对话框背景添加图片和按钮Button添加图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [python+nltk] 自然语言处理
- 下一篇: [java] javax.el.Prop