VC/MFC按鈕(CButton)控件

1如何在按鈕控件上顯示圖片

 首先確定你要顯示在按鈕控件的圖片類型是什麼,這裏我是ico圖標,由於要在按鈕裏顯示ico圖標,所以要把按鈕控件的屬性改一下,

方法是右擊按鈕控件,選擇屬性,單擊樣式選項卡,把圖標這一項給勾上。

然後爲這個按鈕控件關聯一個變量如:m_Quit,類型是"Control",以後不做說明的話,類型都是"Control".

按鈕控件類(CButton)類裏有個成員函數SetIcon可以設置按鈕顯示的圖標,該函數只有一個參數,那就是圖標句柄。

然後在對話框類的初始化函數(CFirstDlg::OnInitDialog)添加如下語句:

m_Quit.SetIcon((HICON)::LoadImage(NULL,"e:\\i.ico",IMAGE_ICON,48,48,LR_LOADFROMFILE));//假設E盤下有一個i.ico圖標

上面的是從磁盤加載圖標文件,關於LoadImage函數的用法,可以查看VC 常用函數第二十八函數個。

第二種根據圖標ID加載

先從磁盤導入一個圖標到工程裏,假設這個圖標名爲IDI_ICON1,不會導入?

首先進入ResourceView裏,然後右擊Icon選擇插入,之後選擇你要的圖標

之後添加這個語句:

m_Quit.SetIcon(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)));

記住語句添加的位置是在OnInitDialog函數所有代碼之後,return TRUE;之前

2.實現鼠標停留在按鈕上時顯示提示信息

前面說過如果不知道按按鈕控件在控件面板裏是哪個的話,把鼠標停留在控件面板的按鈕上,就會有一個提示.那麼這個功能是如何實現的呢?實現的方法其實也很簡單。
 
首先在對話框類(CFirstDlg)裏添加一個m_ToolTip類對象(public:公有),如:CToolTipCtrl m_ToolTip;然後在對話框類裏的OnInitDialog函數添加以下語句:

m_ToolTip.Create(this);
m_ToolTip.AddTool(&m_Quit,"文本信息");
其中m_Quit爲按鈕控件關聯的變量
接着往對話框類添加一個虛函數,步驟是右擊對話框類,選擇Add Virtual Function。然後雙擊左邊列表框裏PreTranslateMessage,把它添加到右邊的列表框,然後雙擊右邊列表框裏的PreTranslateMessage,這樣我們就添加了虛函數,這個虛函數有一個參數MSG *pMsg;MSG這個結構在API常用函數裏有解釋。這裏只是說一下這個函數意思,這個函數會截獲所有發送到對應窗口的消息。
在這個函數添加這個語句:m_ToolTip.RelayEvent(pMsg);
完整的就是:
BOOL CFirstDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 m_ToolTip.RelayEvent(pMsg);
 return CDialog::PreTranslateMessage(pMsg);
}
接着編譯,運行,鼠標停留在對應的按鈕上,看一下,是不是出現了提示信息?

3按鈕控件自繪

自繪按鈕控件的原理很簡單,獲取控件窗口的設備上下文(DC),然後調用相應的API畫圖函數進行控件自繪,所有能針對DC操作的API函數都能應用到控件裏來,如Rectangle(畫一個矩形),BitBlt(顯示圖片)函數等。

首先我們向工程導入兩張位圖,一張爲按鈕按下時顯示的圖片(ID號:IDB_SELECT),另一張爲正常顯示的圖片(IDB_NORMAL)

兩張位圖:


我們知道按鈕控件對應的類爲CButton,所以我們得從這個類派生出一個類。
 
派生CButton類的方法是進入ClassView選項卡,右擊First Classes,選擇New Class...,接着彈出了一個新建類對話框,Name項是你新建的類名稱,這裏類名取爲CNewButtonBase class(基類)選CButton,點確定。此時First Classes下就多出了一個CNewButton類,是我們從按鈕類(CButton)派生出的類。
接着給CNewButton添加虛函數DrawItem,添加虛函數方法在添加PreTranslateMessage虛函數的時候已經說明過了。
這個函數的定義如下:

void CNewButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
lpDrawItemStruct是一個DRAWITEMSTRUCT結構指針,這個結構在"網上收藏(轉載)"裏有介紹。

DrawItem函裏的代碼如下:

// TODO: Add your code to draw the specified item
 CDC dc;
 dc.Attach(lpDrawItemStruct->hDC);//CDC類裏的ATTACH函數用於把HDC轉換成CDC
 UINT state=lpDrawItemStruct->itemState;
 CRect ButtonRect;
 GetClientRect(&ButtonRect);//調用按鈕類裏的GetWindowRect函數獲取按鈕區域大小
 CDC memDC;
 memDC.CreateCompatibleDC(&dc);//創建兼容DC
 CBitmap bmp;
    if(state&ODS_SELECTED)//如果按鈕按下
 {
  bmp.LoadBitmap(IDB_SELECT);//裝載按下圖片
 }
 else 
 {
  bmp.LoadBitmap(IDB_NORMAL);
 }
 BITMAP bmpInfo;
 bmp.GetBitmap(&bmpInfo);//獲取位圖信息
 memDC.SelectObject(&bmp);//選入圖片
 dc.StretchBlt(0,0,ButtonRect.right,ButtonRect.bottom,&memDC,
                 0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);//顯示圖片
 CString str;
 GetWindowText(str);//獲取按鈕文本
 dc.SetBkMode(TRANSPARENT);//設置文字背景透明
 dc.DrawText(str,&ButtonRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//輸出按鈕文本

 memDC.DeleteDC();
 bmp.DeleteObject();

 dc.Detach();

接着我們往對話框添加一個按鈕,併爲關聯變量,在Add Member Variable對話框裏,Variable type欄裏選擇類型爲CNewButton.並把按鈕控件的樣式設置爲"所有者繪製"

然後在對話框類裏包含NewButton.h(派生下來的按鈕類頭文件):#include"NewButton.h"

接着我們編譯,運行,效果如下圖:


由於我們在上面只處理了按鈕的兩個狀態,按下,和正常狀態,所以當按鈕獲得焦點,或處於其它狀態時,則沒有對應的動作。

發佈了41 篇原創文章 · 獲贊 5 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章