我在Visual Studio2012更新4上使用C++,我有一个对话框,我想在对话框中显示一个按钮,显示一个没有边框的位图(.bmp文件

我已经扩展了CButton来添加我的工具提示,等等。
使用Resource View打开对话框.rc文件,我将按钮属性Bitmap设置为true。然后,在对话框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来仅绘制图像,但我也不能完全理解这一点。
有什么简单的方法来制作一个只有图标的按钮吗?
发布于 2016-05-06 05:15:11
您必须使用所有者绘制按钮或自定义绘制。下面是一个简单的例子,它使用图标而不是位图(为它分配透明背景更容易)
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;
}发布于 2016-05-06 08:38:07
如果您使用的是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;
}发布于 2021-11-12 08:55:50
使用CMFCbutton并将边框样式设置为BUTTONSTYLE_NOBORDERS;
对于图片使用.ico而不是png。
还指出了
示例代码
m_HResdll = LoadLibrary("C:\\Repos\\iFIX\\SCADABin\\en\\UAAClientConfigurationRes.dll");
//m_hTrustIcon = LoadIcon(m_HResdll, MAKEINTRESOURCE(IDI_ICON1));
m_hTrustIcon = (HICON)LoadImage(m_HResdll, MAKEINTRESOURCE(IDI_ICON2),1,18,22, LR_DEFAULTCOLOR);
unsigned int err = GetLastError();
m_btnTrustIcon.SetIcon(m_hTrustIcon);
this->m_btnTrustIcon.EnableWindow(true);https://stackoverflow.com/questions/37052222
复制相似问题