[英]Hiding an MFC dialog box
好吧我正在使用此代碼隱藏基於對話框的MFC應用程序(VC ++)的任務欄圖標。 每當我點擊十字或關閉按鈕時,任務欄圖標和對話框都會隱藏。 但我不能把這一件事弄好。 每當我從標題欄點擊關閉或十字按鈕時,對話框首先閃爍並顯示一種中間對話框,然后隱藏。 這非常煩人。 經過兩天徒勞的努力,我在這里發布我的代碼。 所以伙計們請幫助我。 提前致謝。
void CMyAppDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
CWnd* pWnd;
pWnd = AfxGetMainWnd();
RemoveTaskbarIcon(pWnd);
pWnd->ModifyStyle(WS_VISIBLE, 0);
mVisible = FALSE;
}
BOOL CMyAppDlg::RemoveTaskbarIcon(CWnd* pWnd)
{
LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0);
// Create static invisible window
if (!::IsWindow(mWndInvisible.m_hWnd))
{
if (!mWndInvisible.CreateEx(0, pstrOwnerClass, _T(""),
WS_POPUP,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, 0))
return FALSE;
}
pWnd->SetParent(&mWndInvisible);
return TRUE;
}
如果使用CDialog::DoModal()
顯示對話框,框架將確保顯示對話框。 只有一種方法可以阻止顯示模式對話框:
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_WM_WINDOWPOSCHANGING()
END_MESSAGE_MAP()
BOOL CHiddenDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_visible = FALSE;
return TRUE;
}
void CHiddenDialog::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
if (!m_visible)
lpwndpos->flags &= ~SWP_SHOWWINDOW;
CDialog::OnWindowPosChanging(lpwndpos);
}
我認為Paul DiLascia建議如下。 這僅適用於模態對話框。
可以將以下代碼放在OnInitDialog中以將對話框移出屏幕。 您需要實現一種方法,以便在適當的時候將其移回屏幕上。
CRect DialogRect;
GetWindowRect(&DialogRect);
int DialogWidth = DialogRect.Width();
int DialogHeight = DialogRect.Height();
MoveWindow(0-DialogWidth, 0-DialogHeight, DialogWidth, DialogHeight);
來自l33t的答案看起來不錯,可能更好,但這是另一種選擇。
也許是一個顯而易見的事情,但是當您重新顯示對話框之前進行隱藏時會發生什么? 如果您不直接修改窗口樣式但使用ShowWindow(SW_HIDE),該怎么辦?
最后,您是否嘗試在調用SetParent()和/或將其移出客戶區之前將對話框的窗口樣式切換到WS_CHILD,以便不再顯示窗口(MoveWindow(-1000,-1000)或類似的東西)那)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.