4.0 KiB
4.0 KiB
#qt
在Qt中,如果你已经有一个窗口句柄(HWND),但你想要获取该窗口的分辨率(通常指的是窗口的客户区大小,而不是整个窗口包括边框和标题栏的大小),你不能直接从HWND获取所谓的“分辨率”。但是,你可以通过Windows API函数GetClientRect来获取窗口客户区的大小,这可以视为窗口的“分辨率”或内部尺寸。
以下是如何使用Qt和Windows API来实现这一点的步骤:
包含必要的头文件: 你需要包含windows.h头文件来使用Windows API函数。 使用Windows API获取窗口客户区大小: 使用GetClientRect函数来获取HWND对应的窗口客户区大小。 在Qt中使用这些信息: 将获取到的大小转换为Qt可以使用的尺寸(QSize)。
下面是一个简单的示例代码:
#include <QWidget>
#include <QDebug>
#include <windows.h>
// 假设你有一个HWND句柄,这里用hwnd表示
void getWindowSizeFromHWND(HWND hwnd) {
RECT rect;
if (GetClientRect(hwnd, &rect)) {
// rect现在包含了窗口客户区的左上角和右下角的坐标
// 转换为Qt的QSize
QSize size(rect.right - rect.left, rect.bottom - rect.top);
qDebug() << "Window size:" << size;
} else {
// 处理错误
qDebug() << "Failed to get window size";
}
}
// 在你的Qt代码中,你可以像这样调用这个函数 // 例如,如果你有一个QAxWidget的实例,并且你想要获取其HWND的大小 // QAxWidget* axWidget = ...; // 你的QAxWidget实例 // HWND hwnd = (HWND)axWidget->winId(); // 获取HWND // getWindowSizeFromHWND(hwnd);
注意:在上面的代码中,我使用了QAxWidget的winId()函数来获取HWND。但是,请注意winId()函数可能在窗口未完全创建或未显示时返回无效的句柄。因此,确保在调用winId()之前窗口已经被正确创建和显示。
获取主窗体句柄
bool Core::initHWND()
{
if(!s_hwnd){
s_hwnd = GetProcessMainWnd();
qInfo() << "Core.initHWND.hwnd.title:" << getWindowTitle(s_hwnd);
if(!s_oldWndProc){
s_oldWndProc = reinterpret_cast<WNDPROC>(SetWindowLongPtr(s_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(CustomWndProc)));
}
qInfo() << "Core.initHWND: init hwnd success";
}
return s_hwnd != nullptr;
}
获取分辨率,参考逻辑:
void Core::initGeometry()
{
RECT rect;
if (GetClientRect(s_hwnd, &rect)) {
QSize hwnd_size(rect.right - rect.left, rect.bottom - rect.top);
qInfo() << "分辨率:" << hwnd_size;
int w = hwnd_size.width();
QSize size(1920, 1080);
if(w <= 1280){
m_scale = 0.5;
}else if(w <= 1920){
m_scale = 2.0/3.0;
}
}
}
如果是qt本体,而不是外部句柄,直接使用qApp即可,要对应修改,窗口,按钮,字体等,缩放,参考逻辑
QScreen *primaryScreen = qApp->primaryScreen();
int w = primaryScreen->geometry().width();
int h = primaryScreen->geometry().height();
QSize size(1920, 1080);
if(w <= 1280){
m_scale = 0.5;
}else if(w <= 1920){
m_scale = 2.0/3.0;
}
size *= m_scale;
int x = (w - size.width()) / 2;
int y = (h - size.height()) / 2;
this->move(x, y);
if(m_scale == 1) return;
// 设置窗口尺寸
this->setFixedSize(size);
ui->widget->setFixedHeight(ui->widget->height()*m_scale); // 标题栏
ui->widget_3->setFixedSize(ui->widget_3->size()*m_scale); // logo图标
// 标题名称
ui->label->setStyleSheet(ui->label->styleSheet().replace("14px", QString("%1px").arg(int(14*m_scale)))
.replace("21px", QString("%1px").arg(int(21*m_scale))));
QSize buttonSize = ui->pushButton->size()*m_scale;
替换单个字体 大小 逻辑参考
ui->label_13->setStyleSheet(ui->label_13->styleSheet().replace("36px", QString("%1px").arg(int(36*m_scale))));