vs2017Android设计窗口布局,vs2017VC++_MFC_窗口控件随窗口大小自适应-最大化与还原...

vs2017VC++_MFC_窗口控件随窗口大小自适应-最大化与还原

vs2017VC++_MFC_窗口控件随窗口大小自适应-最大化与还原

vs2017VC++_MFC_窗口控件随窗口大小自适应-最大化与还原

1、首先在OnInitDialog函数中获取窗口位置坐标

BOOL CMFCApplication1Dlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != nullptr)

{

BOOL bNameValid;

CString strAboutMenu;

bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动

// 执行此操作

SetIcon(m_hIcon, TRUE);// 设置大图标

SetIcon(m_hIcon, FALSE);// 设置小图标

// TODO: 在此添加额外的初始化代码

CRect rect;

GetClientRect(&rect); //取客户区大小

old.x = rect.right - rect.left; //Point old,用于记录窗口原始坐标

old.y = rect.bottom - rect.top;

//ShowWindow(SW_MAXIMIZE);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE

}

2、在窗口变化Onsize函数中进行位置重置(CTRL+SHIFT+X)

5cf3e437852c9e0161b2b7a0a4422e6e.png

void CMFCApplication1Dlg::OnSize(UINT nType, int cx, int cy)

{

CDialogEx::OnSize(nType, cx, cy);

if (nType != SIZE_MINIMIZED)

ReSize();

// TODO: 在此处添加消息处理程序代码

}

3、ReSize函数对所有控件进行布局

void CMFCApplication1Dlg::ReSize()

{

// TODO: 在此处添加实现代码.

float FirstPos[2];

POINT Newp; //获取现在对话框的大小

CRect recta;

GetClientRect(&recta); //取客户区大小

Newp.x = recta.right - recta.left;

Newp.y = recta.bottom - recta.top;

FirstPos[0] = (float)Newp.x / old.x;

FirstPos[1] = (float)Newp.y / old.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*FirstPos[0]);

TLPoint.y = long(OldTLPoint.y*FirstPos[1]);

OldBRPoint = Rect.BottomRight();

BRPoint.x = long(OldBRPoint.x *FirstPos[0]);

BRPoint.y = long(OldBRPoint.y *FirstPos[1]);

Rect.SetRect(TLPoint, BRPoint);

GetDlgItem(woc)->MoveWindow(Rect, TRUE);

hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);

}

old = Newp;

}

头文件相关信息:

class CMFCApplication1Dlg : public CDialogEx

{

// 构造

public:

CMFCApplication1Dlg(CWnd* pParent = nullptr);// 标准构造函数

// 对话框数据

#ifdef AFX_DESIGN_TIME

enum { IDD = IDD_MFCAPPLICATION1_DIALOG };

#endif

protected:

virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持

// 实现

protected:

HICON m_hIcon;

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnBnClickedOk();

afx_msg void OnSize(UINT nType, int cx, int cy);

void ReSize();//txwtech

POINT old;//txwtech

CRect m_DlgRect; //txwtech

void repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height);

afx_msg void OnBnClickedButton2();

};

vs2017VC++_MFC_窗口控件随窗口大小自适应-最大化与还原相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值