Russian Qt Forum
Ноябрь 24, 2024, 10:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Встроить QWidget в родную форму Borland Builder ?  (Прочитано 5485 раз)
slvno
Гость
« : Март 30, 2010, 22:56 »

Привет!

Интересует можно ли в форму в созданную в Borland Builder(е) - TForm встроить
QWidget и производные от него классы?

Нужно это чтобы не делать интерфейс в VCL Borland Builder.

Не слишком ли будет это криво.
Записан
niXman
Гость
« Ответ #1 : Март 30, 2010, 23:31 »

Цитировать
чтобы не делать интерфейс в VCL Borland Builder.
нафига тогда вообще использовать ВэЦээЛьную форму, и что-то в нее встраивать? Подмигивающий
Записан
alexman
Гость
« Ответ #2 : Март 30, 2010, 23:37 »

Цитировать
чтобы не делать интерфейс в VCL Borland Builder.
нафига тогда вообще использовать ВэЦээЛьную форму, и что-то в нее встраивать? Подмигивающий
Лепить так лепить Подмигивающий
Записан
slvno
Гость
« Ответ #3 : Март 31, 2010, 09:40 »

Основная программа написана Buildere 10 лет тому назад,
к ней подключаются dll-ки с нужными модулями с интерфейсом.

Нет желания переделывать основную программу.

По этому и возник такой вопрос.
Записан
_govorilka
Гость
« Ответ #4 : Апрель 01, 2010, 06:10 »

Через WId QWidget::winId () const можно получить хендл окна (HWND). Дальше можно поковырять WinAPI... Там есть функции позволяющие заменить одно окно другим.
Еще можно попробовать использовать COM/ActiveX.
« Последнее редактирование: Апрель 01, 2010, 06:13 от _govorilka » Записан
slvno
Гость
« Ответ #5 : Апрель 02, 2010, 21:10 »

Через WId QWidget::winId () const можно получить хендл окна (HWND). Дальше можно поковырять WinAPI... Там есть функции позволяющие заменить одно окно другим...
Спасибо знатоку за совет!

Чегото я наверное делаю не так как требуется (с WinAPI и Builder С++ мало работал до этого)
Вот этот код proc_set_widget(HWND parent_handle) выполняется в бильдере при создании контрола, parent_handle устанавливается равным .Handle контрола из бильдера но Qt - окошко не показывается на бильдеровском контроле,
а исчезает в неизвестном направлении Подмигивающий

Код:

#include "ax1.h"
#include <windows.h>

#include <QApplication>
#include <QTextCodec>
#include <QPushButton>

extern "C" __declspec( dllexport ) HWND proc_set_widget(HWND parent_handle);

QApplication *app = 0;
AXTIV_WIDGET *w = 0;
WNDPROC funcWindowPtr = 0;

extern "C" LRESULT CALLBACK QtWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK NewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

//if (funcWindowPtr)
  //CallWindowProc(funcWindowPtr, hWnd, message, wParam, lParam);
     
    CallWindowProc(QtWndProc, hWnd, message, wParam, lParam);

return 0;
}

//parent_handle == TObject.Handle
AXTIV_WIDGET::AXTIV_WIDGET(HWND parent_handle) :fill_color(Qt::red)
{
     
    extern HINSTANCE appInst;
    extern HINSTANCE appPrevInst;

    appPrevInst = appInst;
    appInst = (HINSTANCE)GetWindowLong(parent_handle, GWL_HINSTANCE);
   
    SetWindowLong(winId(), GWL_HINSTANCE , (LONG)GetWindowLong(parent_handle, GWL_HINSTANCE));
    SetWindowLong(winId(), GWL_HWNDPARENT, (LONG)parent_handle);

    funcWindowPtr = (WNDPROC)GetWindowLong(parent_handle, GWL_WNDPROC);

    SetWindowLong(winId(), GWL_WNDPROC, (LONG)NewWndProc);
    QWidget::create(parent_handle, true, true);

    setFillColor(QColor("Red"));
   
    b = new QPushButton(this);
    b->setGeometry(0,0, 20, 20);
    b->setText(tr("OK"));
    b->show();
    show();
    }


HWND proc_set_widget(HWND parent_handle)
{
 int argc = 0;
 char **argv = 0;
 
  if (app  == 0)
    {
      app = new QApplication(argc, argv);
 
      QTextCodec *tCodec = QTextCodec::codecForName("CP1251");
      QTextCodec::setCodecForTr(tCodec);   
}
   

    if (w != 0)
      delete w;

     extern HINSTANCE appInst;
    extern HINSTANCE appPrevInst;

    appPrevInst = appInst;
    appInst = (HINSTANCE)GetWindowLong(parent_handle, GWL_HINSTANCE);

    w = new AXTIV_WIDGET(parent_handle);

    w->setGeometry(0,0, 30, 30);
w->show();

    SetWindowPos(w->winId(), 0, 0, 0, 0, 0,
                     SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER
                     | SWP_FRAMECHANGED);

    SetWindowLong(w->winId(), GWL_STYLE, WS_VISIBLE | WS_BORDER |WS_CHILD | WS_MAXIMIZEBOX);

    ShowWindow(w->winId(), SW_NORMAL); 
   
return w->winId();;
}

//это заголовочный файл
#ifndef AX1_H
#define AX1_H

#include <QWidget>
#include <QPainter>

#include <windows.h>

#include <QApplication>

#include <QPushButton>

//! [0]
class AXTIV_WIDGET : public QWidget
{
    Q_OBJECT
/*    Q_CLASSINFO("ClassID", "{1D9928BD-4453-4bdd-903D-E525ED17FDE5}")
    Q_CLASSINFO("InterfaceID", "{99F6860E-2C5A-42ec-87F2-43396F4BE389}")
    Q_CLASSINFO("EventsID", "{0A3E9F27-E4F1-45bb-9E47-63099BCCD0E3}")
*/
    Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor)
public:
  QPushButton *b;

AXTIV_WIDGET(HWND parent_handle);

    QColor fillColor() const
    {
return fill_color;
    }
    void setFillColor(const QColor &fc)
    {
fill_color = fc;
repaint();
    }

protected:
    void paintEvent(QPaintEvent *e)
    {
QPainter paint(this);
QRect r = rect();
r.adjust(10, 10, -10, -10);
paint.fillRect(r, fill_color);
    }

private:
    QColor fill_color;
};
//! [0]

#endif // AX1_H

Записан
mal
Гость
« Ответ #6 : Апрель 05, 2010, 20:12 »

Возможно Вам поможет это: посмотрите на qtwinmigrate. У тролей там все подробно расписано.
http://doc.trolltech.com/solutions/qtwinmigrate/winmigrate-walkthrough.html
Я в аналогичной ситуации в свое время пошел по этому пути. Была задачка разместиться в окне, хендл которого дают на вход dll.
Посмотрите на использование QWinWidget - чтоб разместить интерфейс свою кутовой dll в каком либо HWND - это то что нужно...
Я сделал это так:
1. Породиться от QWinWidget,
2. Создать этот объект (пункт 1), дав ему в качестве парента хэндл внешнего окна (где вам надо разместиться)
3. Создать layout
4. Создать экземпляр своего главного окна
5. Разместить его в layout
6. Установить layout в win_widget пункта 1
7. Показать winwidget.

Записан
slvno
Гость
« Ответ #7 : Апрель 06, 2010, 19:19 »

mal большое тебе спасибо! Очень помог!

QWinWidget - это то что нужно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.