1. 程式人生 > 實用技巧 >Qt-透明窗體之嵌入桌面內

Qt-透明窗體之嵌入桌面內

.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 the
10 # 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
View Code

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_H
View 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