ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC 界面自适应不同分辨率

2022-08-16 18:31:37  阅读:188  来源: 互联网

标签:控件 MFC 界面 对话框 int 分辨率 oldPoint recta Rect


引用:(36条消息) MFC 界面自动调整适应不同分辨率_weixin_42359982的博客-CSDN博客_mfc窗口适应屏幕

首先获取界面对话框的原始尺寸

Rect recta;
GetClientRect(&recta); //取客户区大小
m_oldPoint.x = recta.right - recta.left; //m_oldPoint是成员变量,用于保存上一次的界面尺寸
m_oldPoint.y = recta.bottom - recta.top;

再获取电脑屏幕分辨率,并将对话框在屏幕上作一个合适的位置调整

int screenwidth = GetSystemMetrics(SM_CXFULLSCREEN);//获取屏幕分辨率宽度,不包括任务栏等区域
int screenheight = GetSystemMetrics(SM_CYFULLSCREEN);//获取屏幕分辨率高度,不包括任务栏等区域
CRect rect(screenwidth / 20, screenheight / 20, (screenwidth / 20) * 19, (screenheight / 20) * 19); //设置对话框在屏幕上显示的位置
CWnd * pWnd = AfxGetMainWnd();
pWnd->MoveWindow(rect);

由于对话框进行了调整,所以对话框的各个空间都要进行相应的调整:

void CMFCTestDlg::ReSize()
{
    float fsp[2];
    POINT Newp; //现在对话框的大小
    CRect recta;
    GetClientRect(&recta); //取客户区大小
    Newp.x = recta.right - recta.left;
    Newp.y = recta.bottom - recta.top;
    fsp[0] = (float)Newp.x / m_oldPoint.x;
    fsp[1] = (float)Newp.y / m_oldPoint.y;
    CRect Rect;
    int woc;
    CPoint OldTLPoint, TLPoint; //左上角
    CPoint OldBRPoint, BRPoint; //右下角
    HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件
    while (hwndChild)
    {
        woc = ::GetDlgCtrlID(hwndChild);//取得ID
        GetDlgItem(woc)->GetWindowRect(Rect);
        ScreenToClient(Rect);

    OldTLPoint = Rect.TopLeft();
    TLPoint.x = long(OldTLPoint.x * fsp[0]);
    TLPoint.y = long(OldTLPoint.y * fsp[1]);
    OldBRPoint = Rect.BottomRight();
    BRPoint.x = long(OldBRPoint.x * fsp[0]);
    BRPoint.y = long(OldBRPoint.y * fsp[1]);
    Rect.SetRect(TLPoint, BRPoint);

    GetDlgItem(woc)->MoveWindow(Rect, TRUE); //控件自适应
    hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
    }
    m_oldPoint = Newp;
}                

只要对话框调整了,就可以调用ReSize()对控件进行调整

PS:通常光是控件自适应调整是不够的,控件上显示的字体也要自适应调整。可以将下方代码加入到控件自适应后面

char sControlClassName[MAX_PATH] = { 0 };
GetClassNameA(hwndChild, sControlClassName, MAX_PATH);
if (strcmp(sControlClassName, "Static") == 0 ||
strcmp(sControlClassName, "Button") == 0)
{
    CString sText;
    int iFontSize; //常用分辨率下,比较合适的字体大小
    GetDlgItem(woc)->GetWindowText(sText);
    int iLength = sText.GetLength();

    int height = Rect.bottom - Rect.top;
    int width = Rect.right - Rect.left;
    CFont* pFont = GetDlgItem(woc)->GetFont();
    LOGFONT lf;
    pFont->GetLogFont(&lf);
    pFont->DeleteObject();
    lf.lfHeight = height * 4 / 5;
    iFontSize = 9;
    if((iLength * iFontSize) > width)
    {
        lf.lfWidth = width / iLength;
    }
    else
    {
        lf.lfWidth = iFontSize;
    }

    m_MainUIFont.CreateFontIndirect(&lf);
    GetDlgItem(woc)->SetFont(&m_MainUIFont);//控件字体自适应
    m_MainUIFont.Detach();
}

最后再说明下CMFCTestDlg.h头文件里定义的几个变量和函数

POINT m_oldPoint;
CFont m_MainUIFont;
void ReSize();

 

标签:控件,MFC,界面,对话框,int,分辨率,oldPoint,recta,Rect
来源: https://www.cnblogs.com/nuistwangyu/p/16592521.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有