您的位置:首页 > 其它

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

2013-04-24 12:02 363 查看
以下是网络上流传很久的例子,大家难得没有发现问题吗??红色字标明了问题所在。

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

   

  以下两个函数可以为应用程序中的各子窗口显示一个任务条到任务栏并更改它们的图标。对那些象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;  

  }

如果主窗口产生时隐藏了(一直隐藏,只到关闭),产生的子窗口,子窗口如何来关闭主窗口呢?
可以把if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL)   ==   0)  

改成,if(::SetParent(hWnd,NULL)   ==   0)  即可使子窗口显示图标,同时主窗口的指针在子窗口中也可以使用,不过带来一个问题,就是子窗口不能在任务栏显示!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: