按鈕控件函數
1如何在按鈕控件上顯示圖片post
首先肯定你要顯示在按鈕控件的圖片類型是什麼,這裏我是ico圖標,因爲要在按鈕裏顯示ico圖標,因此要把按鈕控件的屬性改一下,ui
方法是右擊按鈕控件,選擇屬性,單擊樣式選項卡,把圖標這一項給勾上。this
而後爲這個按鈕控件關聯一個變量如:m_Quit,類型是」Control」,之後不作說明的話,類型都是」Control」.指針
按鈕控件類(CButton)類裏有個成員函數SetIcon能夠設置按鈕顯示的圖標,該函數只有一個參數,那就是圖標句柄。code
而後在對話框類的初始化函數(CFirstDlg::OnInitDialog)添加以下語句:對象
m_Quit.SetIcon((HICON)::LoadImage(NULL,」e:\i.ico」,IMAGE_ICON,48,48,LR_LOADFROMFILE));//假設E盤下有一個i.ico圖標blog
上面的是從磁盤加載圖標文件,關於LoadImage函數的用法,能夠查看VC 經常使用函數第二十八函數個。圖片
第二種根據圖標ID加載:ip
先從磁盤導入一個圖標到工程裏,假設這個圖標名爲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項是你新建的類名稱,這裏類名取爲CNewButton。Base 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」
接着咱們編譯,運行,效果以下圖:
因爲咱們在上面只處理了按鈕的兩個狀態,按下,和正常狀態,因此當按鈕得到焦點,或處於其它狀態時,則沒有對應的動做。