使用GDI+建立支援更多圖片格式的按鈕
阿新 • • 發佈:2019-01-23
派生一個 CButtonEx類
過載 OnCreate 利用GDI+貼圖到 按鈕上
- int CButtonEx::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CButton::OnCreate(lpCreateStruct) == -1)
- return -1;
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- usingnamespace Gdiplus;//應用 GDI+前必須的設定
- Graphics graph(GetDC()->m_hDC);
- Image image(L
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- return 0;
- }
為了好一點的效果處理 MouseMove 和MouseLeave
- void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
- {
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- usingnamespace Gdiplus;//應用 GDI+前必須的設定
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\圖片相關\\我的作品\\GDI+BUTTON2.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- TRACKMOUSEEVENT event ;
- event.cbSize = sizeof( event );
- event.dwFlags = TME_LEAVE ;
- event.dwHoverTime = 0 ;
- event.hwndTrack = GetSafeHwnd() ;
- VERIFY (_TrackMouseEvent( &event )) ;
- CButton::OnMouseMove(nFlags, point);
- }
- int CButtonEx::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CButton::OnCreate(lpCreateStruct) == -1)
- return -1;
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- usingnamespace Gdiplus;//應用 GDI+前必須的設定
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\圖片相關\\我的作品\\GDI+BUTTON.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- return 0;
- }
- LRESULT CButtonEx::OnMouseLeave( WPARAM wParam , LPARAM lParam )
- {
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- usingnamespace Gdiplus;//應用 GDI+前必須的設定
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\圖片相關\\我的作品\\GDI+BUTTON.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- return 1;
- }
其中MouseLeave函式要手動新增訊息響應
- afx_msg LRESULT OnMouseLeave( WPARAM wParam , LPARAM lParam ) ;
- ON_MESSAGE( WM_MOUSELEAVE , OnMouseLeave )
如果是用VC直接新增的按鈕要設定為 所有者繪製 樣式
動態建立要加上 BS_OWNERDRAW 型別
過載DrawItem函式
- void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
- {
- // TODO: Add your code to draw the specified item
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- usingnamespace Gdiplus;//應用 GDI+前必須的設定
- Graphics graph(GetDC()->m_hDC);
- USES_CONVERSION; // 很複雜的定義 標頭檔案添加了#include "atlbase.h"
- wchar_t* TempBoardPath=A2W(m_ResoucePath);//CString 轉 wchar_t
- if(m_ResoucePath.IsEmpty())
- {
- Image image(L"E:\\圖片相關\\我的作品\\GDI+BUTTON 水晶1.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- }
- else
- {
- Image image(TempBoardPath);
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- }
- }
再新增一個函式用來接收外部傳來的資源
- void CButtonEx::SetResoucePath(CString path)
- {
- m_ResoucePath=path;
- }
在Dlg類初始化部分
用
- m_btnex.SetResoucePath("E:\\圖片相關\\我的作品\\Recycle_bin_blue2.ico");
- m_btnex2.SetResoucePath("E:\\圖片相關\\我的作品\\Recycle_bin_full.ico");
- m_btnex.Create(" ",BS_OWNERDRAW|WS_VISIBLE | WS_CHILD, CRect(0,0,50,50),this,11111);
- m_btnex2.Create(" ",BS_OWNERDRAW|WS_VISIBLE | WS_CHILD, CRect(0,50,50,100),this,11112);
OK 快點Create一個試試看~~
左上角那個是在初始化中動態建立的
中間的是用VC新增的控制元件
效果圖1
滑鼠懸停後 也就是切換一張圖片顯示