qt获取窗口句柄来显示图片

来源:互联网 发布:盾太脸型数据 编辑:程序博客网 时间:2024/05/23 19:11
winId() 函数能够返回 当前Widget的HWND句柄,我想通过这个窗口句柄实现额外的操作,比如绘制图像或者将句柄传递给第三方功能库操作。

下面的程序是我的Demo程序,我想在QLable上通过HWND句柄绘制一条线,但结果是,线看不到,这是为什么呀?


#include <Windows.h>#include <QLabel> class MyLabel : public QLabel{public:    MyLabel(){}    ~MyLabel(){;}     void paintEvent ( QPaintEvent *e )    {        QLabel::paintEvent(e);         HWND hWnd = (HWND)this->winId();        HDC hDc = GetDC(hWnd);        if (hDc)        {            MoveToEx(hDc, 100, 100, 0);            LineTo(hDc, 200, 200);        }    } }; int main(int argc, char *argv[]){    QApplication app(argc, argv);     MyLabel *pLabel = new MyLabel;    pLabel->resize(600, 480);    pLabel->setText("12345");    pLabel->show();     return app.exec();}



//------------------------------------------------------------------------------

由于需要通过Qt开发摄像头的显示程序,该摄像头带了一个数据采集卡,通过DEMO知道需要使用EImage类,里面使用了draw(HDC)的函数,而QT中好像没有直接获取HDC的函数,QLabel类中有一个getDC()获取的HDC好像和MFC中的HDC不一样,用了不管用。所以在网上搜了一下,发现可以这样写:
        HWND hwnd = (HWND)m_label->winId();
        HDC hDC = GetDC(hwnd);
        m_dcImage24->draw(hDC);

        但是试了一下,发现还是不行,大神们,有没有其他的方法?



//------------------------------------------------------------------

调用windows 系统库
HWND nHwnd=FindWindow(NULL,NULL); 

while(nHwnd != NULL) 
{
TCHAR titleText[MAX_PATH] = {0};
::GetWindowText(nHwnd, titleText, MAX_PATH);
char str[MAX_PATH] = {0};
//获取字节长度 
int iLength = WideCharToMultiByte(CP_ACP, 0, titleText, -1, NULL, 0, NULL, NULL); 
//将tchar值赋给_char 
WideCharToMultiByte(CP_ACP, 0, titleText, -1, str, iLength, NULL, NULL); 
if (strlen(str)>0 && strcmp(str, "你的要找的窗口名") == 0)
{
}
}


    HWND AppWnd;
    QString ClassName( "#32770" );
    QString AppName( "IJPAS" );
 
    LPCWSTR App = reinterpret_cast <LPCWSTR>(ClassName.data());
    LPCWSTR AppCaption = reinterpret_cast <LPCWSTR>(AppName.data());
 
    AppWnd= ::FindWindowW( App, AppCaption);
 
    if(!AppWnd)
        QMessageBox::information(this,tr("Warning"),tr("can't get IJPAS Window Handle!"));
}


//----------------------------------------------------------

窗口构造的时候调用: setAccessibleName(strName)

下面是需要查找的地方:
QWidget* GetWidgetPtrByName(QString strWidget)
{
  QWidgetList widgetLst;
  QWidget *pWidget = NULL;
  QString strName;
  widgetLst = qApp->allWidgets();
  for(int i = 0; i < widgetLst.size(); i++)
  {
  pWidget = widgetLst.at(i);
  strName = pWidget->accessibleName();
  if(strName == strWidget)
  {
  break;
  }
  }

  return pWidget;
}

我这个是在linux下面这样做的,windows下应该也可以的,不知道有没有用,试试看。。



原创粉丝点击