• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我用VC寫的一個(gè)可以自動(dòng)改變控件位置和大小的對(duì)話框類。從這個(gè)類繼承的對(duì)話框類,只要在OnInitDialog()里寫幾行簡(jiǎn)單的代碼,對(duì)話框上的控件就會(huì)隨著對(duì)話框大小的改變而改變自己的位置和大小。

             

                    在用VC開發(fā)應(yīng)用程序時(shí),經(jīng)常會(huì)要做一些可以改變大小的對(duì)話框,而這個(gè)時(shí)候就要求對(duì)話框上的控件會(huì)隨著對(duì)話框大小的改變而改變自己的位置和大小。如果控件比較少,那可以在對(duì)話框的OnSize()事件里面添加代碼,通過計(jì)算來調(diào)整各個(gè)控件的位置和大小;但是,如果對(duì)話框上的控件比較多的話,那這將是一件非常痛苦的事情!要是程序中又有很多可以改變大小的對(duì)話框,那一個(gè)一個(gè)的OnSize()寫下來,那會(huì)使程序員崩潰的!
                    為了解決這個(gè)問題,我寫了一個(gè)自動(dòng)改變控件位置和大小的對(duì)話框類ClxDialog。從這個(gè)類繼承的對(duì)話框類,只要在OnInitDialog()里對(duì)控件做一些簡(jiǎn)單的設(shè)置,對(duì)話框上的控件就會(huì)隨著對(duì)話框大小的改變而改變自己的位置和大小。
                    為了保存控件信息,我定義了一個(gè)結(jié)構(gòu):

            typedef struct _dlgControlTag
            {
                int iId;  //  控件ID
                int iFlag;  //  標(biāo)志,表示怎樣改變控件的位置或者大小
                int iPercent;  //  改變值占對(duì)話框改變值的百分比
            } DLGCTLINFO, *PDLGCTLINFO;

                    這里要對(duì)結(jié)構(gòu)中的iFlag和iPercent進(jìn)行一些解釋。其中iFlag是下面的枚舉值:

            enum
            {
                MOVEX = 0,  //  控件在X方向(左右)移動(dòng)
                MOVEY,  //  控件在Y方向(上下)移動(dòng)
                MOVEXY,  //  控件在X方向和Y方向同時(shí)移動(dòng)
                ELASTICX,  //  控件在X方向(寬度)改變大小
                ELASTICY,  //  控件在Y方向改(高度)改變大小
                ELASTICXY  //  控件在X方向和Y方向同時(shí)改變大小
            };

                    iPercent表示改變值占對(duì)話框改變值的百分比。例如,一個(gè)控件的iPercent值為100,iFlag值為MOVEX,那么當(dāng)對(duì)話框的寬度改變100個(gè)單位的時(shí)候,這個(gè)控件就在X方向移動(dòng)100個(gè)單位;又如,一個(gè)控件的iPercent值為100,iFlag值為ELASTICXY,那么當(dāng)對(duì)話框的寬度和高度分別改變100個(gè)單位的時(shí)候,控件的高度和寬度也相應(yīng)的改變100個(gè)單位。
                    下面是設(shè)置控件信息的函數(shù):

            BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);

                    使用起來非常簡(jiǎn)單,在對(duì)話框的OnInitDialog()函數(shù)里面添加類似下面的代碼就行了:

            //  控件信息數(shù)組
            static DLGCTLINFO  dcMenuGroup[] =
            {
                {IDOK, MOVEX, 100},
                {IDCANCEL, MOVEX, 100},
                {IDC_BUTTON1, MOVEX, 50},
                {IDC_BUTTON1, MOVEY, 100},
                {IDC_EDIT1, ELASTICX, 100},
                {IDC_EDIT2, ELASTICX, 50},
                {IDC_EDIT3, ELASTICX, 50},
                {IDC_EDIT3, MOVEX, 50},
                {IDC_EDIT4, ELASTICY, 100},
                {IDC_EDIT5, ELASTICX, 100},
                {IDC_EDIT5, ELASTICY, 50},
                {IDC_EDIT6, ELASTICX, 100},
                {IDC_EDIT6, ELASTICY, 50},
                {IDC_EDIT6, MOVEY, 50},
            };

            //  設(shè)置控件信息
            SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));

                    下面就是使用上面這段代碼的對(duì)話框改變大小前后的效果圖:

             

              

                    對(duì)兩張截圖的比較我們可以很容易的理解上面那段代碼。
                    我還提供了一個(gè)函數(shù):

            void ShowSizeIcon(BOOL bShow = TRUE);

                    來設(shè)置是否顯示對(duì)話框右下角表示可以改變大小的圖標(biāo)。這個(gè)圖標(biāo)是從系統(tǒng)中讀取的,我上面的截圖是Windows2000下的,在WindowsXP中就會(huì)自動(dòng)變成XP風(fēng)格的。
                    好了,閑話不多說了,下面貼出該對(duì)話框類ClxDialog的源代碼,里面有詳細(xì)的注釋:
                    lxDialog.h文件:

            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //      自動(dòng)改變控件位置和大小的對(duì)話框類
            //      文件名:lxDialog.h
            //      作者:StarLee(
            coolstarlee@sohu.com )
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            class ClxDialog : public CDialog
            {
            public:
                ClxDialog(UINT nID, CWnd* pParent = NULL);

                typedef struct _dlgControlTag
                {
                    int iId;
                    int iFlag;
                    int iPercent;
                } DLGCTLINFO, *PDLGCTLINFO;

                enum
                {
                    MOVEX = 0,
                    MOVEY,
                    MOVEXY,
                    ELASTICX,
                    ELASTICY,
                    ELASTICXY
                };

                //  設(shè)置控件信息
                BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);

                //  是否在對(duì)話框右下角顯示表示可改變大小的圖標(biāo)
                void ShowSizeIcon(BOOL bShow = TRUE);

            protected:
                virtual BOOL OnInitDialog();
                afx_msg void OnSize(UINT nType, int cx, int cy);
                afx_msg void OnSizing(UINT nSide, LPRECT lpRect);
                DECLARE_MESSAGE_MAP()

            private:
                int m_iClientWidth;  //  對(duì)話框client區(qū)域的寬度
                int m_iClientHeight;  //  對(duì)話框client區(qū)域的高度
                int m_iMinWidth;  //  對(duì)話框的最小寬度
                int m_iMinHeight;  //  對(duì)話框的最小高度
                PDLGCTLINFO m_pControlArray;  //  控件信息數(shù)組指針
                int m_iControlNumber;  //  設(shè)置控件信息的控件個(gè)數(shù)
                BOOL m_bShowSizeIcon;  //  是否顯示表示可改變大小的圖標(biāo)
                CStatic m_wndSizeIcon;  //  放圖標(biāo)的靜態(tài)控件
                //  保存圖標(biāo)的bitmap
                CBitmap m_bmpSizeIcon;
                BITMAP m_bitmap; 
            };

                    lxDialog.cpp文件:

            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //      自動(dòng)改變控件位置和大小的對(duì)話框類
            //      文件名:lxDialog.cpp
            //      作者:StarLee(
            coolstarlee@sohu.com )
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            #include "stdafx.h"
            #include "lxDialog.h"

            //  表示可改變大小的圖標(biāo)ID
            #ifndef OBM_SIZE
            #define OBM_SIZE 32766
            #endif

            ClxDialog::ClxDialog(UINT nID, CWnd* pParent /*=NULL*/)
                : CDialog(nID, pParent)
                , m_iClientWidth(0)
                , m_iClientHeight(0)
                , m_iMinWidth(0)
                , m_iMinHeight(0)
                , m_pControlArray(NULL)
                , m_iControlNumber(0)
                , m_bShowSizeIcon(TRUE)
            {}

            BEGIN_MESSAGE_MAP(ClxDialog, CDialog)
                ON_WM_SIZE()
                ON_WM_SIZING()
            END_MESSAGE_MAP()

            BOOL ClxDialog::OnInitDialog()
            {
                CDialog::OnInitDialog();

                //  設(shè)置對(duì)話框?yàn)榭勺兇笮〉?br>    ModifyStyle(0, WS_SIZEBOX);

                //  以對(duì)話框的初始大小作為對(duì)話框的寬度和高度的最小值
                CRect rectDlg;
                GetWindowRect(rectDlg);
                m_iMinWidth = rectDlg.Width();
                m_iMinHeight = rectDlg.Height();

                //  得到對(duì)話框client區(qū)域的大小
                CRect rectClient;
                GetClientRect(rectClient);
                m_iClientWidth = rectClient.Width();
                m_iClientHeight = rectClient.Height();

                //  Load圖標(biāo)
                m_bmpSizeIcon.LoadOEMBitmap(OBM_SIZE);
                m_bmpSizeIcon.GetBitmap(&m_bitmap);

                //  創(chuàng)建顯示圖標(biāo)的靜態(tài)控件并放在對(duì)話框右下角
                m_wndSizeIcon.Create(NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight), this, 0);
                m_wndSizeIcon.SetBitmap(m_bmpSizeIcon);
                m_wndSizeIcon.MoveWindow(m_iClientWidth - m_bitmap.bmWidth, m_iClientHeight - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);

                //  顯示圖標(biāo)
                m_wndSizeIcon.ShowWindow(m_bShowSizeIcon);

                return TRUE;
            }

            void ClxDialog::OnSize(UINT nType, int cx, int cy)
            {
                CDialog::OnSize(nType, cx, cy);
             
                //  對(duì)話框?qū)挾群透叨鹊脑隽?nbsp;
                int iIncrementX = cx - m_iClientWidth;
                int iIncrementY = cy - m_iClientHeight;

                //  最小化時(shí)增量為0
                if (nType == SIZE_MINIMIZED)
                {
                    iIncrementX = iIncrementY = 0;
                }

                for (int i = 0; i < m_iControlNumber; i++)
                {
                    CWnd *pWndCtrl = NULL;

                    int iId = m_pControlArray[i].iId;
                    int iFlag = m_pControlArray[i].iFlag;
                    int iPercent = m_pControlArray[i].iPercent;

                    //  無效值
                    if ((iPercent < 0) || (iPercent > 100))
                        continue;

                    //  得到控件指針
                    pWndCtrl = GetDlgItem(iId);
                    if ((NULL != pWndCtrl) && IsWindow(pWndCtrl->GetSafeHwnd()))
                    {
                        CRect rectCtrl;
                        pWndCtrl->GetWindowRect(rectCtrl);

                        ScreenToClient(rectCtrl);

                        int iLeft = rectCtrl.left;
                        int iTop = rectCtrl.top;
                        int iWidth = rectCtrl.Width();
                        int iHeight = rectCtrl.Height();

                        switch (iFlag)
                        {
                        case MOVEX:  //  X方向移動(dòng)
                            iLeft += (iIncrementX * iPercent / 100);
                            break;

                        case MOVEY:  //  Y方向移動(dòng)
                            iTop += (iIncrementY * iPercent / 100);
                            break;

                        case MOVEXY:  //  X方向和Y方向同時(shí)移動(dòng)
                            iLeft += (iIncrementX * iPercent / 100);
                            iTop += (iIncrementY * iPercent / 100);
                            break;

                        case ELASTICX:  //  X方向改變大小
                            iWidth += (iIncrementX * iPercent / 100);
                            break;

                        case ELASTICY:  //  Y方向改變大小
                            iHeight += (iIncrementY * iPercent / 100);
                            break;

                        case ELASTICXY:  //  X方向和Y方向同時(shí)改變大小
                            iWidth += (iIncrementX * iPercent / 100);
                            iHeight += (iIncrementY * iPercent / 100);
                            break;

                        default:
                            ;
                        }

                        //  把控件移動(dòng)到新位置
                        pWndCtrl->MoveWindow(iLeft, iTop, iWidth, iHeight);
                        }
                }

                //  把圖標(biāo)移動(dòng)到對(duì)話框右下角
                if (IsWindow(m_wndSizeIcon.GetSafeHwnd()))
                    m_wndSizeIcon.MoveWindow(cx - m_bitmap.bmWidth, cy - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);

                //  記錄對(duì)話框client區(qū)域的大小
                if (nType != SIZE_MINIMIZED)
                {
                    m_iClientWidth = cx;
                    m_iClientHeight = cy;
                }
            }

            void ClxDialog::OnSizing(UINT nSide, LPRECT lpRect)
            {
                CDialog::OnSizing(nSide, lpRect);

                //  對(duì)話框不能小于初始大小

                int iWidth = lpRect->right - lpRect->left;
                int iHeight = lpRect->bottom - lpRect->top;

                if (iWidth <= m_iMinWidth)
                    lpRect->right = lpRect->left + m_iMinWidth;
              
                if(iHeight <= m_iMinHeight)
                    lpRect->bottom = lpRect->top + m_iMinHeight;
            }

            BOOL ClxDialog::SetControlProperty(PDLGCTLINFO lp, int nElements)
            {
                //  設(shè)置控件數(shù)組信息

                if (NULL == lp)
                    return FALSE;

                if (nElements <= 0)
                    return FALSE;

                m_pControlArray = lp;
                m_iControlNumber = nElements;

                return TRUE;
            }

            void ClxDialog::ShowSizeIcon(BOOL bShow /*=NULL*/)
            {
                m_bShowSizeIcon = bShow;
            }

            Posted on 2007-01-21 14:25 艾凡赫 閱讀(2212) 評(píng)論(0)  編輯 收藏 引用 所屬分類: MFC
            污污内射久久一区二区欧美日韩 | 亚洲国产精品久久久久婷婷软件 | 久久棈精品久久久久久噜噜| 97久久精品国产精品青草| 国产成人精品久久免费动漫 | 精品久久久久久无码不卡| 亚洲?V乱码久久精品蜜桃 | 久久婷婷国产综合精品| 久久精品视频免费| 久久这里有精品| 久久国产精品国产自线拍免费| 久久久精品国产Sm最大网站| 日韩乱码人妻无码中文字幕久久 | 伊人久久大香线蕉综合Av| 情人伊人久久综合亚洲| 久久青青草视频| 国产成人久久久精品二区三区 | 久久综合久久美利坚合众国| 97精品伊人久久大香线蕉app| 一级a性色生活片久久无| 久久se精品一区精品二区国产 | 99久久99久久精品免费看蜜桃 | 99久久夜色精品国产网站| 久久国产免费直播| 99久久国语露脸精品国产| 久久婷婷国产综合精品| 亚洲欧美日韩中文久久| 久久久噜噜噜久久中文字幕色伊伊 | 天天影视色香欲综合久久| 一本大道加勒比久久综合| 中文字幕无码免费久久| 性做久久久久久久久老女人| 国产一区二区精品久久岳| 久久国产精品无码一区二区三区| 久久久久久久久久免免费精品 | 久久ww精品w免费人成| 久久性生大片免费观看性| 久久九色综合九色99伊人| 久久夜色精品国产亚洲| 韩国三级大全久久网站| 91视频国产91久久久|