Dialog的初始显示相关消息流和及子窗口

通常我们调用一个窗口的显示方法:

1.方法一

   CDlgxxx dlg;

   dlg.DoModal(); 

2.方法二

  CDlgxxx *pDlg = new CDlgxxx(this);

  pDlg->Create(IDD_DIALOG_XXX); 
  pDlg->ShowWindow(SW_SHOW); 
  pDlg->RedrawWindow();

 

在这其中,或许希望加一些自己的东西,加一些对界面初始产生影响的东西,这些在哪来加呢?

基于对于消息流得分解,可以知晓:

下面是这几个函数的初始消息流:其中重要的函数 构造函数、OnInitDialog、OnShowWindow、OnPaint都是我们常用继承的.

call 构造函数
call OnMove
call OnInitDialog
call OnWindowPosChanged 0
call OnMove
call OnWindowPosChanged 1
call OnWindowPosChanged 2
call OnShowWindow
call OnNcPaint
call OnWindowPosChanged 3
call OnPaint
call OnWindowPosChanged 4
call OnWindowPosChanged 5
 

0. 一种子窗口方式的相对静止:

首先把子窗口的style属性设置为child

然后在OnShowWindow中绘制子窗口,并设置子窗口的位置,通常使用主窗口的一个static框来确定子窗口位置

  CDlgXXX* pChildWnd = new CDlgXXX(this);

  pChildWnd->create(CDlgXXX::IDD);

  CRect rect;
  m_static.GetWindowRect(rect);
  ScreenToClient(rect);
  pChildWnd->MoveWindow(rect);                          // 把窗口移动到static框所占的范围上
  pChildWnd->ShowWindow(SW_SHOWNA);      // 显示子窗口,并且不影响当前的focus

 

1. 一个绘制非子窗口的技巧:

如果在OnShowWindow之前前绘制了某个非子窗口,会被窗口绘制时覆盖掉,此时可以采用:下面方法 把子窗口提到 上面从而展示出来。(也可采用 先隐藏再展示提到上面来). 在OnNcPaint/OnPaint里面:

pChildWnd->ShowWindow(SW_SHOWNA);

 

2. 一种方法实现非子窗口的相对静止:

在OnWindowPosChanged/OnMove中设置 子窗口相对移动,形如在主窗口的OnMove中添加代码

  CRect rect;
  GetWindowRect(rect);
  pChildWnd->MoveWindow(rect.left + POSION_LEFT, rect.top + POSION_TOP, WIDTH, HEIGHT);

  pChildWnd->ShowWindow(SW_SHOWNA);

 建议优先在OnWindowPosChanged添加,这样父子两个窗口切换时也会触发,避免窗口切换时,内容被遮挡


 

下面的内容为转载内容:消息流,介绍的比较清楚,也推荐去他的博客看看其他文章:

文章来源:http://blog.chinaunix.net/uid-23929779-id-3145659.html

大致顺序是这样的
CDlgTestDlg::CDlgTestDlg
CDlgTestDlg::DoModal
    CDialog::DoModal
CDlgTestDlg::PreSubclassWindow
CDlgTestDlg::OnCreate
CDlgTestDlg::OnSize
CDialog::OnInitDialog
    CWndUpdateData(FALSE)
        CDlgTestDlg::DoDataExchange
              CDlgTestDlg::OnInitDialog
CDlgTestDlg::OnShowWindow
CDlgTestDlg::OnPaint
CDlgTestDlg::OnCtlColor
CDlgTestDlg::PreTranslateMessage
CDlgTestDlg::OnPaint
用户输入数据...
用户单击OK
CDlgTestDlg::OnOK
    CDialog::OnOK
        CWnd::UpdateData(TRUE)
            CDlgTestDlg::DoDataExchange
CDlgTestDlg::OnCtlColor
CDlgTestDlg::OnDestroy
CDlgTestDlg::PostNcDestroy

 

 

 

 

你可能感兴趣的:(子窗口,cdialog,消息流)