takeiteasy 发表于 2017-6-1 12:56:46

MFC控件自适应窗口大小类

AutoAdapt.h
#pragma once
class CAutoAdapt
{
public:
        CAutoAdapt(void);
        virtual ~CAutoAdapt(void);

public:
        void ReSize(HWND m_hWnd);
        void InitSize(HWND m_hWnd);
        POINT old;

private:
       
};



AutoAdapt.cpp
#include "stdafx.h"
#include "AutoAdapt.h"
/*
MFC控件自适应窗口大小
使用方法:
在目标类中添加此类成员
在目标初始化函数中调用InitSize函数//这个看自己需求
在WM_SIZE消息处理函数中调用ReSize
*/


CAutoAdapt::CAutoAdapt(void)
{

}


CAutoAdapt::~CAutoAdapt(void)
{

}

//此函数也可以不调用,看自己需求,如果是子窗口 比如tableCtrl中的窗口,调用这个函数 就填满tableCtrl大小
//在初始化函数中添加此函数
void CAutoAdapt::InitSize(HWND m_hWnd)
{
        CRect rect;      
        GetClientRect(m_hWnd,&rect);   //取客户区大小
       
    old.x=rect.right-rect.left;
    old.y=rect.bottom-rect.top;
    int cx = GetSystemMetrics(SM_CXFULLSCREEN);
    int cy = GetSystemMetrics(SM_CYFULLSCREEN);
    CRect rt;
    SystemParametersInfo(SPI_GETWORKAREA,0,&rt,0);
    cy = rt.bottom;
        MoveWindow(m_hWnd,0, 0, cx, cy,TRUE);   
}

//在WM_SIZE消息处理函数中添加这个函数
void CAutoAdapt::ReSize(HWND m_hWnd)
{
        float fsp;
    POINT Newp; //获取现在对话框的大小
    CRect recta;      
        GetClientRect(m_hWnd,&recta);   //取客户区大小   
    Newp.x=recta.right-recta.left;
    Newp.y=recta.bottom-recta.top;
        //获得倍数
    fsp=(float)Newp.x/old.x;
    fsp=(float)Newp.y/old.y;

    CRect Rect;
    int woc;//控件标示
    CPoint OldTLPoint,TLPoint; //左上角
    CPoint OldBRPoint,BRPoint; //右下角

    HWNDhwndChild=::GetWindow(m_hWnd,GW_CHILD);//列出所有控件

    while(hwndChild)      
    {      
      woc=::GetDlgCtrlID(hwndChild);//取得ID
                HWND hCtrl = GetDlgItem(m_hWnd,woc);
                GetWindowRect(hCtrl,&Rect);

                //处理左上角坐标
                POINT point;
                point = Rect.TopLeft();
                ScreenToClient(m_hWnd,&point);
      
                OldTLPoint = point;        
      TLPoint.x = long(OldTLPoint.x*fsp);   
      TLPoint.y = long(OldTLPoint.y*fsp);
               
                //处理右下角坐标
                point = Rect.BottomRight();
                ScreenToClient(m_hWnd,&point);

                OldBRPoint = point;
      BRPoint.x = long(OldBRPoint.x *fsp);   
      BRPoint.y = long(OldBRPoint.y *fsp);

      Rect.SetRect(TLPoint,BRPoint);   
      
                MoveWindow(hCtrl,TLPoint.x,TLPoint.y,BRPoint.x-TLPoint.x,BRPoint.y-TLPoint.y,TRUE);
      hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);      
    }
    old=Newp;
}

页: [1]
查看完整版本: MFC控件自适应窗口大小类