2010-07-02 78 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

相關問題