通常我们调用一个窗口的显示方法:
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