我找不到任何可以删除加载图标的函数。请帮帮我:)或者是否有其他函数使图标隐藏,如setVisible(false)或delete?
if(GetDlgItem (IDC_BUTTON1)->IsWindowEnabled())
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
dc.DrawIcon(DT_CENTER,DT_CENTER, m_hIcon);
}
if(GetDlgItem (IDC_BUTTON1)->IsWindowEnabled()==0) //disabled
{ dc.SetTextColor(RGB(192,192,192));
m_hIcon = AfxGetApp()->RemoveIcon(IDI_ICON1);//HERE! // I try another icon
//which is null, however it didn't work because it is transparent.
}
当按钮被禁用时,不是绘制另一个图标,而是使用空笔和背景颜色的画笔绘制一个矩形,或者当您禁用按钮
bErase
作为TRUE
使图标矩形无效。这段代码有点奇怪,特别是因为你没有给我们任何上下文。什么是dc
,一个设备上下文?这是OnPaint
消息处理函数内部的代码吗?不管怎样,为什么要手动绘制图标而不是让按钮控件自动绘制呢?
更简单的方法是通过OnEnable
成员函数监听WM_ENABLE
消息,并调用SetIcon
成员函数来更新按钮的图标,从而监视控件的启用状态。通过这种方式,按钮控件可以跟踪图标,因此不需要将其保存在成员变量(m_hIcon
)中。删除一个图标就像设置它显示一个空图标一样简单。没有必要使用所有这些难看的技巧,比如使用第二个透明图标,或者在图标上画一个纯色矩形。
示例代码,CMyButton
扩展CButton
:
void CMyButton::OnEnable(BOOL bEnable)
{
CButton::OnEnable(bEnable); // call the base class
if (bEnable)
{
// The button was enabled, so load and set the icon.
const HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
this->SetIcon(hIcon);
}
else
{
// The button was disabled.
// First, retrieve the current icon from the button.
const HICON hIcon = this->GetIcon();
// Then, remove the icon from the button by setting a null icon.
this->SetIcon(NULL);
// Finally, delete the original icon to prevent memory leaks.
::DestroyIcon(hIcon);
}
}
当然,如果你绝对有必要的话,你也可以在OnPaint
函数中这样做(尽管这是一个糟糕的设计)。诀窍在于,只有执行了绘制图标的代码,图标才会被绘制出来。否则,不会绘制图标。基类不会绘制图标。
所以你只需要:
void CMyWindow::OnPaint()
{
CPaintDC dc(this);
const CWnd* pBtn = GetDlgItem(IDC_BUTTON1);
if (pBtn->IsWindowEnabled())
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
dc.DrawIcon(DT_CENTER, DT_CENTER, m_hIcon);
// make sure that you delete m_hIcon when the window is destroyed!
}
else
{
// Do not draw the icon here!
// But write whatever other code you want, like...
dc.SetTextColor(RGB(192,192,192));
}
}
显然,这种策略只会工作,如果你的代码是在OnPaint
函数,但这是你应该做所有的绘图。否则,每当重新粉刷窗户时,它就会丢失。举个例子,试着最小化窗口或将其移出屏幕。通过调用CWnd::Invalidate
,然后调用CWnd::UpdateWindow
(或者' CWnd::RedrawWindow ')来强制重新绘制。