在 MFC(Microsoft Foundation Classes)中,CDialog 类提供了一个名为 MapDialogRect 的公共方法,该方法用于将对话框客户区矩形坐标映射到屏幕坐标或反之。

以下是 CDialog 类的 MapDialogRect 方法的声明:
void MapDialogRect(LPRECT lpRect) const;

MapDialogRect 方法接受一个指向 RECT 结构的指针 lpRect,该结构包含对话框客户区矩形的坐标。该方法会根据设备的 DPI 缩放系数对矩形进行映射。

以下是一个简单的示例,演示了如何使用 MapDialogRect 方法:
// MyDialog.h
#pragma once

#include "afxwin.h"

class CMyDialog : public CDialog
{
public:
    CMyDialog(CWnd* pParent = nullptr); // 默认构造函数

    // Dialog Data
    #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_MYDIALOG };
    #endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    // Implementation
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedOk();
    afx_msg void OnBnClickedCancel();
    afx_msg void OnGetClientRect();
};

// MyDialog.cpp
#include "stdafx.h"
#include "MyDialog.h"

// CMyDialog 对话框

IMPLEMENT_DYNAMIC(CMyDialog, CDialog)

CMyDialog::CMyDialog(CWnd* pParent /*=nullptr*/)
    : CDialog(IDD_MYDIALOG, pParent)  // 使用对话框模板资源 ID 进行初始化
{
}

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_BN_CLICKED(IDOK, &CMyDialog::OnBnClickedOk)
    ON_BN_CLICKED(IDCANCEL, &CMyDialog::OnBnClickedCancel)
    ON_BN_CLICKED(IDC_BUTTON_GET_CLIENT_RECT, &CMyDialog::OnGetClientRect)
END_MESSAGE_MAP()

void CMyDialog::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    OnOK();
}

void CMyDialog::OnBnClickedCancel()
{
    // TODO: 在此添加控件通知处理程序代码
    OnCancel();
}

void CMyDialog::OnGetClientRect()
{
    // 获取对话框客户区矩形
    CRect rect;
    GetClientRect(&rect);

    // 映射客户区矩形到屏幕坐标
    MapDialogRect(&rect);

    // 显示结果
    CString strRect;
    strRect.Format(_T("Client Rectangle: (%d, %d, %d, %d)"), rect.left, rect.top, rect.right, rect.bottom);
    AfxMessageBox(strRect);
}

在这个示例中,OnGetClientRect 函数使用 GetClientRect 获取对话框的客户区矩形,然后使用 MapDialogRect 方法将客户区矩形映射到屏幕坐标。最后,使用 AfxMessageBox 显示结果。这样,您可以在不同 DPI 设置下正确处理对话框的坐标。


转载请注明出处:http://www.zyzy.cn/article/detail/17323/MFC/CDialog