【问题标题】:How to create Rounded Rectangle Buttons in MFC如何在 MFC 中创建圆角矩形按钮
【发布时间】:2026-02-07 05:50:01
【问题描述】:

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

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

【问题讨论】:

    标签: visual-studio visual-c++ 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 链接代码)