1. 程式人生 > >MFC自定義按鈕的實現

MFC自定義按鈕的實現

#include "stdafx.h"
#include "PicBtn.h"
#include "DrawingTools.h"
#include "Resource.h"
CPicButton::CPicButton(void)
{
 m_crForeColor[COLOR_NORMAL]  = RGB(0, 0, 0);
 m_crForeColor[COLOR_FOCUSED] = RGB(240, 240, 240);
 m_crForeColor[COLOR_PRESSED] = RGB(255, 255, 255);
 m_nColorType  = 0;  // Brown or Red
 m_bMouseOnButton = FALSE;
 m_bIsPressed  = FALSE;
 m_bIsFocused  = FALSE;
 m_bIsDisabled  = FALSE;
 m_nFontHeight  = 17;
 m_nFontWidth  = 6;
 m_bPointFont  = FALSE;
 m_sFontName   = _T("Arial");
}
CPicButton::~CPicButton(void)
{
 FreeResources();
}
void CPicButton::FreeResources()
{
}
void CPicButton::CancelHover()
{
 if (m_bMouseOnButton)
 {
  m_bMouseOnButton = FALSE;
  Invalidate();
 }
}
            
void CPicButton::PreSubclassWindow()
{
#if defined(_CE_VERSION)
 ModifyStyle(0, BS_OWNERDRAW, SWP_FRAMECHANGED);
#else
 UINT nBS = GetButtonStyle();
                     
 m_nTypeStyle = nBS & BS_TYPEMASK;
 if (m_nTypeStyle == BS_DEFPUSHBUTTON)
 {
  m_nTypeStyle = BS_PUSHBUTTON;
 }
// You should not set the Owner Draw before this call 
 // (don't use the resource editor "Owner Draw" or 
 // ModifyStyle(0, BS_OWNERDRAW) before calling PreSubclassWindow())
 ASSERT(m_nTypeStyle != BS_OWNERDRAW);
//Switch to owner-draw
 ModifyStyle(BS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);
#endif
 CButton::PreSubclassWindow();
}
BOOL CPicButton::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message == WM_LBUTTONDBLCLK)
  pMsg->message = WM_LBUTTONDOWN;
 return CButton::PreTranslateMessage(pMsg);
}
void CPicButton::SetColorType(int nColorIdx)
{
 m_nColorType = nColorIdx;
}
void CPicButton::SetCaptionFont(CString sFontName, int nWidth, int nHeight, BOOL bPointFont)
{
 m_sFontName  = sFontName;
 m_nFontWidth = nWidth;
 m_nFontHeight = nHeight;
 m_bPointFont = bPointFont;
 Invalidate();
}
BEGIN_MESSAGE_MAP(CPicButton, CButton)
 ON_WM_KILLFOCUS()
 ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)  //訊息反射
 ON_WM_ACTIVATE()
#ifndef _CE_VERSION
 ON_WM_MOUSEMOVE()
 ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
#endif
END_MESSAGE_MAP()
#ifndef _CE_VERSION
void CPicButton::OnMouseMove(UINT nFlags, CPoint point)
{
 CWnd   *wndUnderMouse = NULL;
 CWnd   *wndActive = this;
 TRACKMOUSEEVENT csTME;
 CButton::OnMouseMove(nFlags, point);
 ClientToScreen(&point);
 wndUnderMouse = WindowFromPoint(point);//獲得點下面的元件
 // If the mouse enter the button with the left button pressed then do nothing
 if (nFlags & MK_LBUTTON && m_bMouseOnButton == FALSE)
  return;
 if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
 {
  if (!m_bMouseOnButton)
  {
   m_bMouseOnButton = TRUE;
   Invalidate();
   csTME.cbSize = sizeof(csTME);
   csTME.dwFlags = TME_LEAVE;
   csTME.hwndTrack = m_hWnd;
   ::_TrackMouseEvent(&csTME);//傳送滑鼠離開的訊息,見我之前的部落格
  }
 }
 else
  CancelHover();
}
LRESULT CPicButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
 CancelHover();
 return 0;
}
#endif
BOOL CPicButton::OnClicked()
{ 
 SetFocus();//設定焦點
 Invalidate();
 return FALSE;
}
void CPicButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
 CDC   *pDC = CDC::FromHandle(lpDIS->hDC); //獲取CDC
 int   nWidth, nHeight;
 CRect  itemRect = lpDIS->rcItem;
  nWidth = itemRect.Width();
 nHeight = itemRect.Height();
 m_bIsPressed = (lpDIS->itemState & ODS_SELECTED);//是不是已經按下
 m_bIsFocused = (lpDIS->itemState & ODS_FOCUS);   //是不是獲得了焦點
 m_bIsDisabled = (lpDIS->itemState & ODS_DISABLED); //是不是沒使能
 pDC->SetBkMode(TRANSPARENT);//設定背景透明
 DrawBackground(pDC, nWidth, nHeight);//畫背景
 DrawBtnCaption(pDC, nWidth, nHeight); //畫字型
}
void CPicButton::DrawBackground(CDC *dc, int nWidth, int nHeight)
{
 if (m_bIsPressed)
 {
  if (m_nColorType == 0)
   ::DrawBMP(dc,IDB_BTN_YP, 0, 0); //
  else
   ::DrawBMP(dc,IDB_BTN_RP, 0, 0);//畫紅色按下背景
 }
 else
 {
  if (m_nColorType == 0)
   ::DrawBMP(dc,IDB_BTN_Y, 0, 0);
  else
   ::DrawBMP(dc,IDB_BTN_R, 0, 0);//畫紅色背景
 }
}
void CPicButton::DrawBtnCaption(CDC *dc, int nWidth, int nHeight)
{
 CString   str;
 CRect   rect;
 int    nColorIndex;
 CFont   font, *old_font;
 if (m_bIsPressed)
  nColorIndex = COLOR_PRESSED;
 else if (m_bMouseOnButton)
  nColorIndex = COLOR_FOCUSED;
 else
  nColorIndex = COLOR_NORMAL;
 if (m_bPointFont)
  font.CreatePointFont(m_nFontHeight * 10, m_sFontName);
 else
 {
  font.CreateFont(m_nFontHeight, m_nFontWidth, 0, 0, FW_BOLD, 0, 0, 0,
   DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS,
   DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, m_sFontName);
 }
 GetWindowText(str);
 rect = CRect(2, 2, nWidth - 4, nHeight - 4);
 old_font = dc->SelectObject(&font);
 dc->SetTextColor(m_crForeColor[nColorIndex]);
 //顯示字型
 dc->DrawText(str, str.GetLength(), &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
 dc->SelectObject(old_font);
 font.DeleteObject();
}
void CPicButton::SetForeColor(int nIndex, COLORREF crColor, BOOL bRepaint)
{
 m_crForeColor[nIndex] = crColor;
 if (bRepaint) 
  Invalidate();
}
void CPicButton::OnKillFocus(CWnd * pNewWnd)
{
 CButton::OnKillFocus(pNewWnd);
 CancelHover();//當失去焦點的時候,需要改變字型顏色,需要重繪,呼叫Invalidate();
}
void CPicButton::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
 CButton::OnActivate(nState, pWndOther, bMinimized);
 if (nState == WA_INACTIVE)  //當失去焦點的時候,需要改變字型顏色,需要重繪,呼叫Invalidate();
  CancelHover();
}
 自定義按鈕類已經寫好了,那麼怎麼和對話方塊中的按鈕關聯起來呢?方法如下:

相關推薦

MFC定義按鈕實現

#include "stdafx.h" #include "PicBtn.h" #include "DrawingTools.h" #include "Resource.h" CPicButton::CPicButton(void) { m_crForeColor[COLOR_NORMAL] = RGB(

定義按鈕實現 video暫停和播放的方法

注:兩個方法只能用於原生獲取的<video></video>元素,對jquery獲取的元素不管用  1.play(); 實現播放 // dom元素如下 <video width="800" height="400" id="video"

ckeditor添加定義按鈕整合swfupload實現批量上傳圖片

下載 了解 nbsp 文件 mouseover 去掉 dial size pro ckeditor添加自定義按鈕整合swfupload實現批量上傳圖片給ckeditor添加自定義按鈕,由於ckeditor只能上傳一張圖片,如果要上傳多張圖片就要結合ckfinder,而ckf

IOS 定義按鈕(代碼實現)+九宮格

uifont 排列 end uiview height iyu void rec name 在一些下載應用裏整個頁面都是按鈕,有好多好多,但是仔細觀察不難發現他們很有規律。就像下面一樣?? 很有規律的排列在屏幕上,那麽這需要我們怎麽去做能。 正如標題,我們需要了解兩個知

OC 定義tabBar實現tabBar上帶有圓形按鈕

1.建立繼承自UITabBar控制元件的類CustomTabBar,程式碼如下: #import "CustomTabBar.h" @interface CustomTabBar () @property (nonatomic, strong)UIButton *roundButton;

Vue定義元件實現按鈕許可權功能

在這之前請看我上一篇部落格https://blog.csdn.net/qq_41594146/article/details/83381964,這裡有思路和資料庫設定,之前做的是沒有元件化,也就是單純的v-for迴圈直接顯示,剛剛寫了按鈕許可權的元件,現在貼上程式碼\ var myBu

定義UITableView實現定義左滑刪除按鈕及多按鈕,拖拽cell和表頭進行排序

本文介紹了能拖拽cell和表頭進行排序的自定義UITableView,並且能自定義左滑顯示的UIButton樣式。 先看左滑自定義按鈕效果圖  :     override func tableView(_ tableView: UITableView, editA

angular6定義按鈕元件 並實現父子元件見的傳值

在控制檯輸入命令建立一個按鈕元件 ng g component bigbutton,cli會自動建立一個BitbuttonComponent元件,提供了html、ts、css檔案。修改html、ts、css檔案: html內容: <div class='big-bt

MUI、HTML5+、HBuilder實現透明漸變導航欄+定義按鈕(右上角分享按鈕

先上效果圖: js程式碼: mui.plusReady(function() { var ws = plus.webview.currentWebview(); ws.setStyle({ "titleNView":{ backgroundColor:

定義EditText實現清除文字內容按鈕

在使用EditText的時候,發現想要新增一個清除文字的按鈕還是聽麻煩的,於是誕生出想自定一個控制元件來實現這樣的效果。 好了,先來看看實現的效果吧。 通過效果圖,我們可以看到我們的自定義EditText實現了以下的公呢個: * 當有內容輸

MFC定義按鈕響應鍵盤的回車操作

在MFC的專案中,預設情況下,執行時按下回車的時候程式就會退出。 我們希望在按下回車的時候執行我們自定義的按鈕,可以這樣去做。 首先,我們新增訊息處理函式,按住Ctrl+W,如下圖 然後點選“Add Function”之後,就會看到 這個時候我們看到,標頭檔案中, p

Android 定義View實現動態炫酷按鈕

普通按鈕也就那麼幾種樣式,看著都審美疲勞,先放效果圖,演示Demo+原始碼在最後面 你會不會以為這個按鈕是集結了很多動畫的產物,我告訴你,並沒有。所有的實現都是基於自定義View,採用最底層的onDraw一點一點的畫出來的。沒有采用一丁點的動畫。雖然演示時間很短,但是要

Datatables內定義按鈕,並實現對table內資料的讀取和操作。

我們做表格展示的時候會常常遇到需要在每列的後邊新增操作按鈕的情況,比如淘寶購物車裡的訂單刪除按鈕或者詳細按鈕,這樣就需要在載入Datatables的時候同時對每一行生成對應的操作按鈕,並給操作按鈕繫結方法,以實現對table內單元格資料的讀取和操作。 Datatables中

HTML手機端定義dom實現按鈕點選效果

之前寫手機頁面時,感覺自帶button的陰影不好看,去掉之後又沒有了點選時的互動效果,使用者體驗很不好。bootstrap的按鈕顏色風格又太少了,還是自己寫才是王道。後來各種百度查到了如下方法,很簡單實用,特地記錄一下。主要是利用ontouchstart和ontouchend

Qt實現定義按鈕的三態效果

好久之前做的一個小軟體,好長時間沒動過了,在不記錄下有些細節可能都忘了,這裡整理下部分功能的實現。 按鈕的三態,指的是普通態、滑鼠的停留態、點選態,三態是介面互動非常基本的一項功能,Qt中如果使用的是原始的按鈕,三態的效果是有的,滑鼠放上去會變色,點選的時候有凹陷的效果,工具欄中的圖示也具備三態效果,但是如

jsp tag 定義標籤實現按鈕的顯示

前些天在一個專案中做了一個最基本的許可權管理(標準的許可權結構,使用者-角色-選單),後來需要精確地控制到按鈕就想到了使用自定義標籤(jsp tag)來處理按鈕的顯示與隱藏。 下面是我參考網上的資料自己寫的一個自定義標籤的demo: 首先自定義標籤類: package c

Android 音樂播放器的實現(一)定義按鈕實現

Android 系統提供了MediaPlayer控制元件,讓我們能夠利用它實現音訊的播放。 而從學Android開始,在看教程的時候,我就想,我要自己做一個音樂播放器,因為一個完整的音樂播放器是有很多功能的,它涉及到很多方面的知識,可以幫助我們更好地學習和掌握關於Andro

CKEditor 定義按鈕插入服務端圖片

自定義按鈕 asp lap .get extra 版本 icp java conf CKEditor 富文本編輯器很好用,功能很強大,在加上支持服務端圖片上傳的CKFinder更是方便, 最近在使用CKFinder的時候發現存在很多問題,比如上傳圖片的時候,圖片不能按時間

Qt定義按鈕及不同狀態下圖片的切換

q自定義窗體、任意形狀的窗體、qt自定義按鈕 好久沒有使用Qt了,最近在做窗體時做了一個自定義的鈕銨,剛開始是想通過修改其MASK和ICON的 方式來實現。確發現效果總是不太如意,如是幹脆自已定義了一個XPushButton。也將其實現方式記錄發 布出來。以方便日後自已使用和給有相應問題的朋友一個小小的

編寫可復用的定義按鈕

可復用 定義 ongl aid music 編寫 自定義 按鈕 自定義按鈕 %E4%B8%80%E4%B8%AA%E5%B1%85%E5%BA%95%E6%98%BE%E7%A4%BA%E7%9A%84TaBHOsT http://music.baidu.com/songl