我創建了一個窗口,CreateWindow()
與ShowWindow()
表現出來。但是在創建它的父窗口應該被禁用,直到用戶從這個窗口返回,即它應該模擬模態對話框。創建一個Win32模式窗口用CreateWindow的
回答
你需要考慮它是什麼意思是模態窗口 - 基本上,窗口的父項被禁用。這樣做的唯一自動方法(我知道)是調用DialogBox()
創建一個模態對話框。但是,由於您想使用CreateWindow()
,所以您只需手動禁用父窗口即可。理想情況下,最好是去對話框路由(因爲操作系統確切地知道必須做什麼才能創建一個模式窗口),但是如果你必須使用它,我想這個選項是存在的。
Modality, part 1: UI-modality vs code-modality解釋如何做到這一點,爲什麼你可能不希望。
確保在CreateWindow
設置hwndParent
和使用顯示彈出窗口後,禁用父。然後在彈出窗口關閉後啓用EnableWindow(hwndParent, TRUE)
。
你也可以運行一個「二級消息循環」,這一直不活躍的父窗口,直到您的工作與「模式」對話框完成。
好吧我只是自己與這個相同的問題摔跤。我需要一個快速的對話框,如果我使用DialogBox(),但我不想爲我正在使用的特定項目創建模板。
我發現那是什麼,如果你禁用對話框的父窗口也關閉對話框。如果不重新啓用父對話框,則無法啓用該對話框。所以這種方法將無法工作。
我還發現,你不能使用SetCapture()/ ReleaseCapture(),因爲隨後的對話框的子窗口不會得到的消息。
我沒有找到一個可行的解決方案:使用本地消息泵,方法是的PeekMessage()或GetMessage函數()驅動。這裏是爲我工作的代碼:
while (!m_bFinished)
{
BOOL bEat;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_CHAR)
{
if (msg.wParam == VK_ESCAPE)
{
m_bFinished = TRUE;
continue;
}
}
bEat = FALSE;
if (msg.message >= WM_MOUSEFIRST &&
msg.message <= WM_MOUSELAST)
{
RECT rectMe;
pcMe->GetWindowRect(&rectMe);
if (!::PtInRect(&rectMe, msg.pt))
bEat = TRUE;
}
if (!bEat)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
這是什麼做有效的是「吃」是的窗口傳遞到應用程序的所有消息的客戶區以外的任何鼠標消息。它不禁止在應用程序外單擊,只需單擊不在「模式」窗口的客戶區內的應用程序內的任何地方。如果您在消息中添加MessageBeep(),則會獲得與實際模式對話框完全相同的行爲。
m_bFinished是類的BOOL成員,如果在「對話框」上以及在此代碼片段範圍之外的某些其他條件下訪問了「確定」或「取消」按鈕,它將被設置。
- 1. 使用CreateWindow的創建MDI子窗口
- 2. CreateWindow()[Win32 API]:只有父窗口得到
- 3. Win32窗口無法創建?
- 4. Win32:將lParam傳遞給CreateWindow並跟蹤打開的窗口
- 5. 強制創建一個WPF窗口的本機Win32句柄
- 6. 創建一個最小化的重疊窗口(Win32)
- 7. 的Win32:如何創建一個bordless彈出窗口
- 8. 如何創建一個模態窗口
- 9. c2447錯誤學習創建一個win32窗口
- 10. Win32強制窗口模式在進程
- 11. 在iOS的目標c中創建一個模式窗口
- 12. 如何創建一個帶有jQgrid的模式彈出窗口?
- 13. appcelerator createwindow使整個窗口變黑
- 14. WIN32多個窗口
- 15. 如何在win32窗口中創建一個嵌入式文本輸入框
- 16. 可可:拖放創建問題,一個模式窗口
- 17. Win32和窗口樣式
- 18. 在VC++中通過Win32 API創建窗口(菜單創建)
- 19. 如何在使用win32的窗口中創建窗口焦點偵聽器
- 20. Win32 CreateWindow()error,this is nullptr
- 21. 如何在android中創建彈出窗口模式窗口
- 22. @創建模態窗口
- 23. 如何創建一個通用的WPF基礎窗口樣式?
- 24. 使用node.js在Lightbox /模式窗口中創建「編輯」窗體
- 25. 在第二個顯示器Win32 C++創建窗口
- 26. 如何用VC++使用win32 API創建橢圓形窗口
- 27. createwindow(...)後,如何給窗口一個顏色?
- 28. 創建一個新的cocoapods窗口
- 29. 創建一個沒有窗口的NW.js
- 30. 創建一個模態窗口來使用AngularJS加載數據
作爲一個規則,我投票的所有舊新事物的參考。 – Aardvark 2009-04-09 15:38:15
舊的新事物引用是偉大的,但太糟糕了,這是一個鏈接唯一的答案。您可能需要用自己的文字重新翻譯文章中的某些內容。 – jrh 2017-12-28 16:55:35