国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

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

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

更新時間:2022-05-07 文章作者:未知 信息來源:網絡 閱讀次數:

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

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

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

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

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

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

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

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

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

原來,DoModal 并不使用 DialogBox 直接調出對話框,而是通過創建無模式對話框并維護消息循環的方式(RunModalLoop)來模擬模式對話框的效果。(看起來好像有點像DialogBox 的內部作業方式)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。這樣,當我們去掉Visible 屬性后 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 只執行一次,所以如果能截獲第一次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 內部還要調用 GetWindowLong 和 SetWindowPos。到此為止,一個簡單,完滿的解決方法已經展現在大家面前了。

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

        DWORD dwFlags = MLF_SHOWONIDLE;

改成

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


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

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

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        亚洲欧洲日韩av| 精品国产91乱码一区二区三区 | 久久综合色之久久综合| 亚洲一区二区美女| 欧美亚一区二区| 亚洲国产aⅴ天堂久久| 欧美探花视频资源| 亚洲福利一二三区| 精品国产污网站| 成人一区二区三区中文字幕| 国产精品久久久久久久久搜平片| 激情综合网最新| 国产精品伦理在线| 欧美最猛黑人xxxxx猛交| 免费人成黄页网站在线一区二区| 精品成人一区二区三区四区| 国产精品一区二区男女羞羞无遮挡| 中文字幕一区二区三区不卡 | 欧美一区二区免费视频| 国产精品综合一区二区三区| 中文字幕一区二区视频| 日韩欧美一区二区久久婷婷| 成人精品电影在线观看| 天天综合网天天综合色| 国产精品久久看| 日韩av中文字幕一区二区| 欧美成人伊人久久综合网| 成人动漫中文字幕| 日韩高清欧美激情| 国产精品乱码一区二区三区软件 | 一级精品视频在线观看宜春院| 欧美一区二区三区免费大片| 97超碰欧美中文字幕| 国产一区二区三区不卡在线观看 | 精品亚洲成a人| 亚洲摸摸操操av| 国产亚洲精品aa| 91精品国产综合久久福利软件| 99精品视频在线观看| 国产乱人伦偷精品视频不卡| 性做久久久久久| 亚洲免费看黄网站| 国产精品不卡一区二区三区| 久久亚洲影视婷婷| 日韩三级中文字幕| 欧美一区二区三级| 欧美一级黄色大片| 337p亚洲精品色噜噜| 在线观看视频一区二区 | 欧美一区二区高清| 欧洲视频一区二区| 色8久久精品久久久久久蜜| 成人国产亚洲欧美成人综合网| 精品影视av免费| 精品无人区卡一卡二卡三乱码免费卡| 天堂久久久久va久久久久| 亚洲网友自拍偷拍| 一区二区三区产品免费精品久久75| 国产精品毛片大码女人| 国产精品久久免费看| 日韩理论片一区二区| 国产精品久久毛片| 最近日韩中文字幕| 亚洲黄色录像片| 一二三四社区欧美黄| 亚洲成人激情社区| 看片网站欧美日韩| 国产在线精品一区二区夜色| 狠狠色丁香久久婷婷综合丁香| 黄一区二区三区| 国产成人免费在线观看| 99在线热播精品免费| 在线观看一区二区视频| 不卡视频免费播放| 蜜臀久久久久久久| 处破女av一区二区| 色www精品视频在线观看| 欧美人伦禁忌dvd放荡欲情| 欧美日韩mp4| 久久品道一品道久久精品| 国产精品视频一二三| 亚洲男人天堂av| 另类综合日韩欧美亚洲| 成熟亚洲日本毛茸茸凸凹| 色婷婷av一区二区三区之一色屋| 91国产精品成人| 欧美日韩在线播放| 久久新电视剧免费观看| 国产精品欧美一区喷水| 亚洲国产一区视频| 精品中文av资源站在线观看| 国产成人丝袜美腿| 精品视频一区二区不卡| 精品少妇一区二区三区在线视频| 久久久久久久精| 一级精品视频在线观看宜春院 | 欧美一区二区视频观看视频| 2023国产一二三区日本精品2022| 国产欧美视频在线观看| 亚洲精品日韩一| 韩国av一区二区| 欧美综合亚洲图片综合区| 精品久久免费看| 亚洲综合激情另类小说区| 国产精品91一区二区| 欧洲视频一区二区| 欧美精品一区在线观看| 亚洲精品免费播放| 国产一区日韩二区欧美三区| 成人福利在线看| 欧美日韩日本视频| 欧美精品一区二区高清在线观看 | 亚洲视频一区二区在线| 精品国产不卡一区二区三区| 99精品久久只有精品| av激情综合网| 99这里都是精品| 欧美性色欧美a在线播放| 精品蜜桃在线看| 亚洲第一福利一区| 波多野结衣中文一区| 日韩一区二区三区av| 日韩片之四级片| 精品乱码亚洲一区二区不卡| 中文字幕一区二区三| 久久精品国产秦先生| 在线欧美一区二区| 国产日韩欧美综合一区| 免费在线成人网| 欧美日本国产视频| 亚洲精品高清在线观看| 成人国产在线观看| 久久久www免费人成精品| 国产精品综合一区二区三区| 欧美日韩国产综合一区二区三区| 亚洲综合一区二区| av一二三不卡影片| 中文字幕国产一区二区| 久久精品国产网站| 精品免费国产一区二区三区四区| 精品在线一区二区| 欧美一级二级三级蜜桃| 日韩一区欧美二区| 欧美日韩视频一区二区| 亚洲国产精品天堂| 欧美日韩成人综合| 石原莉奈一区二区三区在线观看| 91电影在线观看| 亚洲香肠在线观看| 欧美久久一区二区| 午夜精品久久久久久久99樱桃| 欧美日韩精品福利| 日韩电影在线观看网站| 精品国产伦一区二区三区免费| 免费在线观看视频一区| 日韩精品影音先锋| 成人在线一区二区三区| 亚洲卡通动漫在线| 欧美色网一区二区| 麻豆极品一区二区三区| 久久众筹精品私拍模特| 成人免费的视频| 亚洲日本在线天堂| 欧美性欧美巨大黑白大战| 麻豆精品精品国产自在97香蕉 | 五月天一区二区三区| 欧美日韩成人高清| 国产综合久久久久久久久久久久| 国产欧美精品一区| 在线欧美日韩国产| 精品亚洲aⅴ乱码一区二区三区| 中文av一区二区| 欧美日韩国产123区| 国产精品综合在线视频| 亚洲第一综合色| 国产蜜臀av在线一区二区三区| 欧美日韩一区在线观看| 国产激情一区二区三区四区| 亚洲一区二区偷拍精品| 欧美精品一区二区精品网| 欧美日韩性生活| 高清不卡在线观看av| 日韩精品91亚洲二区在线观看 | 国产一区激情在线| 亚洲成人免费视频| 亚洲国产精品99久久久久久久久| 欧美日韩亚州综合| 91社区在线播放| 国产一区二区视频在线| 亚洲高清免费一级二级三级| 国产无人区一区二区三区| 欧美日韩精品一区二区三区蜜桃| 国产精品日日摸夜夜摸av| 日韩精品中文字幕在线不卡尤物| 欧美性受极品xxxx喷水| 波多野结衣的一区二区三区| 国产毛片精品视频| 麻豆精品一区二区三区| 日韩主播视频在线| 亚洲影视资源网|