更改窗口图标并将其显示在任务栏

2011年12月20日 分类:学习笔记C++

以下两个函数可以为应用程序中的各子窗口显示一个任务条到任务栏并更改它们的图标。对那些象QQ一样隐藏主窗口的应用程序特别有用。

函数用途:更改一个窗口的图标并将其显示在任务栏、任务切换条、任务管理器里
参数说明:
hWnd 要改变图标的窗口句柄
hLargeIcon 显示到任务切换条上的图标 32*32
hSmallIcon 显示到除任务切换条之外的图标 16*16
hIcon 显示的图标,32*32,在显示到任务切换条之外的其余地方时会被自动压缩成16*16的。

注释:
此函数对于模式对话框无能为力。
如果HICON 为NULL,函数不改变窗口图标,但是将原有图标显示到任务栏、任务切换条、任务管理器里。
此函数是通过将窗口的父窗口指针置空来实现将图标显示到任务栏、任务切换条、任务管理器里的,所以调用完成后,其父窗口指针不再可用。

BOOL SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon);
BOOL SendWndIconToTaskbar(HWND hWnd,HICON hIcon);
BOOL CUIApp::SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon)
{
BOOL ret = TRUE;
ASSERT(hWnd);
if(!::IsWindow(hWnd))
return FALSE;
//获取窗口指针
CWnd* pWnd;
pWnd = pWnd->FromHandle(hWnd);
ASSERT(pWnd);
if(!pWnd)
return FALSE;
//将父窗口设为NULL
if(pWnd->GetParent())
if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) == 0)
return FALSE;

if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))
ret = FALSE;
//设置窗口图标
if(hLargeIcon && hSmallIcon)
{
pWnd->SetIcon(hSmallIcon,FALSE);
pWnd->SetIcon(hLargeIcon,TRUE);
}

return ret;
}

BOOL CUIApp::SendWndIconToTaskbar(HWND hWnd,HICON hIcon)
{
BOOL ret = TRUE;
ASSERT(hWnd);
if(!::IsWindow(hWnd))
return FALSE;
//获取窗口指针
CWnd* pWnd;
pWnd = pWnd->FromHandle(hWnd);
ASSERT(pWnd);
if(!pWnd)
return FALSE;
//将父窗口设为NULL
if(pWnd->GetParent())
if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) == 0)
return FALSE;

if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))
ret = FALSE;
//设置窗口图标
pWnd->SetIcon(hIcon,TRUE);
pWnd->SetIcon(hIcon,FALSE);

return ret;
}
作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2011/12/change-icon-show-taskbar