Tôi tạo một cửa sổ với CreateWindow()
và hiển thị nó với ShowWindow()
. Nhưng cửa sổ cha mà trên đó được tạo ra sẽ bị vô hiệu hóa cho đến khi người dùng trở về từ cửa sổ này, tức là nó sẽ mô phỏng hộp thoại phương thức.Tạo cửa sổ phương thức win32 với CreateWindow
Trả lời
Bạn cần xem xét ý nghĩa của một cửa sổ phương thức - về cơ bản, cha mẹ của cửa sổ bị tắt. Cách tự động duy nhất để làm điều này (mà tôi biết) là gọi DialogBox()
để tạo một hộp thoại phương thức. Tuy nhiên, vì bạn muốn sử dụng CreateWindow()
, thì tất cả những gì bạn cần làm là tự mình vô hiệu cửa sổ chính. Lý tưởng nhất, nó sẽ là tốt hơn để đi các tuyến đường hộp thoại (kể từ khi hệ điều hành biết chính xác những gì phải được thực hiện để tạo ra một cửa sổ phương thức), nhưng tôi cho rằng tùy chọn này là có nếu bạn phải sử dụng nó.
Modality, part 1: UI-modality vs code-modality giải thích cách thực hiện việc này và lý do bạn có thể không muốn.
Đảm bảo bạn đặt hwndParent
trong CreateWindow
và sử dụng EnableWindow(hwndParent, FALSE)
để tắt cha mẹ sau khi hiển thị cửa sổ bật lên. Sau đó bật phụ huynh với EnableWindow(hwndParent, TRUE)
sau khi cửa sổ bật lên đã bị đóng.
Bạn phải 'EnableWindow (hwndParent, TRUE)' * trước * cửa sổ bật lên bị đóng, xem [Thứ tự đúng để tắt và bật cửa sổ] (http://blogs.msdn.com/b/oldnewthing/archive/2004 /02/27/81155.aspx) –
Bạn cũng có thể chạy "vòng lặp tin nhắn phụ" giúp cửa sổ cha không hoạt động cho đến khi công việc của bạn kết thúc với hộp thoại "phương thức".
Được rồi, tôi chỉ vật lộn với cùng một vấn đề này. Tôi cần một hộp thoại nhanh mà cư xử như nó sẽ nếu tôi sử dụng DialogBox() nhưng tôi không muốn tạo một mẫu cho dự án cụ thể tôi đã sử dụng.
Điều tôi phát hiện ra là nếu bạn vô hiệu hóa cửa sổ cha của hộp thoại, bạn cũng vô hiệu hóa hộp thoại. Và bạn không thể bật hộp thoại đó mà không bật lại hộp thoại chính. Vì vậy, phương pháp đó sẽ không hoạt động.
Tôi cũng phát hiện ra rằng bạn không thể sử dụng SetCapture()/ReleaseCapture() vì sau đó cửa sổ con của hộp thoại sẽ không nhận được tin nhắn.
Tôi đã tìm được giải pháp hoạt động: Sử dụng bơm thông báo cục bộ, được điều khiển bởi PeekMessage() hoặc GetMessage(). Đây là mã làm việc cho tôi:
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);
}
}
}
Điều này có hiệu quả là "ăn" bất kỳ thông điệp chuột nào nằm ngoài vùng ứng dụng của cửa sổ cho tất cả thư được gửi đến ứng dụng đó. Nó không cấm nhấp chuột bên ngoài ứng dụng, chỉ cần nhấp vào bất kỳ nơi nào bên trong ứng dụng không nằm trong vùng máy khách của cửa sổ "phương thức". Nếu bạn thêm một MessageBeep() khi bạn ăn một tin nhắn bạn sẽ nhận được hành vi chính xác giống như một hộp thoại thực sự phương thức.
m_bĐược hoàn thành là thành viên BOOL của lớp và được đặt nếu nút OK hoặc Hủy được truy cập trên "hộp thoại" và trong các điều kiện nhất định nằm ngoài phạm vi đoạn mã tại đây.
- 1. Cách tạo cửa sổ phương thức trong JavaFX 2.1
- 2. Cách tạo nhiều cửa sổ bằng Win32 API
- 3. Cửa sổ Win32 có an toàn không?
- 4. Cửa sổ Win32 Chủ sở hữu so với cửa sổ Phụ huynh?
- 5. Tạo cửa sổ phương thức để tải dữ liệu với AngularJS
- 6. Cách tạo cửa sổ phương thức với mẫu Twig và Twitter-Bootstrap
- 7. Cách tạo cửa sổ hình elip với VC++ bằng cách sử dụng win32 API
- 8. Cách đặt trọng tâm vào cửa sổ phương thức javascript?
- 9. mở cửa sổ phương thức từ iframe vào phụ huynh
- 10. Javascript Giống như cửa sổ phương thức cho WinForms
- 11. Gọi phương thức Win32 API từ Java
- 12. Win32: Mang theo một cửa sổ để đầu
- 13. Window.open dưới dạng cửa sổ bật lên phương thức?
- 14. Bootstrap.js - cách tự động hiển thị cửa sổ phương thức?
- 15. ShowDialog() không làm cho cửa sổ phương thức
- 16. Cửa sổ phương thức Bootstrap bị mờ đi
- 17. Gọi hàm javascript từ cửa sổ phương thức trong vb.net
- 18. Cách đặt cửa sổ Win32 làm chủ sở hữu cửa sổ WPF?
- 19. Cách đóng một phương thức bằng cách nhấp vào bên ngoài cửa sổ phương thức?
- 20. Tạo một hộp thoại hoặc cửa sổ phương thức trong Cocoa Objective-c?
- 21. Win32 lập trình ẩn giao diện điều khiển cửa sổ
- 22. Tạo sự kiện lịch fullCalendar để gửi biểu mẫu trong cửa sổ phương thức bootstrap
- 23. Cửa sổ WPF được tạo trong phương thức Application_Startup là trống
- 24. WIN32, C++: Có thể tạo hiệu ứng động một cửa sổ mà không ẩn nó không?
- 25. C# Tạo cửa sổ - Xác định cửa sổ Parent
- 26. Cửa sổ phương thức WPF bằng cách sử dụng ShowDialog() Chặn tất cả các cửa sổ khác
- 27. bằng FindWindow với nhiều cửa sổ gốc
- 28. Hộp thoại làm cửa sổ chính?
- 29. Làm cách nào để tìm vị trí của cửa sổ điều khiển/cửa sổ Win32 liên quan đến cửa sổ chính?
- 30. Tạo bảng bằng Win32 API
Theo quy tắc, tôi sẽ bỏ phiếu cho tất cả các tài liệu tham khảo Old New Thing. – Aardvark
Tài liệu tham khảo cũ mới là tuyệt vời, nhưng quá tệ, đó là một liên kết chỉ trả lời. Bạn có thể muốn thuật lại một số nội dung từ bài viết theo từ của riêng bạn. – jrh