MFC(4)自绘按钮

2024-02-15 00:38
文章标签 mfc 按钮 自绘

本文主要是介绍MFC(4)自绘按钮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#pragma once
#include "afxwin.h"class CMyButton : public CButton
{
//DECLARE_DYNAMIC(CMyButton)
public:
CMyButton();
virtual ~CMyButton();
//设置Button Down的背景颜色void SetDownColor(COLORREF color);//设置Button Up的背景颜色
void SetUpColor(COLORREF color);
BOOL Attach(const UINT nID, CWnd* pParent);protected://必需重载的函数virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);public:
//三种颜色分别为文字,Button Down的背景颜色,Button Up的背景颜色
COLORREF m_TextColor, m_DownColor, m_UpColor;
};

#include "StdAfx.h"
#include "CMyButton.h"CMyButton::CMyButton(void)
{
m_DownColor = m_UpColor = RGB(210,120,0);
}CMyButton::~CMyButton(void)
{
}//CMyButton是CButton派生类,具有CButton的全部成员函数,//但在创建时需要使用BS_OWNERDRAW风格。//如果按钮不是动态生成,使用Attach函数使CMyButton代替原来按钮的窗口过程。BOOL CMyButton::Attach(const UINT nID, CWnd* pParent)
{
//GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);if (!SubclassDlgItem(nID, pParent))return FALSE;return TRUE;
}void CMyButton::SetDownColor(COLORREF color)
{
m_DownColor = color;
}void CMyButton::SetUpColor(COLORREF color)
{
m_UpColor = color;
}void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//得到绘制的设备环境CDC
VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);// 得当Button上文字,这里的步骤是:1,先得到在资源里编辑的按钮的文字,//然后将此文字重新绘制到按钮上,
//同时将此文字的背景色设为透明,这样,按钮上仅会显示文字const int bufSize = 512;
TCHAR buffer[bufSize];
GetWindowText(buffer, bufSize);int size=strlen(buffer);   //得到长度
DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);   //绘制文字
SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);   //透明if (lpDrawItemStruct->itemState & ODS_SELECTED)  //当按下按钮时的处理
{////重绘整个控制CBrush brush(m_DownColor);  dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);////因为这里进行了重绘,所以文字也要重绘DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);   SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);      
}
else                       //当按钮不操作或者弹起时
{CBrush brush(m_UpColor);     dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);////同上,进行重绘文字DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);    SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
}if ((lpDrawItemStruct->itemState & ODS_SELECTED )&&(lpDrawItemStruct->itemAction &(ODA_SELECT| ODA_DRAWENTIRE)))
{   //选中了本控件,高亮边框COLORREF fc=RGB(255-GetRValue(m_UpColor),255-GetGValue(m_UpColor), 255- GetBValue(m_UpColor));//CBrush brush(fc);//dc.FrameRect(&(lpDrawItemStruct->rcItem),&brush);//}
if (!(lpDrawItemStruct->itemState & ODS_SELECTED) &&(lpDrawItemStruct->itemAction & ODA_SELECT))
{//控制的选中状态结束,去掉边框CBrush brush(m_UpColor);dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);//}
dc.Detach();//
}


这篇关于MFC(4)自绘按钮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/710013

相关文章

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

控制台和MFC中内存泄露工具vld的使用

最近想检测下项目中内存泄露的情况,选中了vld这款。在查找使用方法的时候,大都是控制台下的示例,添加到main函数所在的源文件上。换成MFC就纠结了,不知道添加到哪里去。本文记录控制台和MFC中的使用vld过程。    vld资源:    1)、大家可以移步下边的网址下载:     http://vld.codeplex.com/releases/view/82311    2

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为: 借助RT-Thread和LVGL

致远个性化之--发起流程页面,去掉【查看流程】按钮

需求 近期在做的项目中,遇到一个需求,想把发起流程页面中的【查看流程】按钮去掉,只让员工预测流程,知道自己的事项流程走向,不让看全局流程图。包含PC端和移动端,以及微协同端。 如下图效果示例: 实现 此需求,只能通过修改页面代码实现。在此不分析实现过程,现把具体实现方式呈现如下,各位如有需求可参照设置。适用版本V9.0,其他版本未进行测试,估计不会有大的差别! PC端 找到文件

几种MFC对话框的隐藏方法

修改CXXAPP中的InitInstance函数,将原来的模态对话框改为非模态对话框,及修改 [cpp]  view plain copy INT_PTR nResponse = dlg.DoModal();     为 [cpp]  view plain copy dlg.Create(CModalHideDlg::IDD);

如何在Excel中创建一个VBA宏,并设置一个按钮来执行这个宏

下面是一个详细的步骤指南 步骤1:创建VBA宏 1. 打开Excel并按 `Alt + F11` 打开VBA编辑器。 2. 在VBA编辑器中,选择 `Insert` > `Module` 来插入一个新的模块。 3. 将以下代码粘贴到模块中: ```vba Sub CreateNewSheet()' 声明一个工作表对象Dim newSheet As Worksheet' 添加一个新的工作表S