2009-12-18 63 views
0

我想彈出一個窗口來顯示某個程序忙於執行特定的耗時任務。但我不想要任何按鈕。我只想彈出它,完成任務,然後刪除它。我不確定這樣的窗口被稱爲什麼,所以不知道在MSDN中搜索什麼等等。是否有一些現成的API用於這種事情,還是我需要自己做飯?「我很忙請等待」窗口 - 沒有按鈕

編輯:在回答一些評論...我不使用MFC

該程序是供我自己使用的 - 答案不一定非常漂亮。

我不只是依賴沙漏的原因是沙漏只在光標位於應用程序小窗口頂部時顯示,而且我使用四個非常大的監視器工作,並且光標通常不是在問題的窗口..如果我沒有看到一個沙漏,那麼我的程序看起來像它的崩潰。它非常令人不安。作爲我的工作,我一直致力於這個計劃,並且已經這麼做了很多年。需要很長時間的操作只是偶爾執行,我可能會花數個月不使用它。所以如果它鎖定了這個任務,我擔心我會忘記它只是忙碌,並假設有一些錯誤,並試圖解決一個不存在的問題。

+0

99.9% 'C',0.1%C++(我是新的)。 – Mick 2009-12-18 11:15:56

+0

我不知道你的程序在做什麼,但是你的「工作」對話框不應該至少有一個取消按鈕? – 2009-12-18 17:04:16

回答

4

這實際上是比簡單的對話更深刻的問題之前。如果你從事的工作可能需要很長時間,那麼你不希望在主線上工作。在Vista之前的Windows版本中,窗口不會繪製 - 最終會出現「白色窗口」綜合症,這非常醜陋。最好創建一個worker(non-ui)線程,並在完成後讓它向主窗口發回消息。顯然你必須有某種超時才能完成。如果你這樣做,那麼「對話」問題就變成了一個簡單的建立一個窗口並在線程向你發送「完成」消息時再次拉下窗口的問題。您可以嘗試查看MSDN文檔中的「無模式對話框」,您可以隨意創建和銷燬對話框(請記住禁用主窗口)。在MFC中有一些微妙的實現,但你不會說你是否在使用它。

1

我認爲你正在尋找閃屏

0

實際上,因爲它是這樣一個平凡的窗口,你可能最好自己創造它的。你可能只能處理WM_PAINT而沒有別的。

2

爲什麼?

接受的窗口習語是使用沙漏光標。

一個更好的解決辦法是做在不同的線程這個長時間運行的任務,讓用戶繼續做其他的事情(這可能不是適合你的情況雖然)

您可以創建一個進度條向用戶顯示正在發生的事情,但幾乎總是有一個取消按鈕。用戶喜歡能夠取消長時間運行的任務。

正如其他人所發佈的,還有的CreateWindowEx功能。不過,我覺得你應該考慮一些你們的設計這樣

+0

好問題。事情是隻有當光標位於應用程序小窗口頂部時,纔會顯示沙漏,而且我使用四個非常大的監視器工作,並且光標通常不在窗口中。如果我沒有看到沙漏然後我的程序看起來像它的墜毀。它非常令人不安。 – Mick 2009-12-18 11:29:04

+0

請參閱編輯原始文章。 – Mick 2009-12-18 11:44:25

-1

爲什麼浪費資源顯示一個新的窗口,當你有用戶的窮人機綁做其他的東西? - 沒有意義。

堅持更標準的用戶界面約定,你的用戶會感謝你(好吧,他們不會,但他們可能不會抱怨)。

+1

即使是最好的電腦也可能需要大量的時間來完成某些任務,因爲這項任務需要很長時間,所以機器不一定非常「不好」。你也提到「標準的UI約定」,但你指的不是。 – 2009-12-18 13:13:38

0

如果您使用Visual Studio進行開發,則可以將對話資源添加到您的項目中。該對話框將僅包含您在問題中指定的文本,而不包含任何按鈕。不要忘記給對話框分配一個有意義的ID。如果您沒有使用Visual Studio,仍然可以編寫對話框模板(畢竟,它只是一個文本文件),並使用資源編譯器進行編譯,您可以在網上隨處找到它。

現在在你的代碼,使用CreateDialog()函數來創建對話框,然後ShowWindow()。你將不得不爲重新設置的對話框設置一個消息循環。有a good set of example in the MSDN

我會添加你需要一個無模式對話:打電話DialogBox()創建和顯示一個模式對話框會阻塞,直到對話框通過用戶操作被駁回,因爲你有你的對話框沒有按鈕,它永遠不會被解僱,所以通話將無限期阻止。

不幸的是,這意味着編寫自己的message loop而當你處理窗口消息,你將不會被運行你長的計算。所以基本上,我擔心你需要在一個新的線程中創建對話框,以獲得你描述的行爲。

0

傳統的方法是,以顯示一個進度指示器,無論是螺旋槳或沙漏。只要不存在對用戶沒有響應

"|" 
"\b/" 
"\b-" 
"\b\\" 

重複:螺旋槳可被顯示在控制檯上。只要計算機懸掛起來,人們就想要進度指示器來顯示計算機處於活動狀態並處理。

另一個是心臟的跳動:

"*" 
"\b " 
"\b*"