Qt-透明窗體之嵌入桌面內
阿新 • • 發佈:2020-12-17
.pro
1 QT += core gui 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 CONFIG += c++11 6 7 # The following define makes your compiler emit warnings if you use 8 # any Qt feature that has been marked deprecated (the exact warnings 9 # depend on your compiler). Please consult the documentation of theView Code10 # deprecated API in order to know how to port your code away from it. 11 DEFINES += QT_DEPRECATED_WARNINGS 12 13 # You can also make your code fail to compile if it uses deprecated APIs. 14 # In order to do so, uncomment the following line. 15 # You can also select to disable deprecated APIs only up to a certain version of Qt.16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 17 18 SOURCES += \ 19 main.cpp \ 20 windowDesktop.cpp 21 22 HEADERS += \ 23 windowDesktop.h 24 25 FORMS += \ 26 mainwindow.ui 27 28 LIBS += -lUser32 29 30 # Default rules for deployment.31 qnx: target.path = /tmp/$${TARGET}/bin 32 else: unix:!android: target.path = /opt/$${TARGET}/bin 33 !isEmpty(target.path): INSTALLS += target 34 35 RESOURCES += \ 36 resource.qrc
main.cpp
1 #include <windows.h> 2 #include <winuser.h> 3 #include <QApplication> 4 #include "windowDesktop.h" 5 6 BOOL enumUserWindowsCB(HWND hwnd,LPARAM lParam) 7 { 8 long wflags = GetWindowLong(hwnd, GWL_STYLE); 9 if(!(wflags & WS_VISIBLE)) return TRUE; 10 11 HWND sndWnd; 12 if( !(sndWnd=FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL)) ) return TRUE; 13 HWND targetWnd; 14 if( !(targetWnd=FindWindowEx(sndWnd, NULL, L"SysListView32", L"FolderView")) ) return TRUE; 15 16 HWND* resultHwnd = (HWND*)lParam; 17 *resultHwnd = targetWnd; 18 return FALSE; 19 } 20 21 HWND findDesktopIconWnd() 22 { 23 HWND resultHwnd = NULL; 24 EnumWindows((WNDENUMPROC)enumUserWindowsCB, (LPARAM)&resultHwnd); 25 return resultHwnd; 26 } 27 28 int main(int argc, char *argv[]) 29 { 30 QApplication a(argc, argv); 31 32 Dialog w; 33 HWND desktopHwnd = findDesktopIconWnd(); 34 if (desktopHwnd) 35 SetParent((HWND)w.winId(), desktopHwnd); 36 w.setFixedSize(QSize(800, 400)); 37 w.show(); 38 return a.exec(); 39 }View Code
windowDesktop.h
1 #ifndef WINDOWDESKTOP_H 2 #define WINDOWDESKTOP_H 3 4 #include "QObject" 5 #include "QDialog" 6 #include "QLineEdit" 7 #include "QPainter" 8 #include "QWidget" 9 #include "QBitmap" 10 11 class Dialog : public QWidget 12 { 13 Q_OBJECT 14 public : 15 Dialog(QWidget *parent = 0); 16 ~Dialog(); 17 18 virtual void paintEvent(QPaintEvent *event); 19 }; 20 21 22 #endif // WINDOWDESKTOP_HView Code
windowDesktop.cpp
1 #include "windowDesktop.h" 2 3 Dialog::Dialog(QWidget *parent) 4 : QWidget(parent) 5 { 6 // 建立個LineEdit用來測試焦點 7 QLineEdit *le = new QLineEdit(this); 8 } 9 10 Dialog::~Dialog() 11 { 12 } 13 14 void Dialog::paintEvent(QPaintEvent *event) 15 { 16 QPainter p(this); 17 p.fillRect(rect(), QColor(0, 0xff, 0, 33)); 18 return; 19 }View Code