vs2012偷梁换柱法之改变一个没有m_hWnd的active控件窗口大小

来源:互联网 发布:unity3d格式 解包 编辑:程序博客网 时间:2024/06/05 09:48

在插入一个Axtivex控件之后,我们有时会需要改变其大小,有的控件可以轻松是使用GetDlgItem(IDC_XXX)来获取其矩形的面积,但有些可能就会出错,当我在插入Windows media player控件时,就遇到了这种问题,经过仔细探究,其原因请参看:
1、一个没有m_hWnd的active控件窗口如何改变大小?
2、Activex调试以及m_hWnd为空 解决办法
3、ActiveX 控件窗口而不创建直到在 Internet Explorer 中可见
其实可以大概明白原因,给我灵感的是在 一个没有m_hWnd的active控件窗口如何改变大小?中起到的一个范例,最终获得一种不太乎完美但至少可以work的解决方案,下面介绍其:
1、在一个对话框上插入media player 控件,同时插入一个组框(Group Box)IDC_STATIC1,和media player控件一样大小,media player控件完全覆盖组框控件IDC_STATIC1,并将组框控件的visible属性设为FALSE, transparent属性设为TRUE,在Onsize中添加(依照我的工程Test来说,结尾给出其源码链接)如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码

    if (m_Player.GetControlUnknown() == NULLreturn;

    IOleObjectPtr pOleObj(m_Player.GetControlUnknown ());
    if (pOleObj != NULL
    {
        if (m_changed)
        {
            int i = 0;
            for (int index=IDC_OPENBTN; index <= IDC_STATIC1; index++ )
            {
                if (index != IDC_STATIC1)
                    ReSize(NULL, m_rectControls[i++], index);   
                else
                    ReSize(&m_Player, m_rectControls[i++], NULL);
            }
            Invalidate();
        }
    }
}
就可以了,为何要如此添加,这里我们就是用IDC_STATIC大小来去改变media player控件的大小,而不是直接获取media player控件的大小面积,具体情况大家依照其原因及源码自己探究,相信会有更深刻印象,这里不再多说。效果图如下:


源码链接:http://download.csdn.net/detail/johnnyhu90/6312769