一种保持VC对话框布局的简便方法

    技术2022-05-20  50

    在窗口可缩放的VC应用程序中,在缩放时保持窗口的布局很重要。网上有很多复杂的布局控制代码可供参考。有些代码很强大,但如果你的窗口只是个简单的对话框,也许可以试试本文的方法。这个方法够简单。

     别去管那些锚点、对齐之类的词汇了,强大的功能在某种程度上也意味着更多的代码。简单地记住当前的窗口布局,然后按比例缩放这些控件。这样的方法在很多应用中,效果也非常不错。

     本着更简单的精神,我没有定义一个基类来让你继承,也没有类让你使用,甚至没有写一个函数。我写了三个宏!

     

    #define FIX_LAYOUT_DATA int  m_ow, m_oh;  std::map<HWND, CRect> m_OriginLayout;

     

    #define FIX_LAYOUT_INIT { /

        m_OriginLayout.clear();/

        CRect rect;/

        GetClientRect( rect);/

        m_ow = rect.Width();/

        m_oh = rect.Height();/

        HWND item = NULL;/

        RECT r;/

        while( NULL != (item = ::FindWindowEx(GetSafeHwnd(), item, NULL, NULL) ) )/

        {/

           if (!::GetWindowRect(item, &r))/

               continue;/

           ScreenToClient(&r);/

           m_OriginLayout[item] = r;/

        }/

    }

     

    #define FIX_LAYOUT_SIZE {/

        if (m_ow == 0)/

           m_ow = cx;/

        if(m_oh == 0)/

           m_oh = cy;/

        float rw = (float)cx/ m_ow;/

        float rh = (float)cy/ m_oh;/

        HWND item = NULL;/

        CRect r;/

        while( NULL != (item = ::FindWindowEx(GetSafeHwnd(), item, NULL, NULL) ) )/

        {/

           if (m_OriginLayout.find(item) == m_OriginLayout.end())/

               continue;/

           r = m_OriginLayout[item];/

           r.left *= rw;/

           r.right    *= rw;/

           r.top  *= rh;/

           r.bottom*= rh;/

           ::MoveWindow(item, r.left, r.top, r.right - r.left, r.bottom - r.top, true);/

        }/

    }

     

     FIX_LAYOUT_DATA宏,定义保存布局信息的成员变量;

     FIX_LAYOUT_INIT宏,获取窗口中当前的布局信息;

     FIX_LAYOUT_SIZE宏,在窗口大小发生变化时,调整各子窗口的位置和大小。

    使用方法:

     在你的窗口定义类中加入FIX_LAYOUT_DATA宏。

     在窗口的初始化函数中加入FIX_LAYOUT_INIT宏。

     在窗口的ONSIZE响应函数中加入FIX_LAYOUT_SIZE宏。

    说明:如果你的窗口在运行时,有些控件会发生变化,你也可以在变化发生后,重新调用FIX_LAYOUT_INIT宏,这样新的变化就会更新在布局信息数据中。

     够简单吧!如果你有问题,可以先参考下面的常用回答:

     问题1:如果我的窗口中,有的控件不需要缩放怎么办?

     回答:请使用其它更强大的布局控制程序,或者自己写一个。

     问题2:如果的窗口布局不想按比例控制怎么办?

     回答:请参考问题1。

     问题3:按比例缩放会不会很难看?

     回答:大部分时候都不难看。缩放时,窗口中的字体等方面不会有变化,如果你有列表之类的大控件,那么它将会显示更多的内容。

     问题4:我还可以使用VC提供的对话框编辑器么?

     回答:当然可以,完全没问题。

     问题5:我讨厌宏,一点也面向对象,太落后了。。。

     回答:我知道,我理解,我只是想把程序写的简单些!

    作者:苏林

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/Slin000/archive/2010/02/05/5290684.aspx


    最新回复(0)