网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
基于 CDialog 的应用程序一开始便被隐藏的方法
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

作者: 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_SH

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号