CDialog没有显示在任务栏中

时间:2010-07-02 04:30:05

标签: c++ windows mfc

我试图让任何没有边框或框架的CDialog显示在任务栏中。

它是在CWinApp的InitInstance中创建的(用于更新应用程序),我尝试设置WS_EX_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 个答案:

答案 0 :(得分:2)

编辑#2:

要设置此窗口的图标(实际上是启动画面),您可以向窗口发送WM_SETICON消息以及所需的图标。

对于对话框,您可以在OnInitDialog()中执行此操作。以下是使用默认窗口信息图标的代码段: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();

此外,当你完成对话时,不要忘记在类所有者的析构函数或其他方便的位置销毁对话框。

答案 1 :(得分:0)

我想出了一个能让它发挥作用的黑客行为。我没有禁用工具栏/标题栏样式来获取边框,而是使用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);