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

时间:2016-01-30 20:51:58

标签: visual-studio visual-c++ mfc

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

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

1 个答案:

答案 0 :(得分: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?

<强> Exsample:

将以下内容另存为 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);
}

将此位图导入资源。

enter image description here

然后将 IDB_ROUND_BUTTON 设置为资源ID。

enter image description here

在对话框上添加按钮,并将“Owner Darw”proerty设置为True。 重要!

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

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

CSimpleBitmapButton m_Button;  // it was CButton m_Button;

最后,在OnInitDialog()

上设置位图
m_PlayButton.Open( IDB_ROUND_BUTTON );

enter image description here