我需要在MFC中创建圆角矩形按钮。我尝试了几种资源,但没有找到正确的解释方法。即使在** Code Project **中,我也创建了圆形或椭圆形按钮。
请建议我们如何创建圆角矩形按钮或任何其他文章
答案 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);
}
将此位图导入资源。
然后将 IDB_ROUND_BUTTON 设置为资源ID。
在对话框上添加按钮,并将“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 );