vc 按钮自绘

按钮自绘,将按钮区域分成三部分,左边、右边、中间都由贴图绘制,可用于手动进度条按钮,或者左右选择项按钮

cpp代码部分:

 

[cpp] view plaincopy

 

  1. // LRSkinButton.cpp : implementation file  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "CRedrawButtonDemo.h"  
  6. #include "LRSkinButton.h"  
  7.   
  8. #ifdef _DEBUG  
  9. #define new DEBUG_NEW  
  10. #undef THIS_FILE  
  11. static char THIS_FILE[] = __FILE__;  
  12. #endif  
  13.   
  14. /////////////////////////////////////////////////////////////////////////////  
  15. // CLRSkinButton  
  16.   
  17. CLRSkinButton::CLRSkinButton()  
  18. {  
  19.     m_nWidth = 17;  
  20.     m_nHeight = 16;  
  21.     m_bDrawBorder = TRUE;  
  22. }  
  23.   
  24. CLRSkinButton::~CLRSkinButton()  
  25. {  
  26. }  
  27.   
  28.   
  29. BEGIN_MESSAGE_MAP(CLRSkinButton, CButton)  
  30.     //{{AFX_MSG_MAP(CLRSkinButton)  
  31.         // NOTE - the ClassWizard will add and remove mapping macros here.  
  32.     //}}AFX_MSG_MAP  
  33.     ON_WM_CAPTURECHANGED()  
  34.     ON_WM_MOUSEMOVE()  
  35.     ON_WM_SETCURSOR()  
  36.     ON_WM_KILLFOCUS()  
  37. END_MESSAGE_MAP()  
  38.   
  39. void CLRSkinButton::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )  
  40. {  
  41. //  TRACE("DrawItem\n");  
  42.       
  43.     // TODO:  添加您的代码以绘制指定项  
  44.     CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);  
  45.     HDC hDC = pDC->GetSafeHdc();  
  46.     // 按钮客户区域  
  47.     CRect rectItem(lpDrawItemStruct->rcItem);  
  48.     m_nHeight = rectItem.Height();  
  49.     m_nWidth = 26;  
  50.     CRect rectCenter(rectItem.left+m_nWidth, rectItem.top, rectItem.right-m_nWidth, rectItem.bottom);  
  51.     CRect rectLeft(rectItem.left, rectItem.top, rectItem.left+m_nWidth, rectItem.top+m_nHeight);  
  52.     CRect rectRight(rectItem.right-m_nWidth,rectItem.top,rectItem.right,rectItem.bottom);  
  53.     static int nClrWidth = rectCenter.Width()/10;  
  54.     CRect rectColor(rectCenter.left, rectCenter.top, rectCenter.left, rectCenter.bottom);  
  55.     rectCenter.DeflateRect(0,1,0,1);  
  56. //  pDC->SetBkMode(TRANSPARENT);  
  57.       
  58.     HPEN hOldPen;  
  59.     UINT action, state;  
  60.     action = lpDrawItemStruct->itemAction;  
  61.     state  = lpDrawItemStruct->itemState;  
  62.   
  63.     BOOL bIsPressed, bIsFocus, bIsDisabled;  
  64.     bIsPressed = state & ODS_SELECTED;  
  65.     bIsDisabled = state & ODS_DISABLED;  
  66.     bIsFocus = (state & ODS_FOCUS) == ODS_FOCUS; // ::GetFocus() == m_hWnd;  
  67.   
  68.     ::SetBkColor(hDC, RGB(22, 33, 55));  
  69.     // Draw pressed button  
  70.     if (bIsPressed)  
  71.     {// 按钮按下状态  
  72.         /* 
  73.         HPEN penBtnHiLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT));//COLOR_3DLIGHT)); // Bianco 
  74.         HPEN penBtnShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW));   // Grigio scuro 
  75.          
  76.         // draw darkline of left-top conner 
  77.         hOldPen = (HPEN)SelectObject(hDC,penBtnShadow); 
  78.         MoveToEx(hDC,rectItem.left, rectItem.bottom-1,NULL); 
  79.         LineTo(hDC,rectItem.left, rectItem.top); 
  80.         LineTo(hDC,rectItem.right, rectItem.top); 
  81.         // draw hilight line of right-bottom conner 
  82.         SelectObject(hDC,penBtnHiLight); 
  83.         MoveToEx(hDC,rectItem.left, rectItem.bottom-1,NULL); 
  84.         LineTo(hDC,rectItem.right-1, rectItem.bottom-1); 
  85.         LineTo(hDC,rectItem.right-1, rectItem.top-1); 
  86.         //release resource 
  87.         SelectObject(hDC,hOldPen); 
  88.         DeleteObject(penBtnShadow); 
  89.         DeleteObject(penBtnHiLight); 
  90.         */  
  91.   
  92.         // 判断点击的是左区域还是右区域  
  93.         POINT pos;  
  94.         GetCursorPos( &pos );  
  95.         ScreenToClient(&pos);  
  96.         if (PtInRect( &rectLeft, pos))  
  97.         {// 左键  
  98.             TRACE(_T("Clicked Left...\n"));  
  99.             nClrWidth -= 5;  
  100.             if (nClrWidth <=0)  
  101.             {  
  102.                 nClrWidth = 0;  
  103.             }  
  104.         }  
  105.         if (PtInRect( &rectRight, pos))  
  106.         {// 右键  
  107.             TRACE(_T("Clicked Right...\n"));  
  108.             nClrWidth += 5;  
  109.             if (nClrWidth >= rectCenter.Width())  
  110.             {  
  111.                 nClrWidth = rectCenter.Width();  
  112.             }  
  113.         }  
  114.           
  115.     }  
  116.     else // ...else draw non pressed button  
  117.     {  
  118.         if(!m_bIsFlat || (m_bIsFlat && m_MouseOnButton))  
  119.         {// 鼠标移动到按钮上面时的状态  
  120.             /* 
  121.             HPEN pen3DLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT));//COLOR_3DLIGHT));       // Light gray 
  122.             HPEN penBtnShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW));   // Dark gray 
  123.             // White line 
  124.             hOldPen = (HPEN)SelectObject(hDC,pen3DLight); 
  125.             MoveToEx(hDC,rectItem.left, rectItem.bottom-1,NULL); 
  126.             LineTo(hDC,rectItem.left, rectItem.top); 
  127.             LineTo(hDC,rectItem.right, rectItem.top); 
  128.             // Dark gray line 
  129.             SelectObject(hDC,penBtnShadow); 
  130.             MoveToEx(hDC,rectItem.left, rectItem.bottom-1,NULL); 
  131.             LineTo(hDC,rectItem.right-1, rectItem.bottom-1); 
  132.             LineTo(hDC,rectItem.right-1, rectItem.top-1); 
  133.             // 
  134.             SelectObject(hDC,hOldPen); 
  135.             DeleteObject(pen3DLight);  
  136.             DeleteObject(penBtnShadow); 
  137.             */  
  138.         }  
  139.         else{// FLAT 属性  
  140.             if(m_bDrawBorder)  
  141.             { // 失去焦点的时候绘制按钮边框  
  142.                 HPEN penBorder = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT));  
  143.                 hOldPen = (HPEN)SelectObject(hDC,penBorder);  
  144.                 SelectObject(hDC,GetStockObject(NULL_BRUSH));  
  145.                 // 绘制按钮边框  
  146.                 Rectangle(hDC,rectItem.left, rectItem.top, rectItem.right, rectItem.bottom);  
  147.                 SelectObject(hDC, hOldPen);  
  148.                 DeleteObject(penBorder);  
  149.             }  
  150.         }  
  151.     }  
  152.   
  153. //  if (lpDrawItemStruct->itemData != NULL)  
  154. //  {  
  155.         // 画图标  
  156.         CRect rect(rectCenter);  
  157.     //  rect.DeflateRect(0,5,0,0); // 改变矩形范围  
  158.         CDC dcMem;  
  159.         dcMem.CreateCompatibleDC(pDC);  
  160.           
  161.         // 背景图  
  162.         CBitmap bmp;  
  163.         BITMAP bitmap;  
  164.           
  165.         bmp.LoadBitmap(m_nBmpBK);  
  166.         bmp.GetBitmap( &bitmap );  
  167.         CBitmap* pOldBmp = dcMem.SelectObject(&bmp);  
  168.         pDC->StretchBlt(rectCenter.left, rectCenter.top, rectCenter.Width(), rectCenter.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);  
  169.         bmp.DeleteObject();  
  170.   
  171.         // 左按钮图  
  172.         bmp.LoadBitmap( m_nBmpLeft );  
  173.         dcMem.SelectObject( &bmp );  
  174.         bmp.GetBitmap( &bitmap );  
  175.     //  pDC->BitBlt(rectLeft.left,rectLeft.top,rectLeft.Width(),rectLeft.Height(),&dcMem,0,0,SRCCOPY);  
  176.         pDC->StretchBlt(rectLeft.left, rectLeft.top, rectLeft.Width(), rectLeft.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);  
  177.         bmp.DeleteObject();  
  178.   
  179.         // 右按钮图  
  180.         bmp.LoadBitmap( m_nBmpRight );  
  181.         bmp.GetBitmap( &bitmap );  
  182.         dcMem.SelectObject( &bmp );  
  183.     //  pDC->BitBlt(rectRight.left,rectRight.top,rectRight.Width(),rectRight.Height(),&dcMem,0,0,SRCCOPY);  
  184.         pDC->StretchBlt(rectRight.left, rectRight.top, rectRight.Width(), rectRight.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);  
  185.         bmp.DeleteObject();  
  186.         dcMem.SelectObject(pOldBmp);  
  187.   
  188.         // 绘制颜色进度条  
  189.         bmp.LoadBitmap(IDB_BMP_BTNLEFT);  
  190.     //  CBrush brush(&bmp);   //RGB(255, 255, 0)  
  191.         CBrush brush(RGB(255, 255, 0));   //  
  192.         rectColor.right = rectColor.left+nClrWidth;  
  193.         pDC->FillRect(rectColor, &brush);  
  194. //      CBrush *pOldBrush = (CBrush*)pDC->SelectObject(&brush);  
  195. //      pDC->Rectangle(&rectColor);  
  196. //      pDC->SelectObject(pOldBrush);  
  197.         bmp.DeleteObject();  
  198.   
  199.         // 绘制文字  
  200.         rect = rectCenter;  
  201.         //  rect.DeflateRect(0,5,0,0);  // 调整矩形大小  
  202.         rect.InflateRect(0,1,0,1);  
  203.         pDC->SetTextColor(RGB(0,0,0));  
  204. //      rect.OffsetRect(2,1); // 平行移动矩形位置  
  205.           
  206.         //  char zsCaption[64] = {0};  
  207.         CString str;  
  208.         GetWindowText( str );  
  209.         COLORREF clr = GetSysColor( COLOR_3DHILIGHT);  
  210.         clr = RGB(55, 155, 55);  
  211.         if (bIsPressed)  
  212.         {  
  213.             clr = RGB(155, 55, 55);  
  214.         }  
  215.         else if (bIsFocus /*|| m_MouseOnButton*/)  
  216.         {  
  217.             clr = RGB(55, 55, 155);  
  218.   
  219.             HPEN penBorder = CreatePen(PS_SOLID, 1, RGB(255,0,255));  
  220.             hOldPen = (HPEN)SelectObject(hDC,penBorder);  
  221.             SelectObject(hDC,GetStockObject(NULL_BRUSH));  
  222.             // 绘制按钮边框  
  223.             Rectangle(hDC,rect.left, rect.top, rect.right, rect.bottom);  
  224.             SelectObject(hDC, hOldPen);  
  225.             DeleteObject(penBorder);  
  226.         }  
  227.         pDC->SetBkColor(clr);  
  228.         pDC->SetTextColor( RGB(255, 0, 0) );  
  229.         pDC->DrawText(str, str.GetLength(),rect, DT_CENTER | DT_VCENTER| DT_SINGLELINE);  
  230.   
  231. //  }  
  232.           
  233.   
  234. }  
  235.   
  236. void CLRSkinButton::SetBtnBmps( UINT uBmpBK, UINT uBmpLeft, UINT uBmpRight )  
  237. {  
  238.     m_nBmpBK = uBmpBK;  
  239.     m_nBmpLeft = uBmpLeft;  
  240.     m_nBmpRight = uBmpRight;  
  241. }  
  242.   
  243. void CLRSkinButton::PreSubclassWindow()  
  244. {  
  245.     UINT nBS = GetButtonStyle();  
  246.     if(nBS & BS_DEFPUSHBUTTON)  
  247.         m_bDefaultBtn = TRUE;  
  248.     else  
  249.         m_bDefaultBtn = FALSE;  
  250.     SetButtonStyle(nBS | BS_OWNERDRAW);   
  251.       
  252.     CButton::PreSubclassWindow();     
  253. }  
  254. /////////////////////////////////////////////////////////////////////////////  
  255. // CLRSkinButton message handlers  
  256. void CLRSkinButton::OnCaptureChanged(CWnd *pWnd)   
  257. {  
  258.     if(m_MouseOnButton == TRUE)  
  259.     {  
  260.         ReleaseCapture();  
  261.         Invalidate();  
  262.     }  
  263.       
  264.     CButton::OnCaptureChanged(pWnd);  
  265. }  
  266.   
  267. void CLRSkinButton::OnMouseMove(UINT nFlags, CPoint point)   
  268. {  
  269.     CButton::OnMouseMove(nFlags, point);  
  270.       
  271.     HWND hParent; // Finestra che contiene il bottone  
  272.       
  273.     // If the mouse enter the button with the left button pressed then do nothing  
  274.     if (nFlags & MK_LBUTTON && !m_MouseOnButton)   
  275.         return;  
  276.       
  277.     // If our button is not flat then do nothing  
  278.     if (m_bIsFlat)   
  279.     {  
  280.         hParent = ::GetParent(m_hWnd);  
  281.         if ((::GetCapture() != m_hWnd) &&   (hParent != NULL))   
  282.         {  
  283.             m_MouseOnButton = TRUE;  
  284.             SetCapture();  
  285.             Invalidate();  
  286.         }  
  287.         else  
  288.         {  
  289.             RECT rc;  
  290.             GetClientRect(&rc);  
  291.             if (!PtInRect(&rc,point))  
  292.             {  
  293.                 // Redraw only if mouse goes out  
  294.                 if (m_MouseOnButton == TRUE)  
  295.                 {  
  296.                     m_MouseOnButton = FALSE;  
  297.                     Invalidate();  
  298.                 }  
  299.                 // If user is NOT pressing left button then release capture!  
  300.                 if (!(nFlags & MK_LBUTTON))   
  301.                     ReleaseCapture();  
  302.             }  
  303.         }  
  304.     }  
  305. }  
  306.   
  307. BOOL CLRSkinButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)   
  308. {  
  309.     if (m_hBtnCursor != NULL)  
  310.     {  
  311.         ::SetCursor(m_hBtnCursor);  
  312.         return TRUE;  
  313.     }  
  314.       
  315.     return CButton::OnSetCursor(pWnd, nHitTest, message);  
  316. }  
  317.   
  318. void CLRSkinButton::OnKillFocus(CWnd* pNewWnd)   
  319. {  
  320.     CButton::OnKillFocus(pNewWnd);  
  321.       
  322.     if(!m_bIsFlat)   
  323.     {  
  324.         m_MouseOnButton = FALSE;  
  325.         Invalidate();  
  326.     }  
  327. }  

时间: 2024-10-02 14:09:06

vc 按钮自绘的相关文章

graphics-急求怎么实现单击按钮重绘面板啊

问题描述 急求怎么实现单击按钮重绘面板啊 就是我写了一个jframe类 里面定义了a1,a2,a3等几个面板,然后我又写了一个JPanel类,jpanel类写了一个paint()方法,主要是实现画一条曲线的功能,然后我在jframe类里面定义a1=new jpanel():然后运行jframe 的时候a1面板就自动加载了一天曲线,我现在想实现的是 在jframe里面加上一个按钮,单击按钮,给jpanel传参--也就是传入两个数组分别作为x.y轴的数据 然后重绘,同时单击按钮后,要面板的曲线重绘成

VC++ WIN32 sdk实现按钮自绘详解 之二.

网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说. 实例图片:    首先建立一个标准的Win32 Application 工程.选择a simple Win32 Application. 然后建立我们的资源文件首先新建一个对话框资源,资源ID改为IDD_MAIN_DLG 然后在其上新建一个按钮控件资源ID改为IDC_ODBUTTON,此按钮的styles中必须选中owenerdraw属性. 然后将其保存为.rc的资源文件.并将其导入我们的工程.同理新

VC实现自绘图形输出到bmp文件

在用vc做程序时候,经常需要把输出的文本和图形保存到位图文件,当然可以 有现成的控件来实现,但总不能如自己所愿,还是自己动手写吧!如下图: 一.实现方法 要把文本和图形保存到位图文件,只要对掌握位图结构有一定的了解,一切都 ok呢.先必须要创建内存设备环境,然后内存设备环境创建的DIB区域,别忘了还 要创建个CBitmap对象,CBitmap对象必须和DIB区域关联起来,把CBitmap对象选 择到当前设备环境,然后在当前设备环境输出文本和图形就可以了.

VC++中HTControl的CHTButton按钮控件类用法实例解析_C 语言

本文以实例形式讲解了VC++中HTControl控件类的CHTButton按钮控件类用法,相信对大家更好的理解VC++有一定的帮助.具体内容如下: 一般了解VC++的朋友都知道,VC++ 按钮控件CHTButton隶属HTControl控件组,直接由WIN32 API实现,你可以在SDK,MFC,wxWidget等环境下使用它.支持生成各种类型的按钮,比如:普通按钮,PNG透明按钮,复选框按钮,单选按钮等.使用时请注意,窗体必须动态创建,代码段如下: m_HTBtnClose.Create(75

设计XP风格的按钮

论坛上许多人都在讨论如何编写具有XP风格的界面,其实网上有设计好的类库,可以直接拿来使用.但这些终归是别人写的,能不能转化成自已的呢.于是笔者就对这些代码进行研究,算是偷一点吧:) 研究了几种控件,这里就把其中最简单的按钮控件拿来供大家一起讨论. 这是程序的运行效果: 步骤: 1.创建一个派生自CButton的新类CButtonXp 2.重载PreSubClassWindow()函数,在该函数内修改按钮的风格为自绘制(owner): 添加如下代码:ModifyStyle(0,BS_OWNERDR

标准控件的使用技巧与自绘控件

在您决定开发 Windows 提供的常规免费自定义控件范围之外的控件之后,您必需确定自己的控件将有多少独到之处 - 在功能和外观两方面.例如,我们假定您正在创建一个类似于计速表的控件.由于公共控件库 (ComCtrl32.dll) 中没有类似的控件,您完全需要自己进行以下操作:编写所有控件功能需要的代码,进行绘制,默认终端用户的交互,以及控件与其父窗口之间需要的任意消息处理. (#add 两方面,公共控件库中没有类似的 完全重写;  只想调整公共控件功能,则可以部分修改) 另一方面,还包括一些您

自绘控件的子类化方法

  1.       新建一个基于对话框的MFC程序. 2.       在工程中添加一个新类CMyButton,基类选择CButton. 3.       然后转至新生成的MyButton.h头文件中,将鼠标放在类名CMyButton上点击一下,打开"属性"窗口,在"消息"按钮下为此类添加 WM_LBUTTONDOWN,WM_LBUTTONUP消息,并重写DrawItem虚函数(这个函数是重绘按钮时要调用的,在这里面可以自定义一些绘制按钮的操作,必须设置控件属性为

《CATIA V5 从入门到精通(第二版)》——2.5 草绘可视化设置(Visualization)

2.5 草绘可视化设置(Visualization) CATIA V5 从入门到精通(第二版) Tools工具条为我们提供了显示草绘面和分析草绘等功能,其中各项含义如下. (1) Cut part by sketch plane:提供了将3D实体用草绘面切开的功能(只是显示上的,并非真正意义上的切分),这非常有助于对较复杂的3D实体进行草绘,可使操作者更容易观察到草绘面情况,使用非常简单,如图2-84所示. https://yqfile.alicdn.com/00eed35fcb3455b148

深入C++ Builder之编写自己的元件-深入分析VCL继承、消息机制(3)

题外话 很多朋友看了我的前两篇文章后,纷纷来信说能不能介绍一些元件入门的基础知识,因为他们根本找不到相关资料,并询问我是如何知道这些知识的.诚然,网上确实没有这方面的介绍资料,更何况大家是学BCB的,对于Delphi的源代码学习起来更是困难,对于作者来说也不比大家知道多少,我认为最好的方式就是看VCL源代码和去Borland的新闻组提问,至少我是这样解决问题的,希望你也可以. 这里是Borland新闻组地址,如果你英文够好,他们基本是有问必答的: forums.borland.com 对于那些想