【bf88必发唯一官网】qt分界面彰显,通过MFC的DLL的透明窗体转载消息

by admin on 2019年8月29日

qt分界面不出示的案由,qt分界面突显

用qt designer弄了二个qq.ui

新建贰个空项目,把qq.ui加入,新建二个qq类,qq.h如下

#ifndef QQ
#define QQ

#include <QMainWindow>

namespace Ui
{
class qq;
}

class qq:public QMainWindow
{
Q_OBJECT

public:
explicit qq(QWidget *parent = 0);
~qq();

private:
Ui::qq *ui;
};

#endif // QQ

 qq.cpp内容如下

#include “qq.h”
#include “ui_【bf88必发唯一官网】qt分界面彰显,通过MFC的DLL的透明窗体转载消息。qq.h”

qq::qq(QWidget *parent):QMainWindow(parent)
{
ui->setupUi(this);
}

qq::~qq()
{
delete ui;
}

main.cpp如下

#include <QApplication>

#include “qq.h”

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qq *q = new qq;
q->show();
app.exec();
}

结果运营成功,但绝非分界面突显。

 

有道是在qq的构造函数中投入ui(new Ui::qq),实体化ui

事先不这么用也得以成功,也不知晓为何本次特别,今后只怕都加个那些呢

用qt
designer弄了一个qq.ui
新建三个空项目,把qq.ui参预,新建一个qq类,qq.h如下 #ifndef QQ #define
QQ #include Q…

qt编程:windows下的udp通信

qt 给win32 发送信息很轻松,可是要博得windows
信息却十一分复杂,最终想了贰个不是很周详不过也是以明扶桑身本领所能完成的独步天下路线了,基本原理是 利用vc编写三个mfc
的dll ,这么些dll 中开创四个晶莹剔透窗体,利用这么些dll 获取win32 API 音信。

用风尚的QtCreator选用GUI的使用会发生含有如下文件的工程
bf88必发唯一官网 1

 

 

 

本文物博物客链接:,笔者:jdh,转发请评释.

 

上面就大致解析下各部分的功力。

 

源码 已经在vs二〇〇九 vs6.0 qt 4.7 下考查通过

 

环境:

 

.pro文件是供qmake使用的文本,不是本文的要紧【不过事实上也很简短的】,在此非常的少废话。

主机:win7

上面贴出 主要的贯彻源码:

所以呢,还是从main开始,

支付意况:qt

 VC dll- ReceiveMessage.cpp

 

 

 

[cpp] view
plain copy

功能:

#include “stdafx.h”

 

用udp实行收发通讯

#include “resource.h”

  1. #include <QtGui/QApplication>  
  2. #include “mainwindow.h”  
  3. int main(int argc, char *argv[])  
  4. {  
  5. QApplication a(argc, argv);  
  6. MainWindow w;  
  7. w.show();  
  8. return a.exec();  
  9. }  

 

typedef int (*CALLBACKFUNC)(DWORD Type, DWORD position);

 

界面:

CALLBACKFUNC pfnCallback_tmp;

 

bf88必发唯一官网 2

HINSTANCE hInstance;

很简短的标准

 

unsigned long WM_UNITOKEN_NOTIFY =
RegisterWindowMessage(“notify_HuFeng”);

QApplication a(argc,
argv)和a.exec()能够领略为载入了Qt的架构,跑Qt的顺序都要有此部,就相当少说了。

源代码:

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved )

在那之中调用了个MainWindow并把它show了出去,具体解析下

LssHost.pro:

{
 switch(ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
  hInstance = (HINSTANCE)hModule;
  break;
 }
    return TRUE;
}

下边是mainwindow.h中的内容

【bf88必发唯一官网】qt分界面彰显,通过MFC的DLL的透明窗体转载消息。 

HWND m_hWnd = 0;
unsigned long nStep = 0;
unsigned long TotalStep = 0;

 

[cpp] view
plain copy

//INT_PTR __stdcall

[cpp] view
plain copy

 

BOOL CALLBACK DialogProcedure(HWND hWnd, UINT Message, WPARAM wParam,
LPARAM lParam)

 

  1. #————————————————-  
  2. #  
  3. # Project created by QtCreator 2013-09-22T09:36:44  
  4. #  
  5. #————————————————-  
  6.   
  7. QT       += core gui  
  8. QT       += network  
  9.   
  10. TARGET = LssHost  
  11. TEMPLATE = app  
  12.   
  13.   
  14. SOURCES += main.cpp\  
  15.         mainwindow.cpp  
  16.   
  17. HEADERS  += mainwindow.h  
  18.   
  19. FORMS    += mainwindow.ui  

{

  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3. #include <QtGui/QMainWindow>  
  4. namespace Ui  
  5. {  
  6. class MainWindow;  
  7. }  
  8. class MainWindow : public QMainWindow  
  9. {  
  10. Q_OBJECT  
  11. public:  
  12. MainWindow(QWidget *parent = 0);  
  13. ~MainWindow();  
  14. private:  
  15. Ui::MainWindow *ui;  
  16. };  
  17. #endif // MAINWINDOW_H  

mainwindows.h

    switch(Message)

 

 

    case WM_CREATE:{
  break;};
 case WM_COMMAND:
  {
   SendMessage(hWnd, WM_DESTROY, 0, 0);
   break;
  };
 case WM_DESTROY:{ PostQuitMessage(0); break; };
 case WM_INITDIALOG : {   break;};
 default :{
             if(Message==WM_UNITOKEN_NOTIFY)
             {    pfnCallback_tmp(wParam,lParam);  };break;}
 }
 
 return 0;

 

 

}

千帆竞发的namespace
Ui恐怕令人有一些摸不着头脑,那是因为qt把ui相关的类单独独立了出来,但类名同样,禁用namespace分化【可是就当前的利用的话,感觉那样做稍微好,后边小编会解释缘由】

[cpp] view
plain copy

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)

 

 

{

宣称namespace
Ui是因为要调用Ui中的MainWindow,此MainWindow非彼MainWindow,前面涉及的*ui指针会调用它!

  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QtNetwork/QUdpSocket>  
  6.   
  7. namespace Ui {  
  8.     class MainWindow;  
  9. }  
  10.   
  11. class MainWindow : public QMainWindow  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     explicit MainWindow(QWidget *parent = 0);  
  17.     ~MainWindow();  
  18.   
  19. private:  
  20.     Ui::MainWindow *ui;  
  21.   
  22.     QUdpSocket *udp_socket_tx;  
  23.     QUdpSocket *udp_socket_rx;  
  24.     QHostAddress Ip_Tx;  
  25.     int Port_Tx;  
  26.   
  27. private slots:  
  28.     void on_btn_cfg_clicked();  
  29.     void on_btn_tx_clicked();  
  30.     void rx_udp();  
  31. };  
  32.   
  33. #endif // MAINWINDOW_H  

    if (message==WM_DESTROY)
 {
   PostQuitMessage (0) ;
   return 0 ;
 }
 return DefWindowProc (hwnd, message, wParam, lParam) ;

 

mainwindows.cpp:

}

关于Q_OBJECT就背着了,Qt中与signal和slot相关的类都要如此注解下。

 

 

 

 

DWORD __stdcall  ThreadFuction(LPVOID pParam)

有心人看看了组织,析构就没啥了,独有那么个*ui!不过未来一旦运营下,也只会生成个窗体而已。

[cpp] view
plain copy

{

 

 

   MSG Msg;

上边来看构造函数和析构函数,其实也正是mainwindow.c

  1. #include “mainwindow.h”  
  2. #include “ui_mainwindow.h”  
  3.   
  4. MainWindow::MainWindow(QWidget *parent) :  
  5.     QMainWindow(parent),  
  6.     ui(new Ui::MainWindow)  
  7. {     
  8.     ui->setupUi(this);  
  9.   
  10.     udp_socket_tx = new QUdpSocket(this);  
  11.     udp_socket_rx = new QUdpSocket(this);  
  12.   
  13.     ui->btn_tx->setEnabled(false);  
  14. }  
  15.   
  16. MainWindow::~MainWindow()  
  17. {  
  18.     delete ui;  
  19. }   
  20.   
  21. //接收udp数据  
  22. void MainWindow::rx_udp()  
  23. {  
  24.     qDebug() << “rx”;  
  25.   
  26.     while (udp_socket_rx->hasPendingDatagrams())  
  27.     {  
  28.              QByteArray datagram;  
  29.              datagram.resize(udp_socket_rx->pendingDatagramSize());  
  30.   
  31.              QHostAddress sender;  
  32.              quint16 senderPort;  
  33.   
  34.              udp_socket_rx->readDatagram(datagram.data(), datagram.size(),  
  35.                                      &sender, &senderPort);  
  36.   
  37.              ui->txt_rx->append(datagram);  
  38.          }  
  39. }  
  40.   
  41. //发送按钮  
  42. void MainWindow::on_btn_tx_clicked()  
  43. {  
  44.     QByteArray datagram = ui->txt_tx->toPlainText().toAscii();  
  45.     udp_socket_tx->writeDatagram(datagram, datagram.size(), Ip_Tx, Port_Tx);  
  46. }  
  47.   
  48. //配置按键  
  49. void MainWindow::on_btn_cfg_clicked()  
  50. {  
  51.     bool ok;  
  52.     int port_rx = 0;  
  53.   
  54.     //得到发送IP和端口  
  55.     Ip_Tx = QHostAddress(ui->txt_ip->text());  
  56.     Port_Tx = ui->txt_port_tx->text().toInt(&ok);  
  57.     //获得接收端口  
  58.     port_rx = ui->txt_port_rx->text().toInt(&ok);  
  59.     udp_socket_rx->bind(QHostAddress::Any, port_rx);  
  60.   
  61.     //绑定接收时限信号槽  
  62.     connect(udp_socket_rx, SIGNAL(readyRead()),this, SLOT(rx_udp()));  
  63.   
  64.     ui->btn_tx->setEnabled(true);  
  65. }  

   HWND hWnd_HuFeng= CreateDialog(hInstance,
MAKEINTRESOURCE(IDD_DIALOGH),  NULL, DialogProcedure);

 

main.cpp:

bf88必发唯一官网,   int erro = GetLastError();

[cpp] view
plain copy

 

   ShowWindow(hWnd_HuFeng, SW_HIDE);

 

 

   while(GetMessage(&Msg, NULL, 0, 0))
   {
     TranslateMessage(&Msg);
     DispatchMessage(&Msg);
    }
 return 0;

  1. #include “mainwindow.h”  
  2. #include “ui_mainwindow.h”  
  3. MainWindow::MainWindow(QWidget *parent)  
  4. : QMainWindow(parent), ui(new Ui::MainWindow)  
  5. {  
  6. ui->setupUi(this);  
  7. }  
  8. MainWindow::~MainWindow()  
  9. {  
  10. delete ui;  
  11. }  

[cpp] view
plain copy

}

 

 

 

 

  1. #include <QtGui/QApplication>  
  2. #include “mainwindow.h”  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MainWindow w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  

extern “C” void __stdcall ReceiveMessageFun(CALLBACKFUNC pfnCallback)

结构时在堆上new了个Ui域中的MainWindow,并调用setupUi,析构仅仅是将其delete了,依然很粗略!

{

 

   DWORD ThreadID;

正如前方所述Qt很好的把ui分离了出去,前边图中的这几个.ui文件正是让QtDesigner使的布局用文件!

   HANDLE  m_hThread;

 

   pfnCallback_tmp = pfnCallback;
   m_hThread=CreateThread(NULL, 0, ThreadFuction, NULL, 0,
&ThreadID);
   CloseHandle(m_hThread);

今后运作下,会生成ui_mainwindow.h,这几个里面会涉嫌到确实布局用的函数,也正是分外Ui域中的MainWindow.上边具体看一下,

}

 

 

[cpp] view
plain copy

 

 

QT 接收部分

  1. #ifndef UI_MAINWINDOW_H  
  2. #define UI_MAINWINDOW_H  
  3. #include <QtCore/QVariant>  
  4. #include <QtGui/QAction>  
  5. #include <QtGui/QApplication>  
  6. #include <QtGui/QButtonGroup>  
  7. #include <QtGui/QHeaderView>  
  8. #include <QtGui/QMainWindow>  
  9. #include <QtGui/QMenuBar>  
  10. #include <QtGui/QStatusBar>  
  11. #include <QtGui/QToolBar>  
  12. #include <QtGui/QWidget>  
  13. QT_BEGIN_NAMESPACE  
  14. class Ui_MainWindow  
  15. {  
  16. public:  
  17. QMenuBar *menuBar;  
  18. QToolBar *mainToolBar;  
  19. QWidget *centralWidget;  
  20. QStatusBar *statusBar;  
  21. void setupUi(QMainWindow *MainWindow)  
  22. {  
  23. if (MainWindow->objectName().isEmpty())  
  24. MainWindow->setObjectName(QString::fromUtf8(“MainWindow”));  
  25. MainWindow->resize(600, 400);  
  26. menuBar = new QMenuBar(MainWindow);  
  27. menuBar->setObjectName(QString::fromUtf8(“menuBar”));  
  28. MainWindow->setMenuBar(menuBar);  
  29. mainToolBar = new QToolBar(MainWindow);  
  30. mainToolBar->setObjectName(QString::fromUtf8(“mainToolBar”));  
  31. MainWindow->addToolBar(mainToolBar);  
  32. centralWidget = new QWidget(MainWindow);  
  33. centralWidget->setObjectName(QString::fromUtf8(“centralWidget”));  
  34. MainWindow->setCentralWidget(centralWidget);  
  35. statusBar = new QStatusBar(MainWindow);  
  36. statusBar->setObjectName(QString::fromUtf8(“statusBar”));  
  37. MainWindow->setStatusBar(statusBar);  
  38. retranslateUi(MainWindow);  
  39. QMetaObject::connectSlotsByName(MainWindow);  
  40. } // setupUi  
  41. void retranslateUi(QMainWindow *MainWindow)  
  42. {  
  43. MainWindow->setWindowTitle(QApplication::translate(“MainWindow”, “MainWindow”, 0, QApplication::UnicodeUTF8));  
  44. Q_UNUSED(MainWindow);  
  45. } // retranslateUi  
  46. };  
  47. namespace Ui {  
  48. class MainWindow: public Ui_MainWindow {};  
  49. } // namespace Ui  
  50. QT_END_NAMESPACE  
  51. #endif // UI_MAINWINDOW_H  

头文件.h

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

吼吼,一下子多了非常多,但实则依然很轻松的。Ui_MainWindow注脚了多少个部件,具体小编就隐瞒了,因为也没啥可说的,它达成了setupUi函式,也正是前方那八个MainWindow中调用的setupUi。

#include <QMainWindow>
#include “windows.h”
#include “qthread.h”
namespace Ui {
    class MainWindow;
}

不过要证实的是QMetaObject::connectSlotsByName函式会自动连接相应名称的功率信号与槽,但要注意它总是的是流传的MainWindow及其子构件【不是子类】,注意前面ui->setupUi(this)中传唱的this,也正是非ui域中的MainWindow,所以一旦要表明signal和slot时依旧要在非ui域的MainWindow中来声称,然后经过ui->xxx的方式来与GUI发生互动!假若大家在QtDesiner中拖放二个开关然后点击go
to slot就很轻便印证那点。

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

retranslateUi则会为ui中的构件命名,具体也不在此多说。

protected:
    void changeEvent(QEvent *e);

最后还是看看这段代码

private:
    Ui::MainWindow *ui;
};

[cpp] view
plain copy

class MyThread : public QThread
{
public:
    void run();
    void foo();
};

 

#endif // MAINWINDOW_H

  1. namespace Ui {  
  2.   
  3. class MainWindow: public Ui_MainWindow {};  
  4.   
  5. } // namespace Ui  

QT 接收部分

 

receive.cpp

前面非Ui域中的MainWindow的*ui指向的是Ui域中的MainWindow,而Ui域中的MainWindow出了连续了Ui_MainWindow之外,内部四壁疏落!【有一些绕口了】

 

**来张图纸,再复习下

#include <QtGui/QApplication>
#include “mainwindow.h”

**bf88必发唯一官网 3

#include <QtCore/qobject.h>

 

#include <limits.h>
#include “QLibrary”
typedef int (* CALLBACKFUNC)(unsigned long Type, unsigned long
position);
//extern “C” void __stdcall ReceiveMessageFun(CALLBACKFUNC
pfnCallback);
CALLBACKFUNC pfnCallback;

末尾要验证的有两点,个人感到是QtCreator的BUG,

int outputMsg(unsigned long Type, unsigned long position)
{
        qDebug(“Received Message”);
        return 0;
}

以此是只要本人定制控件,并且想在存放的designer中载入,win下用mingw是不可行的,因为sdk套件中的designer是用微软的编写翻译器编写翻译的,当然也许有个比较便利的消除的措施,正是把qtcreator的源码下来,用现存的creator再编写翻译二次,然后覆盖过去就行了。

int main(int argc, char *argv[])
{
    int m;
    QApplication a(argc, argv);
   //MainWindow w;
      // outputMsg(12,34);
    MyThread aa;
    // aa.start();
    aa.run();
   // w.show();
    return a.exec();
}

其二也是前方提到的,多少个同名的MainWindow仅用Ui域来分别,即便感到那样做从准备上来说是比较美的,但调节和测量检验时却会有稍许的标题,总来说之在creator中调理无法识别正确的域,具体见下图例

 

bf88必发唯一官网 4
 

void MyThread::run()
{
     QLibrary myLib(“../ReceiveMessage”);
     if(myLib.load())
       {
        qDebug(“link lib success”);}

像上边那张图this实际上应该本着的是Ui域中的MainWindow【this其实指向的是MainWindow,它并不知是哪个域的MainWindow,再往下张开就不当的针对了Ui域】,但调节和测量检验的数据区指向了Ui域中的MainWindow,当然亦非未曾减轻的不二等秘书籍,你能够手工业将Ui域中的MainWindow改下名就足以博得不错的调节和测验消息了,只是那样做稍显麻烦,並且再也运营qmake后大概还要再一次修改。

    else
    {
          qDebug(“link lib failed”);
    }
    pfnCallback = outputMsg;
    typedef void(*ReceiveMessageFun_HF)(CALLBACKFUNC
pfnCallback);//库版本
    ReceiveMessageFun_HF pGetLibraryVerion
=(ReceiveMessageFun_HF)myLib.resolve(“ReceiveMessageFun”);
    pGetLibraryVerion(pfnCallback);
   // sleep(1);
}

 

QT 发送部分 头文件

您前边说的充裕Bug 在QT5的时候好像订正了

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include “windows.h”
#include “stdlib.h”
namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void changeEvent(QEvent *e);
    void _SendNotify(DWORD fuccode,DWORD retcode);
private:
    Ui::MainWindow *ui;
    DWORD a,b;
private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

QT 发送部分

receive.cpp

#include “mainwindow.h”
#include “ui_mainwindow.h”
#include “QFileDialog”
#include “QDebug”
#include “QTextCodec”
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::on_pushButton_clicked()

     a=200;
     b=50;
     MainWindow::_SendNotify(a, b);
}

void MainWindow::_SendNotify(DWORD fuccode, DWORD retcode)
{
    unsigned long
WM_UNITOKEN_NOTIFY=::RegisterWindowMessageW(L”notify_HuFeng”);
    PostMessageW(HWND_BROADCAST, WM_UNITOKEN_NOTIFY, fuccode,
retcode);
}
 

代码不尽完善 只是提供三个思路

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图