代码之家  ›  专栏  ›  技术社区  ›  Lodle

cdialog不显示在任务栏中

  •  1
  • Lodle  · 技术社区  · 14 年前

    我正在尝试获取一个没有边框或框架的CDialog,以显示在任务栏中。

    它是在cwinapp的inittInstance中创建的(用于更新应用程序),我尝试了设置ws ou ex ou appwindow标志,但它仍然不显示在任务栏中。

    有什么想法吗?

    编辑: 如资源中所定义:

    IDD_UPDATEFORM_DIALOG DIALOGEX 0, 0, 246, 124
    STYLE WS_POPUP
    EXSTYLE WS_EX_APPWINDOW
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    BEGIN
    END
    

    如使用:

     UpdateForm *dlg = new UpdateForm(UPDATE_FILES, CWnd::GetDesktopWindow());
     INT_PTR nResponse = dlg->DoModal();
    
    
    UpdateForm::UpdateForm(int updateType, CWnd* pParent) : CDialog(IDD_UPDATEFORM_DIALOG, pParent)
    {
     m_bInit = false;
     m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON);
     m_Progress = new DesuraProgress();
     m_updateType = updateType;
    }
    

    仍然像这样出现:

    http://update.goldeneyesource.net/lodle/noicon.jpg http://update.goldeneyesource.net/lodle/noicon.jpg

    2 回复  |  直到 14 年前
        1
  •  2
  •   meklarian    14 年前

    编辑第2页:

    要设置此窗口的图标(基本上是初始屏幕),可以将窗口 WM_SETICON 带有所需图标的消息。

    对于对话框,可以在 OnInitDialog() . 下面是一个使用默认Windows信息图标的代码段,如下所示: LoadIcon @ MSDN .

    // CHelperDlg message handlers
    BOOL CHelperDlg::OnInitDialog()
    {
      CDialog::OnInitDialog();
    
      // 32516 is also known as IDI_INFORMATION
      HICON hIcon = LoadIcon(0, MAKEINTRESOURCE(32516));
    
      // 0 in WPARAM is 'small version'
      ::SendMessage(GetSafeHwnd(), WM_SETICON, 0, (LPARAM)hIcon);
      // 1 in WPARAM is 'large version'
      ::SendMessage(GetSafeHwnd(), WM_SETICON, 1, (LPARAM)hIcon);
    
      // No cleanup as HICONs are free from disposal rules.
    
      return TRUE;  // return TRUE unless you set the focus to a control
      // EXCEPTION: OCX Property Pages should return FALSE
    }
    

    ——
    编辑:

    我创建了第二个项目来模拟您的更新,但是除了在我的.rc文件中包含ds_ShellFont(ds_SetFont_ds_Fixedsys)之外,我没有看到任何不同。这些对话框样式定义不会影响对话框的显示。

    我已将我的最小示例的关键部分上载到 http://gist.github.com/461057 以供参考,以防您想尝试在测试之前添加此对话框。

    另外,我正在使用VS2010。如果你想让我在那个版本中重复这个测试,我有VS2008可用。

    ——
    原件:

    尝试指定桌面窗口(通过 CWnd::GetDesktopWindow() )作为创建对话框时的父窗口。

    // Member Variable
    CHelperDlg *dlg;
    
    // Meanwhile, elsewhere...
    dlg = new CHelperDlg();
    dlg->Create(IDD_HELPERDLG, CWnd::GetDesktopWindow());
    dlg->ShowWindow(SW_SHOW);
    // or...
    // dlg->DoModal();
    

    另外,在完成对话后,不要忘记销毁它,无论是在类所有者的析构函数中,还是在其他方便的位置中。

        2
  •  0
  •   Lodle    14 年前

    我想出了一个办法让这个工作。我没有禁用工具栏/标题栏样式来获取边框,而是使用setwindowrgn来剪裁框架和标题栏。同样的影响,更少的问题。

    RECT rect;
    GetWindowRect(&rect);
    int w = rect.right - rect.left;
    int h = rect.bottom - rect.top;
    
    HRGN region = CreateRoundRectRgn(5, 30, w-5, h-5-30, 5, 5);
    SetWindowRgn(region, true);