VS2012 MFC 制作透明按钮

Janewho 2015-05-01 12:32:34
本来听说可以用GDI,然后参照http://blog.csdn.net/zhongbin104/article/details/8730935,很荣幸地失败了。
又看到说有这样的函数void DrawTransparent(BOOL bRepaint = FALSE);但是用在对话框。。。表示我的是CFORVIEW的单文档。

请问上面两种方法能不能修改后可行呢?或者其他办法?
要简单的,越简单越好,我几天前刚接触MFC,复杂了我不懂,其实简单的可能也不懂。。。。

​我最想要的效果其实是按钮上还有透明的图片,就是要有透明小图标加文字。如果可以不太复杂就实现或者简单改改代码就能实现的话就好了。
...全文
332 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2015-06-04
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
tg2003 2015-05-04
  • 打赏
  • 举报
回复
试试GDI+
rxguoblp 2015-05-04
  • 打赏
  • 举报
回复
不要自己写了,就去下一个CButtonST类吧,顺便下一个说明书,照着说明书使用即可
lx624909677 2015-05-03
  • 打赏
  • 举报
回复
重绘button,头文件如下:
#pragma once


// CMyButton

class CMyButton : public CButton
{
DECLARE_DYNAMIC(CMyButton)

public:
CMyButton();
virtual ~CMyButton();
public:
void SetBkColor(COLORREF color);
void SetTextColor(COLORREF color);
private:
bool m_bOver;
bool m_bDown;
bool m_bDisable;
bool m_bTracking;
COLORREF m_bkColor;
COLORREF m_textColor;
protected:
DECLARE_MESSAGE_MAP()
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void PreSubclassWindow();
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
afx_msg void OnEnable(BOOL bEnable);
private:
void ButtonInit();
void DrawButton();
void DrawButton(HDC hDestDC);
};


cpp文件如下
// MyButton.cpp : 实现文件
//

#include "stdafx.h"
#include "AlphaButton.h"
#include "MyButton.h"
#include "MainDlg.h"

// CMyButton

IMPLEMENT_DYNAMIC(CMyButton, CButton)

CMyButton::CMyButton()
{
m_bkColor=0xFFFFFF;
m_textColor=0x000000;
}

CMyButton::~CMyButton()
{
}


BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_ENABLE()
END_MESSAGE_MAP()



// CMyButton 消息处理程序

void CMyButton::SetBkColor(COLORREF color)
{
m_bkColor=color;
}
void CMyButton::SetTextColor(COLORREF color)
{
m_textColor=color;
}

BOOL CMyButton::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL bRet=CButton::PreCreateWindow(cs);
ButtonInit();
return bRet;
}

void CMyButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ButtonInit();
}
void CMyButton::ButtonInit()
{
m_bTracking=false;
m_bOver=m_bDown=m_bDisable=false;
m_bDisable=IsWindowEnabled()?FALSE:TRUE;
ModifyStyle(NULL,BS_OWNERDRAW);
}

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

DrawButton(lpDrawItemStruct->hDC);
}

void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTracking)
{
m_bOver = TRUE;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 50;
m_bTracking = (bool)_TrackMouseEvent(&tme);
}

CButton::OnMouseMove(nFlags, point);
}

void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bDown=TRUE;

CButton::OnLButtonDown(nFlags, point);
}

void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bDown=FALSE;
CButton::OnLButtonUp(nFlags, point);
}
LRESULT CMyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bOver = FALSE;
m_bTracking = FALSE;
m_bDown=FALSE;
InvalidateRect(NULL, FALSE);
return 0;
}

LRESULT CMyButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_bOver = TRUE;
InvalidateRect(NULL);
return 0;
}
void CMyButton::DrawButton()
{
HDC hDC=::GetDC(m_hWnd);
DrawButton(hDC);
::ReleaseDC(m_hWnd,hDC);
}
void CMyButton::DrawButton(HDC hDestDC)
{
CRect rc;
GetClientRect(rc);
int nWindth=rc.Width();
int nHeight=rc.Height();
HDC hDC=CreateCompatibleDC(hDestDC);//创建兼容DC,采用双缓冲画出
HDC hMaskDC=CreateCompatibleDC(hDestDC);
HBITMAP hBitmap=CreateCompatibleBitmap(hDestDC,nWindth,nHeight);
HBITMAP hMaskBitmap=CreateCompatibleBitmap(hDestDC,nWindth,nHeight);
HBITMAP hOldBitmap=(HBITMAP)SelectObject(hDC,hBitmap);
HBITMAP hOldMaskBitmap=(HBITMAP)SelectObject(hMaskDC,hMaskBitmap);
SetBkMode(hDC,TRANSPARENT);

//把父窗口的背景图复制到按钮的DC上,实现视觉透明----------------
CMainDlg* pParent=(CMainDlg*)GetParent();
CPoint pt(0,0);
MapWindowPoints(pParent,&pt,1);
pParent->m_bkImage.BitBlt(hDC,rc,pt,SRCCOPY);


//-------------------------------------------------------------
int nAlpha=100;//0--255
int nOffset=0;

HBRUSH hbr=CreateSolidBrush(m_bkColor);
FillRect(hMaskDC,&rc,hbr);
DeleteObject(hbr);

if(m_bDisable){
nAlpha=100;
}else if(m_bDown){
nAlpha=180;
nOffset=1;
}else if(m_bOver){
nAlpha=150;
}else{
nAlpha=100;
}
BLENDFUNCTION blend;
memset( &blend, 0, sizeof( blend) );
blend.BlendOp= AC_SRC_OVER;
blend.SourceConstantAlpha= nAlpha; // 透明度 最大255

HRGN hRgn=CreateRoundRectRgn(0,0,nWindth,nHeight,3,3);
SelectClipRgn (hDC,hRgn);
AlphaBlend (hDC,0,0,nWindth,nHeight,hMaskDC, 0,0,nWindth,nHeight,blend);

CString strText;
GetWindowText(strText);
if(strText!=_T("")){
rc.InflateRect(-2,-2);
rc.OffsetRect(nOffset,nOffset);
HFONT hFont=(HFONT)SendMessage(WM_GETFONT);
if(!hFont)hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
HFONT hOldFont=(HFONT)SelectObject(hDC,hFont);
::SetTextColor(hDC,m_textColor);
::DrawText(hDC,strText,-1,&rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_WORD_ELLIPSIS);
::SelectObject(hDC,hOldFont);
}
SelectClipRgn (hDC,NULL);
DeleteObject(hRgn);
//复制到控件的DC上------------------------
BitBlt(hDestDC,0,0,nWindth,nHeight,hDC,0,0,SRCCOPY);
//删除资源,释放内存-----------------------
SelectObject(hDC,hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(hDC);
SelectObject(hMaskDC,hOldMaskBitmap);
DeleteObject(hMaskBitmap);
DeleteDC(hMaskDC);

}
void CMyButton::OnEnable(BOOL bEnable)
{
CButton::OnEnable(bEnable);
m_bDisable=IsWindowEnabled()?FALSE:TRUE;
DrawButton();
}

BrillianceRen 2015-05-01
  • 打赏
  • 举报
回复
CButtonST
实用与原理性的东西,对于想打好VC基础的朋友应该有帮助.示例目录:实例1 mfc框架. 文档和视 实例2 创建多文档窗口 实例3 创建对话框窗口 实例4 创建启动窗口 第2章 多窗口界面 实例5 多窗口的单文档界面 实例6 通过菜单改变视图 实例7 通过工具栏改变视图 实例8 多视图窗口数据显示 第3章 实现microsoft风格 实例9 visual studio风格的窗口 实例10 internetexplorer4. 0风格的窗口 实例11 outlook风格的窗口 实例12 状态栏中的任务栏 第4章 超文本界面 实例13 创建超级链接界面 实例14 显示模式html对话框窗口 实例15 超文本浏览器 实例16 数字化时钟 第5章 各种特效窗口 实例17 创建不规则窗口 实例18 操作dib位图窗口 实例19 位图转换窗口 实例20 渐变的窗口 第6章 对话框界面 实例21 可扩展对话柜 实例22 位图预览对话框 实例23 显示目录树对话框 实例24 透明对话框 第7章 菜单状态操作 实例25 漂亮的图文菜单 实例26 随文档动态改变菜单 实例27 启用和禁止菜单命令 实例28 复选菜单命令 第8章 自绘制菜单 实例29 自绘制图标菜单 实例30 visualstudio外观的工具栏 实例31 对话框窗口中的菜单 实例32 弹出位图菜单 第9章 动画按钮 实例33 avi动画按钮 实例34 实现图标按钮 实例35 实现一组图标按钮 实例36 绘制dib动画按钮 第10章 多彩按钮 实例37 位图按钮 实例38 带颜色的按钮 实例39 对鼠标敏感的按钮 实例40 可弹出菜单的按钮 第11章 图文按钮风格大全 实例41 各种图文按钮风格 实例42 图标浮动按钮 实例43 图钉按钮 实例44 计数器按钮 第12章 不规则按钮大全 实例45 各种不规则按钮 实例46 环形按钮 实例47 三角形按钮 实例48 椭圆形按钮 第13章 掩膜编辑框 实例49 ip地址输入编辑框 实例50 下拉列表控件中的编辑柜 实例51 掩膜

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧