首页 > 其他分享 >MFC 界面自适应不同分辨率

MFC 界面自适应不同分辨率

时间:2022-08-16 18:36:05浏览次数:88  
标签:控件 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
From: https://www.cnblogs.com/nuistwangyu/p/16592521.html

相关文章

  • MFC绘制无向图
    MFC绘制无向图通过MFC界面实现简单的无向图功能:用鼠标左键点击,按顺序生成一幅无向图,无线图的节点用图标icon显示,节点之间用直线连接,点击到已有的点视为上一个点和已有的......
  • MFC实现Txt01之手写代码实现输入
    不是很想写这个。。。主要是因为这一块内容都是照着孙鑫那本书上的内容写的,没什么特别之处,而且网上很多这些内容,随便百度一下就有,(第五章,文本编程,放个链接,这位写的还不错)(其......
  • MFC画刷绘图(想模仿Microsoft的画图)
    CBrush类,创建画刷对象,通常用于填充一块区域。(此处缺gif,术业有专攻,东西也有专用。。。日后一定补上来,痛哭流涕) 1.创建一个红色画刷绘图:(鼠标左键按下,这个消息响应OnLButto......
  • 1、创建窗口界面,在界面里添加标签
    1、创建一个widget工程2、在系统自动创建的文件widget.h中添加两个标签lab1lab2#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QLabel>classW......
  • 服务器无法登录之迷——login界面无限循环
         本周遇到了一个很奇葩的问题,客户的一台服务器无论如何都无法登录到机器系统里面去。可以肯定的是输入的登录密码是完全正确的,但是输入密码后,总在login登录界面无......
  • SwitchResX Mac(mac屏幕分辨率调整工具)
    mac屏幕分辨率如何调整?switchresxmac版可以为您提供控制显示器分辨率所需的工具和功能。您可以管理从MacBookRetina显示器和CinemaDisplays到电视机和投影仪的任何分辨......
  • 【转载】Qt6.2 界面设计器无法输入中文解决办法
    参考【Qt】Qt资源应用--菜单图标iconfont-阿里巴巴矢量图标库环境环境版本windows10QT6.2.4QtCreator8.0.1(Community)qmake解决办法......