2010-07-09 4 views
1

Je travaille sur une application basée sur DialogBox win32. Cela utilise DialogBox() pour créer la boîte de dialogue, et a une procédure de boîte de dialogue qui fait toutes les choses habituelles.Win32 DialogBox application: comment afficher le texte de rappel sur la DialogBox?

La boîte de dialogue comporte des contrôles de texte statique et, généralement, je montre du texte dans ceux-ci via SendDlgItemMessage() à partir de la procédure de boîte de dialogue.

Toutefois, à un moment donné, la DialogBox initie une longue opération. Cette opération a un rappel avec une série de messages d'état. Je vais avoir quelques problèmes montrant ces messages sur la boîte de dialogue, pour deux raisons:

  1. La fonction de rappel ne sait pas ce que la boîte de dialogue HWND est, car elle est appelée à partir du code qui effectue la longue opération. Je suppose que je peux définir une variable HWND de portée de fichier et y copier la boîte de dialogue HWND à partir de la procédure de boîte de dialogue juste avant le début de l'opération longue. De cette façon, la fonction de rappel pourrait avoir accès à la boîte de dialogue HWND. Mais cela semble terriblement kludgy: y at-il une manière plus élégante?

  2. La procédure de boîte de dialogue est bloquée pendant la durée de l'opération. Cela n'a pas d'importance parce que c'est un système embarqué. Mais Windows affichera-t-il même le texte dans la boîte de dialogue si j'émets un SendDlgItemMessage() pendant que la procédure de boîte de dialogue est bloquée?

modifier J'ai fait quelques enquêtes à l'aide SendDlgItemMessage() pour envoyer un WM_SETTEXT à un contrôle de texte statique sur une boîte de dialogue. Le texte est affiché immédiatement même si la procédure de boîte de dialogue est bloquée.

Répondre

1

Eh bien, votre dialogue HWND est un singleton donc ce n'est pas la fin du monde. Mais oui, la façon standard de procéder est de passer un pointeur opaque au code qui fait le travail. Comparez avec l'argument lParam de EnumWindows() par exemple, le rappel récupère ce pointeur.

Si un contrôle se repeint immédiatement est un détail d'implémentation. Je ne connais que la barre de progression qui le fait. Vous pouvez appeler UpdateWindow sur la poignée de la fenêtre de dialogue pour afficher toutes les mises à jour de peinture en attente à l'écran.

Le piège à souris global mieux est d'exécuter des tâches de longue durée sur un thread de travail. Évite que Windows affiche la fenêtre fantôme "Ne répond pas", évite les délais d'attente sur les messages diffusés et de nombreux problèmes potentiels de blocage. Mais a tendance à être difficile à obtenir, vous ne pouvez pas mettre à jour la fenêtre directement à partir du thread de travail.

+0

Toutes les bonnes choses. Je vais avec la route du pointeur opaque et semble bien fonctionner. Point pris sur le fil de travail; Je ferais certainement ceci si c'était une "vraie" application par opposition à une application intégrée où il n'y aurait pas de souris ou de clavier. –

Questions connexes