我在Visual Studio 2012更新4上使用C ++,我有一个Dialog,我想显示一个显示位图(.bmp文件)的按钮,没有边框
我已扩展CButton
以添加我的工具提示,依此类推。
使用资源视图打开对话框.rc
文件,我将属性Bitmap
设置为true
。然后,从Dialog OnInitDialog
函数中,我使用此代码设置位图,标识为IDB_HELP
myButton.SetBitmap((HBITMAP)LoadImage(AfxGetApp()->m_hInstance,
MAKEINTRESOURCE(IDB_HELP), IMAGE_BITMAP, 16, 16, LR_COLOR));
我尝试在资源视图中将其设为Flat
和Transparent
,但它只会变得更加丑陋。
然后我尝试通过将Owner Draw
设置为true
然后在我的按钮类中重新定义DrawItem
来绘制图像,但我也无法解决这个问题。
制作纯图标按钮的简单方法是什么?
答案 0 :(得分:1)
如果您使用CMFCButton
并且使用ICO文件而不是BMP,则不需要执行自己的图标绘制算法。虽然您可以在资源文件中直接说出这种类型的按钮,但我不推荐它,因为它在rc文件中添加了一个不可维护的十六进制文本。如果你使用几个rc文件,每种语言一个,它真的很恶魔!
那就放手吧。在表单类中,声明成员
CMFCButton m_button1;
DoDataExchange
应如下所示:
void MyDialog::DoDataExchange(CDataExchange* pDX)
{
__super::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, m_button1);
// ...
}
然后OnInitDialog
应该是这样的:
BOOL CMyDialog::OnInitDialog()
{
if(!__super::OnInitDialog())
return FALSE;
m_button1.m_nFlatStyle= CMFCButton::BUTTONSTYLE_NOBORDERS;
m_button1.SetIcon(IDI_HELP);
return TRUE;
}
答案 1 :(得分:0)
您必须使用所有者绘制按钮或自定义绘图。下面是一个简单的例子,它使用图标而不是位图(它更容易为它分配透明背景)
class CMyButton:public CButton
{
void OnPaint()
{
CPaintDC dc(this);
CRect rc = dc.m_ps.rcPaint;
dc.FillSolidRect(&rc, GetSysColor(COLOR_3DFACE));
BOOL offset = (BST_PUSHED & GetState()) ? 1 : 0;
int w = 24;
int h = 24;
HICON hicon = (HICON)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_ICON),
IMAGE_ICON, w, h, LR_DEFAULTCOLOR);
DrawIconEx(dc, offset, offset, hicon, w, h, 0, 0, DI_NORMAL);
DestroyIcon(hicon);
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_PAINT()
END_MESSAGE_MAP()
用法:
BOOL CMyDialog::OnInitDialog()
{
BOOL res = CDialogEx::OnInitDialog();
static CMyButton bn;
bn.SubclassDlgItem(IDC_BUTTON1, this);
return res;
}