2010-07-02 75 views
1

我试图让一个没有边框或框架的CDialog显示在任务栏中。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

回答

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); 
+0

聪明,但当有人有非标准的边框尺寸时,它会失败。这些是可配置的,你知道。 – 2010-07-13 03:35:26

+0

嗯,任何方式来获得客户区域抵消? – Lodle 2010-07-13 05:09:21

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 
} 

-
编辑:

我创建了一个第二个项目,以模仿您的更新,但我没有看到除了纳入DS_SHELLFONT的任何差异|在我(DS_SETFONT DS_FIXEDSYS)。 rc文件。这些对话框样式定义不会影响对话框的显示。

我已经将我的最小示例的关键部分上传到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(); 

而且,不要忘了破坏对话,当你用它做,无论是在类业主,或其他方便的位置的析构函数。

+0

嗯。仍然无法工作 – Lodle 2010-07-02 06:50:10

+0

感谢您的帮助到目前为止meklarian,但我仍然无法使用您的示例得到它的工作。我在这里上传了它:http://update.goldeneyesource.net/lodle/testMfcDialog。拉链,当我拖到我的第二个显示器,它不显示任何图标(显示主要的默认窗口图标)在那里作为关于对话框 – Lodle 2010-07-02 09:19:45

+0

得到了下载的副本,现在看它。 – meklarian 2010-07-02 09:39:34

相关问题