如何将已经设置好的VC MFC 矩形按钮改成圆形 工程的基类是CView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将已经设置好的VC MFC 矩形按钮改成圆形 工程的基类是CView相关的知识,希望对你有一定的参考价值。

参考技术A 如果你用的是标准的CButtonST 按钮,那么默认是不支持圆形按钮的,一个取巧的办法就是定义圆形的ICON图标资源,并指定给CButtonST,那么按钮就是圆形的了。追问

具体怎么实现 可以说说吗?

追答

CButtonST的图标按钮,是它最有特色的功能了,将几个按钮都作出图标(文字在图上),之后:

m_btn_x0.SetIcon(IDI_ICON1); 
m_btn_x0.DrawBorder(FALSE); 
m_btn_x0.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208)); 
m_btn_x0.SetColor(CButtonST::BTNST_COLOR_BK_IN, RGB(208,208,208)); 
m_btn_x0.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));

据Icon的大小调整按钮的大小,颜色也是根据底色调整。

参考技术B 使用SetWindowRgn函数实现,为按钮窗口设置一个原型区域。追问

求详细步骤

追答

先获取按钮客户区,然后利用CRgn类创建一个圆形区域,然后调用按钮的SetWindowRgn函数实现.如果希望CButtonST所对应的所有按钮都是圆形,可以在CButtonST里面进行编程实现(使用设置按钮窗口区域的办法。)

追问

来点代码吧

来点代码吧

追答

你有CButtonST这个类的原代码吗?发给我,给你改一下就可以了。

追问

留个企鹅或者邮箱吧

追答

QQ1819359253

参考技术C 加我 账号~~我一步一步告诉你!!!本回答被提问者采纳

如何在 MFC 中创建圆角矩形按钮

【中文标题】如何在 MFC 中创建圆角矩形按钮【英文标题】:How to create Rounded Rectangle Buttons in MFC 【发布时间】:2016-01-30 20:51:57 【问题描述】:

我需要在 MFC 中创建圆角矩形按钮。我尝试了几种资源,但没有找到正确的解释方式。即使在**代码项目**中,我也创建了圆形或椭圆形按钮。

请建议我们如何创建圆角矩形按钮或任何其他文章

【问题讨论】:

【参考方案1】:

我的答案是……

1.使用皮肤库。

我通常使用 Codejock SkinFramework。 这很容易。在您的 stdafx.h 中包含 XTSkinFrameworkPro.h,然后在调用您的对话框之前加载皮肤文件。

XTPSkinManager()->LoadSkin(_T("..."));

2-1。自己画。

最简单的一个在这里。请先阅读。

https://vcpptips.wordpress.com/tag/owner-draw-button-control/

然后使用此代码制作圆形按钮。如果在他们点击按钮时将标签文本滑动到右下角 1px 会更好。

http://www.codeproject.com/Articles/11683/CRoundButton-A-fancy-graphical-button

2-2。自己画。 (使用位图)

另一个是使用位图按钮。制作圆形按钮的位图图像,然后将其设置为您的按钮。

how to add bitmap image to buttons in MFC?

示例:

在下面保存为 SimpleBitmapButton.h 并将其包含在您的项目中。

#pragma once

#include <afxwin.h>

class CSimpleBitmapButton : public CButton

    DECLARE_DYNAMIC(CSimpleBitmapButton)

protected:

    enum EButtonState
    
        NORMAL = 0,
        PUSHED = 1
    ;

public:
    CSimpleBitmapButton();

    BOOL Open( int resource_id );
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

protected:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);

protected:
    int Width, Height;
    BOOL Pushed;
    CBitmap Bitmap;
;

在下面保存为 SimpleBitmapButton.cpp 并将其包含在您的项目中。

#include "stdafx.h"
#include "SimpleBitmapButton.h"

const int BUTTON_IMAGE_NUM = 2;

IMPLEMENT_DYNAMIC(CSimpleBitmapButton, CButton)

BEGIN_MESSAGE_MAP(CSimpleBitmapButton, CButton)
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_CREATE()
END_MESSAGE_MAP()

CSimpleBitmapButton :: CSimpleBitmapButton()

    Pushed = FALSE;
    Width = 0;
    Height = 0;


void CSimpleBitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct )

    CDC memDC;
    memDC.CreateCompatibleDC( NULL );
    CBitmap *oldBitmap = memDC.SelectObject( &Bitmap );

    if( Pushed == FALSE )
        BitBlt( lpDrawItemStruct->hDC, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY );
    else
        BitBlt( lpDrawItemStruct->hDC, 0, 0, Width, Height, memDC, Width , 0, SRCCOPY );

    memDC.SelectObject( oldBitmap );


BOOL CSimpleBitmapButton :: Open( int resource_id )

    Pushed = FALSE;

    Bitmap.LoadBitmap( resource_id );

    //adjust the button size
    BITMAP bm;
    Bitmap.GetObject(sizeof(BITMAP),&bm);
    Width = bm.bmWidth / BUTTON_IMAGE_NUM;
    Height = bm.bmHeight;

    RECT rect;
    GetWindowRect( &rect );
    GetParent()->ScreenToClient( &rect );

    rect.right = rect.left + Width;
    rect.bottom = rect.top + Height;
    MoveWindow( &rect );

    return TRUE;


void CSimpleBitmapButton::OnLButtonDown(UINT nFlags, CPoint point)

    Pushed = TRUE;
    Invalidate( FALSE );

    CButton::OnLButtonDown(nFlags, point);



void CSimpleBitmapButton::OnLButtonUp(UINT nFlags, CPoint point)

    Pushed = FALSE;
    Invalidate( FALSE );

    CButton::OnLButtonUp(nFlags, point);

将此位图导入资源。

然后为资源 ID 设置 IDB_ROUND_BUTTON

在对话框中添加按钮并将“Owner Darw”属性设置为 True。 重要!

将按钮的成员变量添加为m_PlayButton。

在对话框标题处,包含 SimpleBitmapButton.h 并将 m_PlayButton 的类从 CButton 更改为 CSimpleBitmapButton。

CSimpleBitmapButton m_Button;  // it was CButton m_Button;

最后,在 OnInitDialog() 上设置位图

m_PlayButton.Open( IDB_ROUND_BUTTON );

【讨论】:

请建议业主抽取样本 好的。我添加了更多细节和链接。希望对您有所帮助。 这本质上是一个仅链接的答案,不包含任何有用的信息,以防链接到的资源不可用。 知道了。如果@sumanreddy 告诉我他/她想要实现哪种方式,我将使用 MFC 制作一些示例代码。 @Jin 你为什么不从使用位图图像开始。我确实尝试过,但是一旦我运行代码按钮就消失了(使用 2-2 链接代码)

以上是关于如何将已经设置好的VC MFC 矩形按钮改成圆形 工程的基类是CView的主要内容,如果未能解决你的问题,请参考以下文章

mfc做的一个程序,如何将绘画的矩形、圆形保存到位图?保存成.bmp格式?

MFC编写一个绘图程序

猎豹MFC--对话框 复选框 单选按钮

如何在通过文本字段和圆形矩形按钮提供的表格视图单元格中显示数据

MFC里怎么改变窗口上按钮控件的颜色

vc6.0里MFC进度条如何使用