PDA

View Full Version : Hai cách ẩn hộp thoại trong MFC


fujisai
08-31-2008, 11:02 AM
Nếu bạn đã và đang phát triển một ứng dụng dialog-based trên nền MFC, rất có thể bạn sẽ gặp vấn đề với việc ẩn hộp thoại chính mỗi khi chạy. Điều này rất quan trọng đối với những chương trình chạy nền, người dùng sẽ tương tác với chương trình thông qua hộp thoại phụ hoặc là biểu tượng trên thanh Taskbar. Tôi cũng đã phải đau đầu với vấn đề một thời gian khi những dòng lệnh như ShowWindow(SW_SHOW); đặt trong hàm OnInitDialog() tỏ ra vô hiệu. Sau khi tìm hiểu, tôi mới phát hiện ra rằng đối với ứng dụng dialog-based, hộp thoại chính được gọi thông qua câu lệnh .DoModal(). Câu lệnh này lại gọi hàm API là DialogBox(), do đó mặc nhiên hộp thoại chính sẽ được hiển thị. Như vậy, cách dễ nhất là chuyển hộp thoại chính về dạng Modeless Box. Cách làm rất đơn giản. Bạn sửa đoạn mã trong hàm InitInstance() thành:
CModelessDlg * pMainDlg;
pMainDlg=new CModelessDlg;
m_pMainWnd=pMainDlg;
pMainDlg->Create(IDD_MODELESS_DIALOG);
pMainDlg->ShowWindow(SW_HIDE);
Chú ý rằng bạn phải thêm hàm PostNcDestroy() vào trong class CModelessDlg và sửa CDialog::PostNcDestroy(); thành delete this;
Và như vậy, chương trình của bạn đã có thể ẩn hộp thoại chính mỗi khi chạy.

Tuy nhiên, cũng có thể bạn vẫn muốn giữ nguyên đặc tính của hộp thoại chính, vậy thì có một cách khác có thể giúp bạn thực hiện điều này. Bạn hãy thêm một biến toàn cục có kiểu là BOOL, tên là bShow chẳng hạn. Trong hàm OnPaint() bạn hãy thêm đoạn mã:

if(!bShow)
ShowWindow(SW_HIDE);
else
ShowWindow(SW_SHOW);
Và thiết lập sao cho mỗi khi chạy, biến bShow sẽ là FALSE nếu bạn muốn ẩn hộp thoại. Còn khi muốn hiện hộp thoại chính, bạn chỉ việc thêm đoạn mã

bShow=TRUE;
Invalidate(TRUE);
Trên đây là hai tìm tòi nhỏ của tôi, rất mong các bạn cho ý kiến


Mai Văn Quân

Vimvq1987@gmail.com (Vimvq1987@yahoo.com)
www.xtremevn.com