| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- // #include <QApplication>
- // #include <QDebug>
- // #include <QOpenGLFunctions>
- // #include <QOpenGLTexture>
- // #include <QOpenGLWidget>
- // #include <QScreen>
- // #include <QTimer>
- // #include <QWindow>
- // #include <dwmapi.h>
- // #include <windows.h>
- // #pragma comment(lib, "dwmapi.lib")
- // #pragma comment(lib, "user32.lib")
- // class ThumbnailWidget : public QOpenGLWidget, protected QOpenGLFunctions
- // {
- // Q_OBJECT
- // public:
- // ThumbnailWidget(QWidget *parent = nullptr)
- // : QOpenGLWidget(parent)
- // {
- // setFixedSize(800, 600); // 固定预览区域大小
- // updateTimer = new QTimer(this);
- // connect(updateTimer, &QTimer::timeout, this, &ThumbnailWidget::updateThumbnails);
- // updateTimer->start(200); // 每200ms更新一次
- // }
- // ~ThumbnailWidget()
- // {
- // makeCurrent();
- // for (auto texture : textures) {
- // delete texture;
- // }
- // textures.clear();
- // doneCurrent();
- // }
- // protected:
- // void initializeGL() override
- // {
- // initializeOpenGLFunctions();
- // glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
- // }
- // void resizeGL(int w, int h) override { glViewport(0, 0, w, h); }
- // void paintGL() override
- // {
- // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // glEnable(GL_TEXTURE_2D);
- // glEnable(GL_BLEND);
- // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- // int cols = 4; // 每行4个缩略图
- // int thumbSize = width() / cols; // 保持1:1比例
- // int row = 0, col = 0;
- // for (auto texture : textures) {
- // if (!texture)
- // continue;
- // texture->bind();
- // glBegin(GL_QUADS);
- // int x = col * thumbSize;
- // int y = row * thumbSize;
- // glTexCoord2f(0, 0);
- // glVertex2f(x, y);
- // glTexCoord2f(1, 0);
- // glVertex2f(x + thumbSize, y);
- // glTexCoord2f(1, 1);
- // glVertex2f(x + thumbSize, y + thumbSize);
- // glTexCoord2f(0, 1);
- // glVertex2f(x, y + thumbSize);
- // glEnd();
- // if (++col >= cols) {
- // col = 0;
- // row++;
- // }
- // }
- // }
- // private slots:
- // void updateThumbnails()
- // {
- // // 清理旧纹理
- // makeCurrent();
- // for (auto texture : textures) {
- // delete texture;
- // }
- // textures.clear();
- // // 获取所有窗口
- // EnumWindows(enumWindowsProc, reinterpret_cast<LPARAM>(this));
- // // 添加桌面预览
- // addDesktopThumbnail();
- // update();
- // }
- // private:
- // QTimer *updateTimer;
- // QVector<QOpenGLTexture *> textures;
- // static BOOL CALLBACK enumWindowsProc(HWND hwnd, LPARAM lParam)
- // {
- // if (!IsWindowVisible(hwnd))
- // return TRUE;
- // ThumbnailWidget *widget = reinterpret_cast<ThumbnailWidget *>(lParam);
- // widget->addWindowThumbnail(hwnd);
- // return TRUE;
- // }
- // void addWindowThumbnail(HWND hwnd)
- // {
- // RECT rect;
- // GetClientRect(hwnd, &rect);
- // int width = rect.right - rect.left;
- // int height = rect.bottom - rect.top;
- // if (width == 0 || height == 0)
- // return;
- // // 创建临时纹理
- // QImage image(width, height, QImage::Format_ARGB32);
- // HDC hdcScreen = GetDC(NULL);
- // HDC hdcMem = CreateCompatibleDC(hdcScreen);
- // HBITMAP hbm = CreateCompatibleBitmap(hdcScreen, width, height);
- // SelectObject(hdcMem, hbm);
- // // 打印窗口内容到内存DC
- // PrintWindow(hwnd, hdcMem, PW_CLIENTONLY);
- // // 从HBITMAP获取数据
- // BITMAPINFO bmi = {0};
- // bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- // bmi.bmiHeader.biWidth = width;
- // bmi.bmiHeader.biHeight = -height; // 从上到下
- // bmi.bmiHeader.biPlanes = 1;
- // bmi.bmiHeader.biBitCount = 32;
- // bmi.bmiHeader.biCompression = BI_RGB;
- // GetDIBits(hdcMem, hbm, 0, height, image.bits(), &bmi, DIB_RGB_COLORS);
- // // 创建OpenGL纹理
- // makeCurrent();
- // QOpenGLTexture *texture = new QOpenGLTexture(image.mirrored());
- // texture->setMinificationFilter(QOpenGLTexture::Linear);
- // texture->setMagnificationFilter(QOpenGLTexture::Linear);
- // textures.append(texture);
- // // 清理资源
- // DeleteObject(hbm);
- // DeleteDC(hdcMem);
- // ReleaseDC(NULL, hdcScreen);
- // }
- // void addDesktopThumbnail()
- // {
- // QScreen *screen = QApplication::primaryScreen();
- // QPixmap desktopPix = screen->grabWindow(0);
- // QImage image = desktopPix.toImage();
- // makeCurrent();
- // QOpenGLTexture *texture = new QOpenGLTexture(image);
- // texture->setMinificationFilter(QOpenGLTexture::Linear);
- // texture->setMagnificationFilter(QOpenGLTexture::Linear);
- // textures.prepend(texture); // 桌面放在第一个
- // }
- // };
- // int main(int argc, char *argv[])
- // {
- // QApplication app(argc, argv);
- // ThumbnailWidget widget;
- // widget.setWindowTitle("Window Thumbnail Preview");
- // widget.show();
- // return app.exec();
- // }
- // #include "main_simple.moc"
|