主类:
//要嵌入的窗口
HWND h = FindWindow(TEXT(""), TEXT(""));
if(h == NULL){
QMessageBox::information(this, QString::fromUtf8("信息"), QString::fromUtf8("无法找到窗口"));
return;
}
WId wid = WId(h);
toolMainWindow->setProperty("_q_embedded_native_parent_handle", QVariant(wid));
toolMainWindow->move(10, 0);
toolMainWindow->show();
子类:
toolmainwindow.h
#ifndef TOOLMAINWINDOW_H
#define TOOLMAINWINDOW_H
#include <QMainWindow>
#include <Windows.h>
namespace Ui {
class ToolMainWindow;
}
class ToolMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit ToolMainWindow(QWidget *parent = nullptr);
~ToolMainWindow();
protected:
void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE;
private slots:
void on_checkBoxSwitch_toggled(bool checked);
private:
Ui::ToolMainWindow *ui;
HRGN hRgnOn;
HRGN hRgnOff;
bool bNeedRefreshRgn = true;
qreal scale = 1;
private slots:
void on_ReCreateRgn();
};
#endif // TOOLMAINWINDOW_H
toolmainwindow.cpp
#include "toolmainwindow.h"
#include "ui_toolmainwindow.h"
#include <QTimer>
#include <QWindow>
ToolMainWindow::ToolMainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::ToolMainWindow)
{
ui->setupUi(this);
scale = window()->devicePixelRatioF();
on_ReCreateRgn();
}
ToolMainWindow::~ToolMainWindow()
{
DeleteObject(hRgnOn);
DeleteObject(hRgnOff);
delete ui;
}
void ToolMainWindow::paintEvent(QPaintEvent* event)
{
static volatile qreal ratio = windowHandle()->devicePixelRatio();
static QSize size0(size());
static volatile bool bResize = false;
if (size() != size0) {
if(!bResize){
QTimer::singleShot(10, this, [this](){setFixedSize(size0);});
bResize = true;
}
else{
setFixedSize(size0);
}
}
if (ratio != windowHandle()->devicePixelRatio()) {;
setFixedSize(size0.width(), size0.height() + 1);
ratio = windowHandle()->devicePixelRatio();
}
if(bNeedRefreshRgn){
if(ui->checkBoxSwitch->isChecked()){
HRGN rgnTemp = CreateRectRgn(0, 0, width() * scale, height() * scale);
CombineRgn(rgnTemp, hRgnOn, rgnTemp, RGN_AND);
SetWindowRgn((HWND)winId(), rgnTemp, TRUE);
DeleteObject(rgnTemp);
}
else{
HRGN rgnTemp = CreateRectRgn(0, 0, width() * scale, height() * scale);
CombineRgn(rgnTemp, hRgnOff, rgnTemp, RGN_AND);
SetWindowRgn((HWND)winId(), rgnTemp, TRUE);
DeleteObject(rgnTemp);
}
bNeedRefreshRgn = false;
}
return QMainWindow::paintEvent(event);
}
void ToolMainWindow::on_checkBoxSwitch_toggled(bool checked)
{
bNeedRefreshRgn = true;
ui->widget->setVisible(checked);
}
void ToolMainWindow::on_ReCreateRgn()
{
hRgnOn = CreateRectRgn(0, 0, 0, 0);
hRgnOff = CreateRectRgn(0, 0, 0, 0);
HRGN rgnTemp;
//凸区域
QImage image1(":/images/stand1.png");
for(int y = 0; y < image1.height(); ++y){
int min = image1.width();
int max = -1;
for(int x = 0; x < image1.width(); ++x){
if(image1.pixel(x, y) != 0){
if(min == image1.width())
min = x;
max = x;
}
}
if(max >= min){
rgnTemp = CreateRectRgn((ui->checkBoxSwitch->geometry().left() + min) * scale, y * scale, (ui->checkBoxSwitch->geometry().left() + max + 1) * scale, (y + 1) * scale);
CombineRgn(hRgnOn, hRgnOn, rgnTemp, RGN_OR);
CombineRgn(hRgnOff, hRgnOff, rgnTemp, RGN_OR);
DeleteObject(rgnTemp);
}
}
//凹区域
QImage image2(":/images/stand2.png");
for(int y = 0; y < image2.height(); ++y){
int min = image2.width();
int max = -1;
for(int x = 0; x < image2.width(); ++x){
if(image2.pixel(x, y) != 0){
if(min == image2.width())
min = x;
if(max == x - 1){
++max;
}else{
if(max >= min){
rgnTemp = CreateRectRgn(min * scale, (y + ui->widget->geometry().top()) * scale, (max + 1) * scale, (y + 1 + ui->widget->geometry().top()) * scale);
CombineRgn(hRgnOn, hRgnOn, rgnTemp, RGN_OR);
DeleteObject(rgnTemp);
}
min = x;
max = x;
}
}
}
if(max >= min){
rgnTemp = CreateRectRgn(min * scale, (y + ui->widget->geometry().top()) * scale, (max + 1) * scale, (y + 1 + ui->widget->geometry().top()) * scale);
CombineRgn(hRgnOn, hRgnOn, rgnTemp, RGN_OR);
DeleteObject(rgnTemp);
}
}
}