青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
?

基于 CDialog 的應用程序一開始便被隱藏的方法

作者: Solomon (lsong@kali.com.cn)

日期: 2001/12/29

相關文章: http://www.csdn.net/develop/article/11/11634.shtm

  要使一個基于 CDialog 的應用程序一開始便被隱藏的方法有好多種。大多數(shù)方法在相關文章(http://www.csdn.net/develop/article/11/11634.shtm)中已經(jīng)提及。本人之所以要寫這篇文章,主要是通過分析MFC 調用模式對話框的方法向大家展示一種簡單,合理,完滿的解決方案。

  首先,用MFC 生成的一個基于對話框的應用程序框架,然后修改對話框資源的Visible屬性使之成為不可見(在屬性頁的MoreStyle中),接著按下F5 來運行這個程序,我們會發(fā)現(xiàn),它并不象我們期望的那樣一開始就被隱藏。而是被顯示了出來。那么為什么會這樣呢?特別是精通SDK的朋友們,會對此百思不得其解。

  其實,MFC框架為了顯示對話框很多工作,它并不簡簡單單地調用 DialogBox 顯示對話框,而是使用了相對復雜的方法。現(xiàn)在,我就來引導大家對此探個究竟。

  在生成的應用程序框架中(名稱為Test),你會看到CTestApp和CTestDlg 兩個類,在 CTestApp 的 InitInstance 方法中有如下語句:

???? CTestDlg dlg;
??? ?m_pMainWnd = &dlg;
??? ?int nResponse = dlg.DoModal();??????? // 此處將創(chuàng)建并顯示對話框

DoModal 是一個虛函數(shù),MFC允許用戶編寫自己的調用對話框方式來替代原來的方式。但是,MS 實在令人失望。如果,你打開 DlgCore.Cpp (MFC Source 目錄下)并復制 DoModal  的代碼到你自己的類中,你會發(fā)現(xiàn)無法編譯成功。原因在于MS在 DoModal 中使用了兩個非輸出函數(shù) AfxHookWindowCreate 和 AfxUnhookWindowCreate。(這兩個函數(shù)的作用超出了本文所討論的范圍,因此不作詳細論述。)由于無法編譯,所以 MS  要求用戶的 DoModal 必須調用 CDialog 的 DoModal 來顯示對話框。這樣,控制隱藏就無法通過重載 DoModal 實現(xiàn)了。那么 MS 在 DoModal 中干了什么呢?下面就是一部分代碼。

int CDialog::DoModal()
{
? ...... 讀入資源,并作一些設置
? if (CreateDlgIndirect(lpDialogTemplate,
??????????? CWnd::FromHandle(hWndParent), hInst))  //創(chuàng)建無模式對話框
??? {
????? if (m_nFlags & WF_CONTINUEMODAL)
????? {
??????? // enter modal loop
??????? DWORD dwFlags = MLF_SHOWONIDLE;  //罪魁禍首就是他
??????? if (GetStyle() & DS_NOIDLEMSG)
????????? dwFlags |= MLF_NOIDLEMSG;
??????? VERIFY(RunModalLoop(dwFlags) == m_nModalResult); //進入消息循環(huán)
????? }

  .......
??? }
? }
? ...... 釋放資源等
}

原來,DoModal 并不使用 DialogBox 直接調出對話框,而是通過創(chuàng)建無模式對話框并維護消息循環(huán)的方式(RunModalLoop)來模擬模式對話框的效果。(看起來好像有點像DialogBox 的內(nèi)部作業(yè)方式)MLF_SHOWONIDLE 是什么?看英文的意思是在Idle 的時候ShowWindow。那么是不是這樣呢?好吧,為了探個究竟,讓我們進入RunModalLoop。RunModalLoop在WinCore.CPP中定義。打開WinCore.CPP 并找到 RunModalLoop, 會看到以下的語句

BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);

條件 dwFlags & MLF_SHOWONIDLE 始終為TRUE。 而 !(GetStyle() & WS_VISIBLE)只有在WS_VISIBLE屬性沒有設置的時候才會為 TRUE。這樣,當我們?nèi)サ鬡isible 屬性后 bShowIdle 就為 TRUE 了。再往下,就會看到以下的調用

??while (bIdle &&
???!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
??{
???ASSERT(ContinueModal());

???// show the dialog when the message queue goes idle
???if (bShowIdle)              // 找到了
???{
????ShowWindow(SW_SHOWNORMAL);
????UpdateWindow();
????bShowIdle = FALSE;  // 指示下一次Idle 時不用顯示對話框了
???}
While 里的條件是消息隊列里再也沒有任何消息了。此時,由于 bShowIdle 為 TRUE ,就會調用 ShowWindow 來顯示對話框。由于 ShowWindow 只執(zhí)行一次,所以如果能截獲第一次WM_SHOWWINDOW消息, 就能控制了隱藏了。

是的。在 CTestDlg 處理 WM_SHOWWINDOW 并添上以下代碼

void CTestDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{

?if( GetStyle() & WS_VISIBLE ) {
??CDialog::OnShowWindow(bShow, nStatus);
?} else {
??long Style = ::GetWindowLong(*this, GWL_STYLE);
??::SetWindowLong(*this, GWL_STYLE, Style | WS_VISIBLE);
??CDialog::OnShowWindow(SW_HIDE, nStatus);
?}
}
再運行一下,哈哈,對話框不見了,連閃都不閃一下。細心的讀者也許會問為什么使用SetWindowLong,而不是 ModifyStyle, 其實是為了加快速度,因為 ModifyStyle 內(nèi)部還要調用 GetWindowLong 和 SetWindowPos。到此為止,一個簡單,完滿的解決方法已經(jīng)展現(xiàn)在大家面前了。

其實,本來 MS 可以做的更好,比如把 GetStyle() 聲明為虛函數(shù),使得我們能返回WS_VISIBLE 來控制 bShowIdle 成為 FALSE, 或者把

??????? DWORD dwFlags = MLF_SHOWONIDLE;

改成

  DWORD dwFlags =? ShowOnIdle();? // 聲明為虛函數(shù)


希望MS能在以后的版本中考慮這個問題。

這是本人在CSDN上的第一個作品,希望大家能多提寶貴意見。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            影音先锋亚洲视频| 欧美二区在线看| 久久综合九色综合欧美就去吻| 亚洲天堂av图片| 亚洲欧美另类久久久精品2019| 亚洲欧美国产毛片在线| 久久成人在线| 欧美成人首页| 亚洲精品乱码久久久久| 亚洲电影免费观看高清完整版| 亚洲国产精品久久久| 日韩视频免费看| 亚洲一线二线三线久久久| 先锋a资源在线看亚洲| 久久婷婷丁香| 国产精品qvod| 在线观看精品一区| 亚洲影院污污.| 你懂的视频欧美| 亚洲无吗在线| 亚洲一级黄色片| 欧美理论电影在线播放| 欧美日本一道本| 国产精品一区二区久激情瑜伽| 黑人操亚洲美女惩罚| 亚洲美女淫视频| 欧美在线观看网址综合| 欧美高清一区二区| 亚洲午夜精品久久| 欧美www视频| 国产亚洲精品福利| 亚洲小说欧美另类婷婷| 欧美激情精品久久久久久变态 | 狠狠色丁香婷婷综合影院 | 欧美在线亚洲在线| 亚洲第一页中文字幕| 亚洲欧美成人网| 欧美区二区三区| 亚洲高清在线观看一区| 欧美在线视频不卡| 夜夜爽夜夜爽精品视频| 欧美成人69av| 在线观看日韩av电影| 久久国产加勒比精品无码| 99re66热这里只有精品3直播| 美女国产精品| 激情伊人五月天久久综合| 午夜在线精品| 亚洲一二三级电影| 欧美午夜精品一区| 亚洲午夜免费福利视频| 亚洲乱码国产乱码精品精可以看 | 国内揄拍国内精品久久| 欧美一区二区久久久| 亚洲色图制服丝袜| 欧美色精品在线视频| 99国产精品久久久| 亚洲精品国产精品久久清纯直播 | 欧美午夜宅男影院在线观看| 99视频+国产日韩欧美| 欧美激情网站在线观看| 老司机一区二区| 亚洲黄色天堂| 亚洲区在线播放| 欧美日韩综合视频网址| 亚洲欧美精品伊人久久| 亚洲视频免费在线观看| 国产精品久久久久久一区二区三区| 一区二区三区免费观看| 一本色道久久综合狠狠躁篇怎么玩 | 欧美日韩成人综合天天影院| 亚洲欧洲精品天堂一级| 欧美高清视频免费观看| 欧美国产日韩xxxxx| 妖精成人www高清在线观看| aa日韩免费精品视频一| 国产精品麻豆欧美日韩ww| 久久精品30| 久久在线视频在线| 亚洲人成毛片在线播放| 99在线观看免费视频精品观看| 国产精品久久国产三级国电话系列| 香蕉av777xxx色综合一区| 香蕉久久精品日日躁夜夜躁| 亚洲国产精品久久久| 一区二区三区国产精品| 激情一区二区三区| 一本久久综合| 在线成人激情黄色| 一本到高清视频免费精品| 国产一区二区三区av电影 | 精品成人一区二区| 亚洲人精品午夜在线观看| 国产九九视频一区二区三区| 免费日韩av电影| 欧美午夜精品伦理| 免费久久99精品国产自在现线| 欧美日韩免费看| 牛牛影视久久网| 国产精品欧美日韩一区| 欧美风情在线观看| 国产麻豆精品在线观看| 最新亚洲电影| 狠狠色综合网站久久久久久久| 亚洲精品欧美| 国产日韩综合一区二区性色av| 亚洲国产91色在线| 国产一区久久| 亚洲一区二区久久| 99综合电影在线视频| 久久成人在线| 欧美一级淫片aaaaaaa视频| 欧美激情综合网| 欧美成人中文字幕| 黄色日韩在线| 性欧美在线看片a免费观看| 亚洲视频网站在线观看| 欧美成人久久| 欧美成人一区在线| 国产婷婷精品| 亚洲在线国产日韩欧美| 亚洲午夜一二三区视频| 欧美母乳在线| 亚洲欧洲精品一区二区| 亚洲国产美国国产综合一区二区| 欧美一区不卡| 亚洲一区二区三区在线视频| 在线视频欧美日韩| 亚洲精品一区在线观看香蕉| 欲色影视综合吧| 午夜精品一区二区三区四区| 一区二区三区欧美成人| 欧美国产日韩二区| 亚洲黄色精品| 亚洲高清一区二| 久久亚洲图片| 免费观看成人网| 亚洲高清在线观看| 麻豆精品国产91久久久久久| 免费久久久一本精品久久区| …久久精品99久久香蕉国产| 久久精品91| 免费成人性网站| 亚洲精品少妇| 欧美性大战久久久久| 午夜日韩在线观看| 免费中文字幕日韩欧美| 亚洲精品国产精品国产自| 欧美日韩精品高清| 亚洲欧美日韩一区二区三区在线观看| 欧美亚洲一区| 在线日韩精品视频| 欧美日韩激情小视频| 午夜精品久久久久久99热软件| 久久偷窥视频| av成人手机在线| 国产女优一区| 欧美成人黑人xx视频免费观看| 99国产精品久久久| 久久久一区二区| 亚洲精品视频一区| 国产精品亚洲综合一区在线观看| 欧美在线三级| 91久久国产自产拍夜夜嗨| 亚洲欧美日韩系列| 在线日本欧美| 国产精品美女主播在线观看纯欲| 久久成人国产精品| 亚洲精品国产视频| 久久国产乱子精品免费女| 亚洲国产中文字幕在线观看| 国产精品毛片一区二区三区 | 亚洲成在人线av| 欧美日韩国产小视频在线观看| 亚洲视频综合在线| 欧美不卡视频| 欧美在线你懂的| av成人毛片| 亚洲第一视频| 国产精品一区二区你懂的| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲午夜精品一区二区| 欧美黄色视屏| 久久久综合网| 亚洲欧美资源在线| 夜夜嗨av一区二区三区网页| 国语自产精品视频在线看| 欧美午夜电影在线| 欧美成人亚洲成人日韩成人| 欧美一区二区视频在线观看2020 | 亚洲女女女同性video| 亚洲国产成人91精品| 亚洲一区国产精品| a4yy欧美一区二区三区| 国内一区二区三区在线视频| 欧美亚洲成人网| 欧美激情国产日韩| 另类酷文…触手系列精品集v1小说| 在线综合欧美| 日韩视频一区二区三区|