MFC 重写SKINGBUTTON类实现按钮上写文字和绘画图片

本文详细介绍了如何在C++编程环境中自定义一个按钮组件,并实现了文本显示、选择状态切换以及图片加载等功能。通过继承SkinButton类并重写相关成员函数,展示了在C++中进行组件定制的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//头文件

#pragma once
#define CHAR_LENGTH 

class CPointButton :
public CSkinButton
{
public:
CPointButton(void);
~CPointButton(void);
public:
//设置文本位置
VOID SetTextRect(TCHAR *m_bTextBuffer,CRect bRect);
VOID SetChoice(bool bChoice);


VOID DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);


protected:
CRect m_bTextRect; //字符位置
TCHAR m_bTextBuffer[64]; //字符内容
bool m_bIsDrawText; //是否绘画
bool m_bIsDrawPng; //是否加载


CPngImageEx m_bPngYes; //对号资源

public:


DECLARE_MESSAGE_MAP()


};

//实现

#include "stdafx.h"

#include "Prompt.h"
#include ".\Prompt.h"


//消息定义
#define IDM_EXIT WM_USER+101 //离开消息


///////////////////////////////////////////////////////////////////////////


BEGIN_MESSAGE_MAP(CPrompt, CDialog)


ON_WM_PAINT()


END_MESSAGE_MAP()


//构造函数
CPrompt::CPrompt(): CDialog(IDD_DIALOG2)
{
ZeroMemory(m_tStr,sizeof(m_tStr));
}


//析构函数
CPrompt::~CPrompt()
{
}


//控件绑定
void CPrompt::DoDataExchange(CDataExchange * pDX)
{
__super::DoDataExchange(pDX);
}


//初始化函数
BOOL CPrompt::OnInitDialog()
{
__super::OnInitDialog();


return TRUE;
}


//重画函数
void CPrompt::OnPaint() 
{
CPaintDC dc(this); 


//设置 DC
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0,0,0));
CSkinResourceManager * pSkinResourceManager = (CSkinResourceManager *)CSkinResourceManager::GetInstance();
if(pSkinResourceManager!=NULL)
dc.SelectObject(pSkinResourceManager->GetDefaultFont());


//创建字体
CFont ViewFont;
ViewFont.CreateFont(-12,0,0,0,400,0,0,0,134,3,2,1,1,TEXT("Arial"));
CFont *pOldFont=dc.SelectObject(&ViewFont);


CRect rcScore(0,30,220,30+19);
dc.DrawText(m_tStr,lstrlen(m_tStr),&rcScore,DT_VCENTER|DT_CENTER|DT_END_ELLIPSIS);


//还原字体
dc.SelectObject(pOldFont);
ViewFont.DeleteObject();


return;
}


//命令信息
BOOL CPrompt::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
BYTE bTemp = (BYTE)wParam;


if(bTemp==IDOK || bTemp==IDCANCEL)
{
PostMessage(IDM_EXIT,0,0);


OnOK();
return TRUE;
}


return CDialog::OnCommand(wParam, lParam);
}


//设置对白
void CPrompt::SetString(TCHAR szString[])
{
CopyMemory(m_tStr,szString,CountArray(m_tStr));


//绘画视图
Invalidate(NULL);


return ;
}


//命令信息
BOOL CPrompt::PreTranslateMessage(MSG* pMsg)
{
//过滤字母
if(pMsg->message==WM_KEYDOWN)
{
BYTE bMesValue = (BYTE)(pMsg->wParam); 
if(bMesValue==VK_SPACE || bMesValue==VK_RETURN) return TRUE;
}


return CDialog::PreTranslateMessage(pMsg);
}
///////////////////////////////////////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值