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

winId() 函数能够返回 当前Widget的HWND句柄,我想通过这个窗口句柄实现额外的操作,比如绘制图像或者将句柄传递给第三方功能库操作。

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


#include 
#include 
 
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下应该也可以的,不知道有没有用,试试看。。



你可能感兴趣的:(Qt)