在visual studio 6.0中有没有删除图标的功能?
Is there any function that removes icon, using visual studio 6.0?
我找不到任何可以删除加载图标的函数。请帮帮我:)或者是否有其他函数使图标隐藏,如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 ')来强制重新绘制。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 删除Wm6.5中的系统托盘图标
- 在visual studio 6.0中有没有删除图标的功能?
- 从托盘中删除图标