大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 基于 CDialog 的应用程序一开始便被隐藏的方法

基于 CDialog 的应用程序一开始便被隐藏的方法

时间: 2021-07-31 作者:daque

作家: 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上的第一个大作,蓄意大师能多提珍贵看法。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.