2010-07-02 4 views
1

Je tente d'obtenir un CDialog sans bordure ni cadre à afficher dans la barre des tâches.CDialog ne s'affiche pas dans la barre des tâches

Il est créé dans InitInstance de CWinApp (utilisé pour mettre à jour l'application) et j'ai essayé de définir le drapeau WS_EX_APPWINDOW mais il n'apparaît toujours pas dans la barre des tâches.

Des idées?

Edit: Tel qu'il est défini dans la ressource:

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 

Tel qu'il est utilisé:

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; 
} 

apparaît toujours comme ceci:

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

Répondre

0

J'ai trouvé un hack pour que cela fonctionne. Au lieu de désactiver les styles de la barre d'outils/barre de légende pour n'obtenir aucune bordure, j'ai utilisé SetWindowRgn pour couper le cadre et la barre de titre. Même effet, moins de problèmes.

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

Clever, mais il va échouer quand quelqu'un a des tailles de bordure non standard. Ceux-ci sont configurables, vous savez. –

+0

Hmm, un moyen d'obtenir le décalage de la zone client? – Lodle

2

Edit # 2:

Pour définir l'icône de cette fenêtre (essentiellement un écran de démarrage), vous pouvez envoyer à la fenêtre un message WM_SETICON avec l'icône souhaitée.

Pour une boîte de dialogue, vous pouvez le faire en OnInitDialog(). Voici un extrait qui utilise l'icône d'informations de Windows par défaut comme indiqué ici: 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 
} 

-
Edit:

J'ai créé un deuxième projet pour imiter votre mise à jour, mais je ne vois aucune différence, sauf l'inclusion de DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS) dans mon. fichier rc. Ces définitions de style de boîte de dialogue n'affectent pas l'affichage de la boîte de dialogue.

J'ai téléchargé des parties clés pour mon exemple minimal à http://gist.github.com/461057 pour votre référence, au cas où vous voudriez essayer d'ajouter cette boîte de dialogue avant la votre pour le tester.

En outre, j'utilise VS2010. J'ai VS2008 disponible si vous souhaitez que je répète ce test dans cette version aussi.

-
Original:

Essayez spécifiant la fenêtre de bureau (via CWnd::GetDesktopWindow()) que la fenêtre parent lorsque vous créez la boîte de dialogue.

// Member Variable 
CHelperDlg *dlg; 

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

En outre, ne pas oublier de détruire la boîte de dialogue lorsque vous avez terminé avec elle, que ce soit dans le destructor du propriétaire de classe, ou un autre endroit pratique.

+0

Hmm. Toujours pas de travail – Lodle

+0

Merci pour votre aide jusqu'à présent meklarian mais je ne peux toujours pas le faire fonctionner en utilisant votre exemple. Je l'ai téléchargé ici: http://update.goldeneyesource.net/lodle/testMfcDialog.zip et quand je le fais glisser vers mon deuxième moniteur, il ne montre aucune icône (affiche l'icône de fenêtres par défaut sur le principal) où – Lodle

+0

a obtenu une copie du téléchargement, en le regardant maintenant. – meklarian

Questions connexes