zoukankan      html  css  js  c++  java
  • 自绘按钮类

    RoundButton.h

    #pragma once
    #include "afxwin.h"
    
    class CRoundButton :
        public CButton
    {
    public:
        CRoundButton(void);
        ~CRoundButton(void);
        virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
    protected:
        virtual void PreSubclassWindow();
    private:
        CBrush m_normalBrush;
        CPen m_Pen;
        CBrush m_activeBrush;
    };

    RoundButton.cpp

     1 #include "StdAfx.h"
     2 #include "RoundButton.h"
     3 
     4 CRoundButton::CRoundButton(void)
     5 {//初始化这三个变量
     6     m_Pen.CreatePen(PS_SOLID,1,RGB(201,201,233));
     7     m_normalBrush.CreateSolidBrush(RGB(34,34,.34/*231,221,223*/));//正常状态下的按钮颜色
     8     m_activeBrush.CreateSolidBrush(RGB(201,201,233));//按钮按下时的按钮颜色
     9 }
    10 
    11 CRoundButton::~CRoundButton(void)
    12 {//删除三个变量
    13     m_Pen.DeleteObject();
    14     m_normalBrush.DeleteObject();
    15     m_activeBrush.DeleteObject();
    16 }
    17 
    18 void CRoundButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    19 {
    20 
    21     // TODO:  添加您的代码以绘制指定项
    22     CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC);  //DC Device Context 设备上下文 获取当前窗口的设备环境
    23     int nSaveDC=pDC->SaveDC();//存储当前设备环境,以便绘图结束时恢复原来状态
    24     pDC->SelectObject(&m_normalBrush);//选择按钮正常状态(默认状态下)的画刷
    25     pDC->SelectObject(&m_Pen);//选择画笔
    26     CRect rct=lpDrawItemStruct->rcItem;//获取按钮矩形区域
    27     if(lpDrawItemStruct->itemState&ODS_SELECTED)//绘制按钮按下时的颜色
    28     {
    29         pDC->SelectObject(&m_activeBrush);
    30     }
    31 
    32     pDC->Ellipse(&rct);
    33     pDC->SetBkMode(TRANSPARENT);//重绘文本时不擦除背景,即透明模式,如果选择OPAQUE(不透明),在文本四周有白色矩形边框
    34     CString strText;
    35     GetWindowText(strText);
    36     pDC->DrawText(strText,rct,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    37     pDC->RestoreDC(nSaveDC);
    38 
    39 }
    40 
    41 void CRoundButton::PreSubclassWindow()  
    42 //PreSubclassWindow()该函数可以初始化子类窗口,做一些绘制子类窗口之前要做的事情,如按钮风格的修改,按钮形状的修改
    43 {
    44     // TODO: 在此添加专用代码和/或调用基类
    45 
    46     ModifyStyle(0,BS_OWNERDRAW);  //改为自绘风格
    47     //绘制按钮可用区域,切掉四个边角
    48     CRgn rgn;
    49     CRect rct;
    50     GetClientRect(&rct);
    51     rgn.CreateEllipticRgnIndirect(&rct);  //在按钮矩形内创建椭圆区域
    52     ::SetWindowRgn(GetSafeHwnd(),(HRGN)rgn,true);//将椭圆区域应用到按钮上
    53     CButton::PreSubclassWindow();
    54 }
  • 相关阅读:
    linux基础命令1
    linux下nginx搭建
    linux 对外开放端口
    linux下mysql 登录修改密码与数据库备份
    linux下mysql部署
    linux下mysql启动 Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)
    aptitude软件状态标志i、v、p
    GNU各软件版本历史站点
    glibc库和glib库
    禁用ipv6的两种方法
  • 原文地址:https://www.cnblogs.com/qiwu1314/p/9284012.html
Copyright © 2011-2022 走看看