我试图让任何没有边框或框架的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;
}
仍然显示如下:
答案 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);