2009-12-04 32 views
5

Tôi cần mở một hộp thoại được khởi tạo từ cùng một lớp hai lần. Khi tôi thử điều nàyMở lại hộp thoại phương thức trong MFC

CdelmeDlg dlg; 
dlg.DoModal(); 
dlg.DoModal(); 

Cuộc gọi thứ hai sẽ mở hộp thoại chỉ trong một giây, sau đó nó sẽ bị đóng. Đặt cược của tôi là có một thông điệp còn sót lại trong hàng đợi tin nhắn, vì vậy tôi đã thêm thông báo này vào giữa các cuộc gọi

MSG msgCur; 
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE)) 
    ; 

Điều này giải quyết được vấn đề, nhưng cảm giác như một việc phải làm sai. Có cách nào để xử lý thông báo còn lại đúng không?

+0

Điều này có vẻ rất lạ bạn đang cố gắng đạt được điều gì? –

+0

Tôi cần giữ ứng dụng của mình chạy mà không có giao diện người dùng và bật hộp thoại này mỗi lần hết giờ. – MMx

+0

Bạn đóng hộp thoại như thế nào? –

Trả lời

1

Đừng gọi EndDialog (IDOK);

Để xử lý các nút ok hoặc hủy được nhấn chỉ thừa hưởng OnOk hoặc OnCancel ... Nếu không EndDialog sẽ được gọi hai lần và bạn sẽ gặp phải sự cố bạn đang nhận được!

0

Nếu bạn muốn ứng dụng của mình chạy ở chế độ nền mà không có giao diện người dùng, tại sao không juz tạm thời ẩn nó? một chức năng đơn giản này-> ShowWindow (SW_HIDE) sẽ thực hiện công việc cho bạn.

tôi nghĩ bạn nên sửa đổi quyết định thiết kế của mình vì có vẻ vô lý đối với ứng dụng hoạt động như những gì bạn muốn.

1

Tôi thực sự nghĩ rằng YeenFei có điểm tốt ở đây.

Đã lâu rồi kể từ khi tôi chơi với MFC (cảm ơn lòng tốt), nhưng từ bộ nhớ, bộ hẹn giờ, có thể hoặc không thể được gọi từ chuỗi giao diện người dùng tùy thuộc vào loại bạn sử dụng. Nếu bộ đếm thời gian đang được nâng lên trên luồng giao diện người dùng chính, thì một hộp thoại phương thức có khả năng sẽ chặn chuỗi chính cho đến khi nó được loại bỏ, sau đó nó sẽ được gọi bởi bộ hẹn giờ tiếp theo. Nếu bộ đếm thời gian được nâng lên trên một chuỗi riêng biệt, thì hộp thoại của bạn sẽ không chặn luồng giao diện người dùng chính vì nó đang được hiển thị trên một chuỗi riêng biệt.

Có vẻ như bạn có thể hiểu được rằng YeenFei đã chỉ ra rằng bạn muốn hiển thị lại hộp thoại của mình mỗi khi bộ hẹn giờ được nâng lên, hãy ẩn nó khi người dùng nhấp vào nút để loại bỏ nó. Bằng cách đó, nếu thời gian được nâng lên một lần nữa, tất cả những gì nó làm là hiển thị lại hộp thoại cho dù nó hiện đang mở hay không.

Có một bài đăng tuyệt vời here (www.eggheadcafe.com) về Đồng hồ thời gian và đồng thời mà bạn có thể thấy thú vị và có thể làm mọi thứ rõ ràng hơn những gì tôi đã thực hiện.

1

Tại sao bạn không thể mã hóa nó như thế này:

CdelmeDlg dlg; 
dlg.DoModal(); 

CdelmeDlg dlg1; 
dlg1.DoModal(); 
0

tôi giải quyết vấn đề bằng cách ẩn hộp thoại thay vì đóng nó và tung ra một thread mà ngủ trước rồi unhide hộp thoại.

0

Có thể là code của bạn có dòng:

m_pMainWnd = &dlg; 

Nếu vậy, so với ứng dụng sau khi cuộc gọi đầu tiên của DoModal() sẽ kết thúc, tất cả các cuộc gọi khác của DoModal() sẽ trả về -1. Từ MSDN:

Thư viện lớp Microsoft Foundation sẽ tự động chấm dứt chuỗi của bạn khi cửa sổ được giới thiệu bởi m_pMainWnd bị đóng. Nếu luồng này là luồng chính cho một ứng dụng, ứng dụng cũng sẽ bị chấm dứt.

Các vấn đề liên quan