c# 開發ActiveX控件,添加事件,QT調用事件


 

c# 開發 ActiveX 的過程參考我的另一篇文章 :  https://www.cnblogs.com/baqifanye/p/10414004.html

本篇講如何 在C# 開發的ActiveX 過程中添加事件,並在QT中調用

 

1.添加一個新的名為 ControlEvents 的接口文件,也可以不添加,,直接添加到主文件中也可,,等下會說明

ControlEvents.cs 文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace gMapActiveX
{

   
    [Guid("AA5830BB-7B00-48C1-88F5-38D1206562AF")]//可自己在vs的guid工具中去生成,只要別和主文件guid相同就可
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ControlEvents
    {
        [DispId(0x00000001)]
        void OnEventLatLng(double  lat, double  lng);//這就是dispid事件,,必須要有,,如果沒有在QT中將無法調用
        // [DispIdAttribute(0x002)]
        //  void OnRecordStopped();
        // [DispIdAttribute(0x003)]
        //void OnRecordVolumeChanged(int value);
    }

}

  

主文件:

namespace gMapActiveX
{
   
    [Guid("378786D4-D4C4-4F08-90CC-C94FCEDA423A")]//主要的guid,,會注冊到注冊表,,系統會靠它去識別activex控件
    [ComVisible(true)]//這個好像可以不要,,在AssemblyInfo.cs 已有設置
    [SecuritySafeCritical]
    [ComSourceInterfaces(typeof(ControlEvents))]  //定義com 事件源的接口 ///ControlEvents 就是我們的事件類
    public partial class UserControl1: UserControl, IObjectSafety
    {
        public delegate void EventLatLng(double lat, double lng);
        public event EventLatLng OnEventLatLng;
        public UserControl1()
        {
            InitializeComponent();
        }

        private void GMapControl_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
               
                PointLatLng point = this.gMapControl.FromLocalToLatLng(e.X, e.Y);
                OnEventLatLng(point.Lat, point.Lng);//觸發事件        
            }
        }
    }
}

 

下面說如何在QT中調用事件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAxWidget>
#include <QTime>
#include <QTimer>
#include <QThread>
#include <QDebug>
#include <QColor>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void slotLatLng(double lat, double lng);
    void slot(const QString &name, int argc, void *argv);

private:
    Ui::MainWindow *ui;
    QAxWidget * axWidget;
};

#endif // MAINWINDOW_H
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QFile>
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   axWidget = new QAxWidget(this); axWidget
->setControl(QString::fromUtf8("{378786D4-D4C4-4F08-90CC-C94FCEDA423A}")); axWidget->resize(620,720); axWidget->show();; //QT官方提供了兩種事件查看方式,都是用connect,但前者是任何事件信號都會觸發,可根據信號名去對應所需要的事件 //后都是把事件當信號使用,非常簡單 QObject::connect(axWidget, SIGNAL(signal(QString, int, void*)), this, SLOT(slot(QString, int, void*))); QObject::connect(axWidget,SIGNAL(OnEventLatLng(double,double)),this,SLOT(slotLatLng(double,double))); } void MainWindow::slotLatLng(double lat, double lng) { ui->textEdit->append(QString::number(lat,'f',10) + "<<" + QString::number(lng,'f',10)); qDebug() <<"Lat:" << QString::number(lat,'f',8) << "Lng" << lng; } void MainWindow::slot(const QString &name, int argc, void *argv) { qDebug() << name << ",,," << argc; //可以看到的值的輸出,說明signal信號也被觸發,具體可以查看手冊 qDebug() << argv; //以下被注釋的是qt官方的代碼,,具體可以查看手冊:QAxBase Class // VARIANTARG *params = (VARIANTARG*)argv; // if (name.startsWith("BeforeNavigate2(")) { // IDispatch *pDisp = params[argc-1].pdispVal; // VARIANTARG URL = *params[argc-2].pvarVal; // VARIANTARG Flags = *params[argc-3].pvarVal; // VARIANTARG TargetFrameName = *params[argc-4].pvarVal; // VARIANTARG PostData = *params[argc-5].pvarVal; // VARIANTARG Headers = *params[argc-6].pvarVal; // bool *Cancel = params[argc-7].pboolVal; // } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM