2010-07-09 26 views
1

我正在使用基於win32 DialogBox的應用程序。這使用DialogBox()創建對話框,並有一個對話框過程,它執行所有常見的事情。win32 DialogBox應用程序:如何在DialogBox上顯示來自回調的文本?

對話框上有一些靜態文本控件,通常我會通過對話框過程中的SendDlgItemMessage()顯示這些文本。

但是在某一時刻,DialogBox啓動了一個冗長的操作。該操作具有一系列狀態消息的回調。我有顯示在對話框這些消息有些麻煩,原因有二:

  1. 回調函數不知道該對話框HWND是什麼,因爲它會從該執行的代碼稱爲冗長的操作。我想我可以定義一個文件範圍HWND變量,並在剛剛開始冗長操作之前從對話框過程中將對話框HWND複製到它中。這樣,回調函數可以訪問對話框HWND。但是這看起來非常糟糕:有沒有更優雅的方式?

  2. 當冗長的操作發生時,對話框過程被阻止。這並不重要,因爲它是一個嵌入式系統。但是,如果在對話框過程被阻止的情況下,我發出SendDlgItemMessage(),Windows甚至會在對話框中顯示文本?

編輯我用SendDlgItemMessage()將WM_SETTEXT發送到一個對話框上一個靜態文本控件做了一些調查。即使對話框過程被阻止,文本也會立即顯示。

回答

1

那麼,你的對話框HWND是一個單身人士,所以它不是世界的盡頭。但是,是的,這樣做的標準方式是將不透明的指針傳遞給完成工作的代碼。例如,與例如EnumWindows()的lParam參數比較,回調會將該指針返回。

控件是否立即重新繪製是一個實現細節。我只知道進度條在做這件事。您可以在對話框窗口句柄上調用UpdateWindow,以獲得任何待處理的刷新刷新到屏幕上。

全能更好的鼠標陷阱是在工作線程上執行長時間運行的任務。避免Windows顯示「Not Responding」ghost窗口,避免廣播消息超時以及大量潛在的死鎖問題。但是,往往很難得到正確的,你不能直接從工作線程更新窗口。

+0

所有的好東西。我正在使用不透明的指針路線,似乎工作得很好。關於工作者線程的要點;如果這是一個「真正的」應用程序,我肯定會這樣做,而不是嵌入式的應用程序,因爲它不會有鼠標或鍵盤。 – 2010-07-09 15:19:40

相關問題