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

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>
            久久综合九色综合久99| 亚洲国产精品99久久久久久久久| 欧美成人国产一区二区| 亚洲电影免费观看高清完整版| 快射av在线播放一区| 亚洲日本成人在线观看| 欧美精品久久久久久| 午夜亚洲视频| 久久久国产成人精品| 99国产一区二区三精品乱码| 亚洲视频在线观看视频| 国内精品久久久久影院 日本资源| 女仆av观看一区| 欧美天堂在线观看| 国产亚洲欧美色| 亚洲国产精品女人久久久| 国产精品麻豆欧美日韩ww| 欧美二区在线播放| 国产香蕉97碰碰久久人人| 亚洲精品一二| 国产精品尤物福利片在线观看| 久久久久久久国产| 欧美顶级艳妇交换群宴| 亚洲免费在线看| 欧美国产在线电影| 欧美中文字幕在线| 欧美激情aaaa| 麻豆精品在线视频| 国产精品久久久久久久app| 欧美成人一品| 国产午夜精品久久久久久免费视| 亚洲国产成人av在线| 国产精品亚洲аv天堂网| 亚洲国产精品精华液网站| 国产午夜精品全部视频在线播放 | 久久婷婷av| 先锋影音一区二区三区| 欧美一区二区在线免费观看 | 中文欧美日韩| 麻豆成人91精品二区三区| 欧美影院一区| 欧美视频免费在线观看| 亚洲福利在线视频| 在线国产亚洲欧美| 欧美一区二区三区免费视频| 亚洲一级片在线观看| 欧美激情一区二区三区在线视频观看 | 亚洲精品一区二区三区福利| 久久福利电影| 欧美在线二区| 国产精品美女| 亚洲午夜三级在线| 亚洲男人影院| 国产精品白丝jk黑袜喷水| 亚洲免费av网站| 亚洲免费久久| 欧美精品一区二区视频 | 国产精品一区二区三区久久| 一区二区免费在线播放| 中国女人久久久| 欧美日韩精品一区二区| 亚洲久久一区| 亚洲网友自拍| 国产精品久久婷婷六月丁香| 亚洲欧美一区二区三区久久| 欧美日韩亚洲综合一区| 亚洲另类自拍| 亚洲在线播放电影| 国产精品日日摸夜夜添夜夜av | 欧美国产一区二区三区激情无套| 亚洲国产精品久久久久久女王| 亚洲精品视频在线看| 欧美日韩国产综合新一区| 9l国产精品久久久久麻豆| 亚洲欧美大片| 黄色在线成人| 欧美黄污视频| 亚洲欧美视频在线| 欧美高潮视频| 亚洲永久字幕| 影音先锋久久| 国产精品v日韩精品v欧美精品网站| 亚洲伊人一本大道中文字幕| 久久综合久久久久88| 一本色道久久加勒比88综合| 国产精品永久免费在线| 你懂的一区二区| 亚洲欧美另类在线观看| 夜夜嗨av一区二区三区中文字幕| 久久精品二区亚洲w码| 亚洲免费观看高清完整版在线观看熊| 免费视频一区| 亚洲在线电影| 欧美激情中文字幕乱码免费| 亚洲一区日韩| **性色生活片久久毛片| 欧美日韩卡一卡二| 篠田优中文在线播放第一区| 亚洲福利视频二区| 久久精品av麻豆的观看方式| 亚洲精品之草原avav久久| 国产精品家教| 欧美成人激情在线| 中日韩美女免费视频网站在线观看| 久久一区视频| 性色一区二区| av不卡在线| 精品999成人| 国产精品久久久久久久久免费樱桃 | 韩国久久久久| 亚洲一区在线播放| 亚洲韩国日本中文字幕| 日韩视频在线播放| 欧美成人午夜77777| 午夜视频在线观看一区| 久久久久久久性| 极品日韩久久| 99国产精品99久久久久久粉嫩| 国产亚洲视频在线| 久久国产一二区| 久久久久久久网| 欧美在线首页| 亚洲国产美女精品久久久久∴| 欧美成人69av| 免费亚洲电影在线| 亚洲一区二区高清| 美女国内精品自产拍在线播放| 国产美女精品在线| 欧美日韩免费在线观看| 亚洲欧美另类久久久精品2019| 久久久午夜视频| 久久不射网站| 欧美国产免费| 老司机久久99久久精品播放免费| 日韩天堂在线观看| 欧美大色视频| 久久大综合网| 99国产精品99久久久久久| 99re6热只有精品免费观看 | 欧美精品 国产精品| 亚洲欧美综合网| 亚洲欧美国产精品桃花| 亚洲激情婷婷| 美国三级日本三级久久99| 一区二区免费在线观看| avtt综合网| 国内不卡一区二区三区| 欧美视频在线免费| 欧美日韩理论| 欧美大片va欧美在线播放| 欧美一区二区三区四区视频| 日韩一区二区精品| 你懂的亚洲视频| 国产一区二区三区久久| 欧美日韩中文| 亚洲人成在线免费观看| 久久亚洲视频| 午夜精品在线看| 久久久精品动漫| 欧美亚洲专区| 亚洲欧美日本国产专区一区| 久久电影一区| 午夜影视日本亚洲欧洲精品| 亚洲精品社区| 亚洲欧美视频在线观看| 国产精品99久久不卡二区 | 免费观看成人| 亚洲经典在线| 亚洲视频在线观看免费| 亚洲国产免费看| 欧美日韩国产va另类| 免费久久99精品国产自在现线| 久久精品国产99国产精品| 亚洲欧美日韩在线| 亚洲女优在线| 久久久av水蜜桃| 最新国产精品拍自在线播放| 欧美va天堂在线| 欧美日韩大片| 欧美欧美在线| 欧美日韩亚洲一区二区三区在线观看 | 亚洲理伦电影| 亚洲精品日韩久久| 小黄鸭视频精品导航| 午夜精品偷拍| 久久精品99国产精品酒店日本| 欧美激情一区二区久久久| 亚洲最新在线视频| av成人动漫| 日韩午夜精品| 国产亚洲精品激情久久| 国产一区二区在线免费观看| 国产在线日韩| 亚洲一区二区在线观看视频| 亚洲一区二区三区777| 亚洲综合不卡| 亚洲欧洲日本在线| 亚洲视频在线免费观看| 亚洲欧洲日本国产| 久久激情五月婷婷|