1. 程式人生 > >MFC 為按鈕載入點陣圖 CBitmapButton

MFC 為按鈕載入點陣圖 CBitmapButton

系統環境:Windows 7
軟體環境:Visual C++ 2008 SP1
本次目的:使用點陣圖按鈕,並且設定按鈕的滑鼠懸停效果

      在用MFC開發時,介面是比較不好開發的一塊。VC中自帶了CBitmapButton類,但是用途不多,網上很多Button類的派生類蠻實用的,但是若是簡單的點陣圖按鈕用自帶的CBitmapButton就可以實現了,以下是效果圖:

步驟一:新建基於對話方塊工程,放置一個按鈕,可以適當調整大小,設定其Owner Draw屬性為TRUE,右鍵為按鈕新增變數,改變其變數型別為CBitmapButton,按確定完成;

步驟二:匯入按鈕點陣圖,這裡四幅圖大小要一致,以下是四種狀體的按鈕,若讀者要實驗這次的設計的話,可以右鍵另存為,然後用“畫圖”把png格式的另存為bmp格式的。在資源檢視,右鍵“新增資源”,“匯入”以下圖片:

步驟三:初始化工作,在對話方塊的OnInitDialog()函式裡面新增以下程式碼:

  1. m_btButton.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);   //載入
  2. m_btButton.SizeToContent();  //使按鈕適應圖片大小

步驟四:為控制點陣圖按鈕的可用、不可用新增程式碼,這是為了驗證第四種狀態的按鈕:

  1. void CTestDlg::OnBnClickedButton2()  
  2. {     
  3.     m_btButton.EnableWindow(0);  
  4. }  
  5. void
     CTestDlg::OnBnClickedButton3()  
  6. {     
  7.     m_btButton.EnableWindow();  
  8. }  

步驟五:到這裡已經完成了點陣圖按鈕的實現,編譯執行可以看到結果。但是滑鼠滑過的時候,按鈕並不會感應到焦點的存在。這裡用定時器捕獲焦點在按鈕上,並且改變此時的按鈕狀體為第三種圖片。首先為窗體新增OnTimer()事件,在OnTimer()函式裡面填寫如下程式碼:

  1. void CTestDlg::OnTimer(UINT_PTR nIDEvent)  
  2. {  
  3.     // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
  4.     if
     (1==nIDEvent)  
  5.      {  
  6.       POINT p;  
  7.       GetCursorPos(&p);     
  8.       CWnd *hwnd;  
  9.       hwnd=WindowFromPoint(p);        //檢索視窗中包含指定的點;點必須指定螢幕座標在螢幕上的一個點。   
  10.       CWnd *hwnd2=GetDlgItem(IDC_BUTTON1);  
  11.       if (hwnd2 == hwnd)         //如果滑鼠在按鈕上
  12.       {  
  13.        if (GetFocus()!=hwnd2)        //如果按鈕無焦點,那麼設定焦點
  14.         hwnd2->SetFocus() ;  
  15.       }  
  16.       else//如果滑鼠不在按鈕上;
  17.       {  
  18.        if (GetFocus() == hwnd2 )                  //如果按鈕有焦點,那麼去焦點;
  19.         GetDlgItem(IDC_BUTTON2)->SetFocus();      //這裡的IDC_BUTTON2為你想跳轉到的控制元件ID號
  20.       }     
  21.      }  
  22.     CDialog::OnTimer(nIDEvent);  
  23. }  

最後在對話方塊的OnInitDialog()函式裡面新增開啟定時器,時間間隔200ms足夠了。

  1. SetTimer(1,200,NULL);  

完成後,執行就可實現與文章開頭所示的圖片一樣的效果

利用CBitmapButton類實現點陣圖按鈕的兩種方法:
方法一:
 1、在資源編輯的時候選中按鈕的 Owner draw 屬性,不需要選擇 Bitmap 屬性.
       按鈕右鍵-->Styles-->Owner draw

 2、在程式中定義一個CBitmapButton成員變數。
        注意:不能使用ClassWizard為按鈕對映一個CButton變數,然後改為CBitmapButton,
        這麼做並不能將按鈕直接對映為CBitmapButton類的物件,反而會出現初始化錯誤

3、使用CBitmapButton::LoadBitmaps裝載各種狀態的圖片,
     使用CBitmapButton::SubclassDlgItem關聯到想要的按鈕,
     使用CBitmapButton::SizeToContent函式使按鈕適合圖片大小。
     注意Loadbitmaps一定要在關聯到按鈕之前進行!

      附:新增資源Bitmap的方法:Insert選單-->Resource -->Resource type:Bitmap-->Import, 
                之後選擇所需的圖片就可以了

 方法一的例子:
首先,選中按鈕的owner Draw屬性,在資源中載入兩副*.bmp格式的點陣圖,
  然後在對話方塊類中加入:

 1CBitmapButton m_btnX1;
 2//定義變數,必須放在函式外面才能正常實現 3 4BOOL CXXXXXXX::OnInitDialog()
 5{
 6CDialog::OnInitDialog();
 7
 8m_btnX1.LoadBitmaps(IDB_XXXX_UP,IDB_XXXX_DOWN);
 9//這裡是兩副點陣圖,滑鼠按下和彈起,
10//  也可以只加一個ID資源;11m_btnX1.SubclassDlgItem(IDC_DASEN_X1,this);
12m_btnX1.SizeToContent();
13}
14
15文章引用自:http://blog.sina.com.cn/s/blog_44e571d70100080o.html 
16
方法二:使用CBitmapButton::AutoLoad函式關聯到想要的按鈕
需要注意:
A、使用CBitmapButton::AutoLoad函式之前不能使用CBitmapButton::LoadBitmaps裝載
  各種狀態的圖片,否則會出錯。
B、AutoLoad函式完成關聯和改變按鈕大小的功能。類似於上面CBitmapButton::SubclassDlgItem
   和CBitmapButton::SizeToContent函式的功能。
C、CBitmapButton::AutoLoad使用的點陣圖是預設資源ID的,即它會自動裝載相關資源點陣圖。
  點陣圖的資源ID格式為:
  "按鈕Caption+U"、"按鈕Caption+D"、"按鈕Caption+F"、"按鈕Caption+X",
  分別代表Up、Down、Focus、Disable狀態。
  如資源編輯時,希望關聯的按鈕的Caption為Test,
  那麼其預設裝載的點陣圖資源的ID為:"TestU"/"TestD"/"TestF"/"TestX",
  注意分號""也是其ID的一部分。
方法二例子:
首先,選中Caption為:"myBitmapButton"按鈕的owner Draw屬性
其次,新增兩個點陣圖資源,並修改其ID分別為:"myBitmapButtonU"和"myBitmapButtonD",這裡只新增兩個點陣圖
然後在對話方塊類中加入:
1 CBitmapButton m_btnX1;//必須放在函式外面才能正常實現2 BOOL CXXXXXXX::OnInitDialog()
3 {
4 CDialog::OnInitDialog();
5 6 m_btnX1.AutoLoad(IDC_BUTTON1,this);//ID為IDC_BUTTON1的按鈕的Caption為:myBitmapButton7 }

至此兩種方法就都結束了。


相關推薦

MFC 按鈕載入點陣 CBitmapButton

系統環境:Windows 7 軟體環境:Visual C++ 2008 SP1 本次目的:使用點陣圖按鈕,並且設定按鈕的滑鼠懸停效果       在用MFC開發時,介面是比較不好開發的一塊。VC中自帶了CBitmapButton類,但是用途不多,網上很多Button類的

按鈕載入點陣的幾個方法 vc

一,只加載一張點陣圖的方法: 1, 裝入bmp資源,id為IDB_BMP,按鈕的bitmap屬性設為true,icon屬性為false。  2, CButton *pBtn = (CButton *)GetDlgItem(IDB_BMP); CBitmap bitMap; H

MFC內建的點陣按鈕CBitmapButton

使用VC++6中的CBitmapButton類,可以做出效果非常好的圖形按鈕來。 使用方法也非常簡單: 1.在對話方塊上拖放一個普通的按鈕控制元件; 2.宣告一個CBitmapButton類的例項;不要使用ClassWizard對映;   //也就是在類嚮導不能新增變數 3.呼叫CBitmapButton

MFC中當儲存點陣時,圖片全黑的解決辦法

        需要建立相容點陣圖,建立相容DC,然後需要將點陣圖選入DC中,再將螢幕DC的影象拷貝到建立的相容記憶體DC中。 ······ CRect rect1; GetClientRect(&rect1);

windows程式設計 載入點陣圖片

            現在網上隨便下個jpg圖片,用windows自帶的畫圖工具開啟,點選畫圖工具左上角,檔案->另存為->選擇bmp,點選儲存,儲存好後,就得到一張點陣圖了。 得到的點陣圖,點陣圖的記憶體比原圖片jp

6.VC(ui)-MFC下實現透明點陣

 我們在進行程式的介面設計時,常常希望將點陣圖的前景顯示在介面上,而將點陣圖的背景隱藏起來,將點陣圖與介面很自然的融合在一起,本文介紹了透明點陣圖的製作知識,並將透明點陣圖在一個對話方塊中顯示了出來。 直接上圖:原圖:Demo效果圖: 步驟如下:   1、設定待顯示點陣圖的

WPF 設定按鈕Button的背景(Content或Background下的兩種方法設定Button的向量背景,按鈕新增向量背景)

用Blend畫好的向量圖: 新增到Button中去。 方法一:(Backgroud,缺點是有條紋) <Button Canvas.Top="48" Canvas.Left="62" Width="527" Height="691" Border

mfc編輯框輸入垂直居中&字型調整&不採用password屬性進行密碼輸入&vs2013中載入bitmap點陣

第一部分:mfc編輯框輸入垂直居中 處理前:編輯框游標靠上,不太美觀 處理後:游標垂直居中 操作: 1)將編輯框屬性中的Align Text 選擇為Center 2)將編輯框屬性中的Multil

VC 點陣按鈕CBitmapButton的使用

系統環境:Windows 7 軟體環境:Visual C++ 2008 SP1 本次目的:使用點陣圖按鈕,並且設定按鈕的滑鼠懸停效果       在用MFC開發時,介面是比較不好開發的一塊。VC中自帶了CBitmapButton類,但是用途不多,網上很多Button類的

MFC的對話方塊中建立點陣按鈕

1.可新建一個類ImageButton(繼承自CButton),並設定其風格為自繪: ModifyStyle(0,BS_OWNERDRAW);ImageButton.h:class ImageButton : public CButton{private: public: I

MFC點陣按鈕

2. 在對話方塊.h檔案內定義點陣圖按鈕物件 CBitmapButton mybutton; 3. 在對話方塊.c檔案內建立 BOOL Dialog::OnInitDialog() {} 如果已有就不必建立; 4.一種方法: mybutton.L

MFC點陣按鈕

語言: VC++, IDE: VS2017 1.拖拽一個按鈕,預設ID“IDC_BUTTON1”,將其屬性中的Bitmap修改為“True”,假設點陣圖資源的ID為“IDB_BT_BITMAP”, 2.在程式碼中載入點陣圖,並設定為按鈕點陣圖(通常作為初始化,可

VS的mfc中將點陣覆蓋到button按鈕

1.在資源編輯器中新增一個button按鈕,把它的Bitmap屬性設為true; 2.在按鈕上點右鍵,新增變數,變數名為m_Btn(CButton型別的) 3.將圖片匯入到資源管理器中(資源檢視下右擊xx.rc,新增資源),ID為IDB_BITMAP1(其他也行,不過在程式

WPF繪圖的工程應用:按鈕或自定義按鈕新增向量作為背景,該向量來自Blend或Design設計的Path資料。

例1 :Button+Drawing繫結+GeometryDrawing 功能描述:為Button新增簡單的向量圖作為背景。 <Window x:Class="Drawing.Drawings" xmlns="http://schemas.microsoft

1.2多變數資料繪製散點陣

1 # 繪出6個圖形,包括了以下幾個列:花萼長度、花萼寬度、花瓣長度和花瓣寬度 2 plt.close('all') # 關掉其他的影象 3 plt.figure(1) 4 5 # 繪製一個3行2列的圖 6 subplot_start = 321 7 col_numbers = r

MFC擷取對話方塊指定位置的點陣

    //儲存點陣圖     CDC *pDC =  getDC();     CDC memDC;                    // 建立並繫結繪畫DC和Bitmap     CBitmap bitmap;     memDC.CreateCompatible

onCreateView中載入點陣

我的一個Fragment中,載入了一個1024*1024的圖片,非常卡。解決辦法 1. 將圖片改為512*512 2. 非同步載入。 final SmartImageView mizige = (SmartImageView)view.findViewById(R.id.mizige);

Inkscape將點陣轉換向量

Inkscape是一款相當強大的向量圖工具,目前最新的版本是0.92 for Linux(windows版本需要的自己去下載). 本文將展示點陣圖轉換為向量圖的過程。 第一步:開啟inkscape。 第二步:ctrl+o開啟一個位圖文件。

VS2010 用CxImage讀入各種圖片格式後在記憶體中轉換HBITMAP點陣

最近自學遊戲引擎設計,希望將各種圖片格式讀入記憶體後轉為HBITMAP處理,四處搜尋無果,最終參考以下兩篇博文自己搞定之 http://blog.csdn.net/wu_xiangwei/article/details/5096529 http://www.cnblogs.

如何將點陣物件儲存BMP檔案

  GDI中點陣圖物件是很常見的GDI物件,但是無論是SDK,還是MFC都沒有提供現在的函式或是方法來將一個位圖物件儲存為一個BMP檔案,這裡介紹一下儲存方法。 點陣圖檔案格式: DIB檔案有四個主要部分: 檔案表頭(BITMAPFILEHEADER) 資訊表頭  (BITM