7
votes

Y a-t-il une fonction appelée après la fonction Oninitdialog dans MFC?

Je veux créer un thread après la création d'une boîte de dialogue dans MFC. Existe-t-il une fonction que Windows a fourni et s'appelle automatiquement après Oninitdialog afin que je puisse créer mon fil à l'intérieur?


0 commentaires

4 Réponses :


0
votes

Oninitdialog () est la fonction principale appelée à l'initialisation (en réaction à wm_create ).

Pourquoi ne pouvez-vous pas créer votre fil là-bas?


2 commentaires

Je crée deux threads à l'intérieur de la fonction ontitidialog, mais lorsque j'exécute que la boîte de dialogue se trouve très lentement. Je crée un fil à l'intérieur de l'Ontimer I.e après 5 ms heure lorsque la boîte de dialogue formée, le thread commencera que cela fonctionne bien. Je pensais donc à la création de fil dans la minuterie s'il y a une autre fonction qui a appelé après Dialo est créée, je peux mettre mon code là-bas. Certaines fonctionnalités existent-elles?


N'est-ce pas oninitdialog appelé réaction à wm_initdialog ?



16
votes

Vous pouvez simplement créer votre fil dans la fonction oninitdialog . Il n'y a aucune raison de surcharger les choses en allant et en recherchant une fonction différente ou en fractionnement de votre code d'initialisation en deux morceaux. (Il n'y a pas non plus aucune fonction de ce type, car il n'y a pas de message Windows correspondant envoyé.)

Si vous souhaitez obtenir votre boîte de dialogue à l'écran avant Vous créez le fil, vous pouvez simplement le montrer manuellement à l'aide du showwindow fonction . Par exemple: xxx

Voir aussi ce message par Raymond Chen: en attente jusqu'à ce que la boîte de dialogue soit affichée avant de faire quelque chose


3 commentaires

J'ai trouvé que je devais aussi appeler centrewindow () car l'appelant showwindow a abouti à la boîte de dialogue en haut à gauche.


@klox hmm, qui ne devrait pas être nécessaire. Les dialogues sont automatiquement centrées sur leur propriétaire Windows. Cela se produit dans une fonction MFC interne, _afxpostinitdialog , qui fonctionne après Oninitdialog . _afxpostinitdialog appelle en fait CentreWindow Si la fonction Oninitdialog ne modifie pas les coordonnées de la boîte de dialogue. Mais l'appelant explicitement ne fera pas de mal, non plus, tout ce qui fonctionne. Assurez-vous simplement que vous vous centrez dans un endroit raisonnable, en tenant compte des systèmes multi-surveillants. Toujours centré sur l'affichage principal serait la mauvaise décision. :-)


Je n'ai pas de fenêtre de propriétaire (la boîte de dialogue est la seule fenêtre), mais votre description aide à expliquer le changement de comportement que je vois.



0
votes

J'ai changé la priorité du fil en dessous de la normale et lorsque le thread est exécuté pour la première fois, je règle le thread au prieuré normal. Cela fonctionne bien. Merci pour votre réponse.


0 commentaires

0
votes

Après de nombreuses années de sentiment insatisfaisant de la solution ontimer pour dessiner des graphiques de première vue dans une application de dialogue MFC (une aire de jeux préférée), cela semblait être une belle solution simple: -

  1. Ajouter un gestionnaire WM_HScroll avec magicien de classe. Li>
  2. à la fin de Oninitdialog Poster un message HScroll avec un NULL LPARAM LI>
  3. dans le gestionnaire détecte la null, dessine des graphiques. Li> ol>

    Une minuterie signifiait que l'application était en vie pendant un certain temps avant que les graphiques ne soient arrivés, et apparemment hscrolls soit priorisé pour se produire juste après le message WM_Paint qui effacerait un élément d'image à son état vide, supprimant tout ce qui a été tiré. Pendant Initdialog. P>

    BOOL CSpecDlg::OnInitDialog()
    {
        ...
    
        PostMessage(WM_HSCROLL,0, (LPARAM)NULL);
        return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CSpecDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        // TODO: Add your message handler code here and/or call default
        if (pScrollBar==NULL)
        {
            plot();
        }
        CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    


0 commentaires