在visual studio 6.0中有没有删除图标的功能?

Is there any function that removes icon, using visual studio 6.0?

本文关键字:图标 删除 功能 有没有 visual studio      更新时间:2023-10-16

我找不到任何可以删除加载图标的函数。请帮帮我:)或者是否有其他函数使图标隐藏,如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 ')来强制重新绘制。