日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

隐藏对话框

發(fā)布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 隐藏对话框 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對話框在初始化的過程上與SDI、MDI的初始化是不同的,對話框只需要DoModule或者是CreateDialog等等對話框函數(shù)調(diào)用一次便可, ? SDI、MDI則要好幾步才行。這樣看來,對話框在使用方法上面是隱藏了不少細節(jié)的,其中就沒有SDI、MDI所要求的ShowWindow ? (nCmdShow)這一步。因此對話框要想一運行就隱藏,并不是很直接的。有一些方法可以做到這一點,下面我們就來看看幾種方案。?

1.定時器?
最直觀,又是最無奈的一個方法就是使用定時器。既然我們在對話框開始顯示之前不能用ShowWindow(SW_HIDE)將其隱藏,那就給一個時間讓它顯示,完了我們在隱藏它。?

方法:?

1.在OnInitDialog()函數(shù)里設置定時器:(WINDOWS ? API里面響應消息WM_INITDIALOG)?

SetTimer(1, ? 1, ? NULL);?

2.添加處理WM_TIMER的消息處理函數(shù)OnTimer,添加代碼:?

if(nIDEvent ? == ? 1)?

{?

DeleteTimer(1);?

ShowWindow(SW_HIDE);?

}?

這種方法的缺點是顯而易見的,使用定時器,使得程序的穩(wěn)定性似乎打一個折扣;窗口是要先顯示出來的,那么效果就是窗口閃了一下消失。?

2.改變對話框顯示狀況?
在對話框初始化時改變其顯示屬性可以讓它隱藏起來。方法是調(diào)用SetWindowPlacement函數(shù):?


BOOL ? CDialogExDlg::OnInitDialog()?

{?

CDialog::OnInitDialog();?

//DO ? something?


WINDOWPLACEMENT ? wp;?

wp.length=sizeof(WINDOWPLACEMENT);?

wp.flags=WPF_RESTORETOMAXIMIZED;?

wp.showCmd=SW_HIDE;?

SetWindowPlacement(&wp);?

return ? TRUE;?

}?


在需要顯示時(通常是響應熱鍵或者托盤圖標的鼠標消息):?


WINDOWPLACEMENT ? wp;?

wp.length=sizeof(WINDOWPLACEMENT);?

wp.flags=WPF_RESTORETOMAXIMIZED;?

wp.showCmd=SW_SHOW;?

SetWindowPlacement(&wp);?


這樣的效果很不理想:窗口顯示在屏幕的左上角,并且是只有標題欄,要正常顯示,還需加上如下代碼:?

定義一個成員變量CRect ? rect;?

在OnInitDialog()里面:?

GetWindowRect(&rect);?

在需要顯示的地方:?

SetWindowPos(&wndNoTopMost, ? wndRc.left, ? wndRc.top, ? wndRc.right, ? wndRc.bottom, ? SWP_SHOWWINDOW);?

CenterWindow();?

即使這樣,效果還是很差。?

這種方法還有一個弊端是當程序開始運行并且隱藏起來后,原來激活的窗口變成了非激活狀態(tài)了,而當對話框顯示出來后,對話框自身也是非激活狀態(tài)的。?


3.不繪制窗口?
當對話框顯示時將要響應消息WM_PAINT繪制客戶區(qū),相應消息WM_NCPAINT繪制窗口邊框。我們在窗口第一次自繪自身時隱藏窗口,可以收到比較良好的效果。由于窗口是先畫窗口邊框,所以我們僅需處理WM_NCPAINT即可。代碼如下:

添加WM_NCPAINT處理函數(shù)。?

void ? CMyDialog::OnNcPaint()?

{?

static ? int ? i ? = ? 2;?

if(i ? > ? 0)?

{?

i ? --;?

ShowWindow(SW_HIDE);?

}?

else?

CDialog::OnNcPaint();?

}?

這里有個問題:為什么要定義靜態(tài)變量i而且設其值為2呢??

我們只要窗口隱藏第一次,所以定義這個變量可以判斷是否時首次顯示窗口。當程序開始運行時,系統(tǒng)發(fā)送(SendMessage)WM_NCPAINT消息,此時程序的窗口邊框應該被顯示,但是此時我們沒有作任何顯示的操作,而是將窗口隱藏,ShowWindow(SW_HIDE)將把窗口的 ? WS_VISIBLE屬性去掉,繼續(xù)執(zhí)行,程序?qū)z查WS_VISIBLE屬性,如果沒有則顯示窗口,所以又發(fā)送了一個WM_NCPAINT消息。所以我們要處理兩次WM_NCPAINT消息。?

在需要窗口顯示時,調(diào)用ShowWindow(SW_SHOW)即可。?

程序執(zhí)行的結(jié)果是,原來處于激活狀態(tài)的窗口可能會閃動兩下,然后仍然處于激活狀態(tài)。這種處理方式比上面的方式要優(yōu)越得多。?


4.將對話框作為子窗口?
這種方法是采用SDI框架,主窗口始終隱藏,對話框作為主窗口的成員變量,在CMainFrame::OnCreate()里面加入下代碼:?

if(!dlg.Create(IDD_MYDIALOG, ? this))?

{?

return ? –1;?

}?

dlg.ShowWindow(SW_HIDE);?

在要顯示對話框的地方用dlg.ShowWindow(SW_SHOW);即可。注意,主窗口一定要隱藏,否則對話框可能會閃現(xiàn)一下。

隱藏狀態(tài)欄窗口?
上面介紹了幾種檢查對話框的方法,大家如果試過的話可能已經(jīng)注意到系統(tǒng)狀態(tài)欄里在程序啟動時會有程序的圖標閃過,在隱藏對話框的時候這個也是要隱藏的,方法很簡單:?

在OnInitDialog()函數(shù)里面加上ModifyStyleEx(WS_EX_APPWINDOW, ? WS_EX_TOOLWINDOW);即可。在要顯示窗口的地方加上代碼ModifyStyleEx(WS_EX_TOOLWINDOW, ? WS_EX_APPWINDOW);即將窗口的擴展樣式改回來。

總結(jié)

以上是生活随笔為你收集整理的隐藏对话框的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。