Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические окно в frame 
V
    Опции темы
Riviero
Дата 25.4.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



1)Как запихнуть динамически создаваемое окно в frame на форме?

2)Обязательно ли оно должно быть типа TFrame?

Это сообщение отредактировал(а) Riviero - 25.4.2011, 10:51
PM MAIL   Вверх
borisbn
Дата 25.4.2011, 14:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  25.4.2011,  10:50 Найти цитируемый пост)
1)Как запихнуть динамически создаваемое окно в frame на форме?

Код

TForm * form = new TForm();
form->Parent = frame_or_other_control_that_will_contain_a_form;
form->Align = alClient; // это чтоб окно заполнило всего парента


Цитата(Riviero @  25.4.2011,  10:50 Найти цитируемый пост)
2)Обязательно ли оно должно быть типа TFrame?

см. п 1) smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 26.4.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



А как может быть компонент на форме Parent-ом?
PM MAIL   Вверх
borisbn
Дата 26.4.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Parent-ом может быть любой класс, наследованный от TWinControl. Хоть TButton. В него можно положить любой компонент, наследованный от TControl, в том числе и TForm


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 26.4.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Получается, если я создаю окно через CreateWindow() параметр Parent я указываю Frame->Handle?

PM MAIL   Вверх
borisbn
Дата 26.4.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  26.4.2011,  14:07 Найти цитируемый пост)
Получается, если я создаю окно через CreateWindow() параметр Parent я указываю Frame->Handle?

 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 28.4.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Пишу 
Код

     HWND Parent = Form1->Frame21->Handle;


Выдает ошибку. Access violation.
PM MAIL   Вверх
Riviero
Дата 6.5.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Все еще нужна помощь.
Суть проблемы: я создаю окно для рисования в нем, но нужно как-то его поместить на уже готовую форму.
PM MAIL   Вверх
borisbn
Дата 6.5.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  6.5.2011,  10:25 Найти цитируемый пост)
 создаю окно для рисования в нем, но нужно как-то его поместить на уже готовую форму.


Цитата(borisbn @  25.4.2011,  14:54 Найти цитируемый пост)

TForm * form = new TForm();
form->Parent = frame_or_other_control_that_will_contain_a_form;


чем не устраивает ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 6.5.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Я винапи, конечно, не очень силен...
Код

    WNDCLASS   wndclass;
    HINSTANCE hInstance;
    int nCmdShow = 1;
    HWND Parent1 = NULL;//(HWND)Form1->Frame21->Handle ;
    CHAR *appName = szAppName.c_str();
    /* Register the frame class */
    wndclass.style         = 0;
    wndclass.lpfnWndProc   = (WNDPROC)MainWndProc;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInstance;
    wndclass.hIcon         = LoadIcon (hInstance, Application->Name.c_str());
    wndclass.hCursor       = LoadCursor (NULL,IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+5);
    wndclass.lpszMenuName  = appName;
    wndclass.lpszClassName = appName;

    if (!RegisterClass (&wndclass) )
    {
      return FALSE;
    }
    /* Create the frame */
    ghWnd = CreateWindow (appName,
             appName,
         WS_OVERLAPPEDWINDOW | WS_VSCROLL,
             CW_USEDEFAULT,
             CW_USEDEFAULT,
             WIDTH,
             HEIGHT,
             Parent1,
             NULL,
             hInstance,
             NULL);


Делается вот так.

Цитата(borisbn @  6.5.2011,  13:37 Найти цитируемый пост)
TForm * form = new TForm();
form->Parent = frame_or_other_control_that_will_contain_a_form;



Цитата(Riviero @  28.4.2011,  14:44 Найти цитируемый пост)
код C++ Builder
1:
     HWND Parent = Form1->Frame21->Handle;


Выдает ошибку. Access violation. 

PM MAIL   Вверх
borisbn
Дата 6.5.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  6.5.2011,  14:11 Найти цитируемый пост)

HWND Parent = Form1->Frame21->Handle;
Выдает ошибку. Access violation.

1. Если ты используешь VCL, то зачем тебе HWND ?
2. Form1 уже создан, когда эта строчка вызывается ? Чему он равен ? А чему равен Form1->Frame21 ?
3. Пробовал так
Код

TForm * form = new TForm();
form->Parent = Form1->Frame21;

?

Добавлено через 1 минуту и 2 секунды
только щаз дошло
Цитата(Riviero @  6.5.2011,  10:25 Найти цитируемый пост)
я создаю окно для рисования в нем

окно не VCL-ное ? WinAPI-шное, штоле ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 6.5.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Цитата(borisbn @  6.5.2011,  14:15 Найти цитируемый пост)
окно не VCL-ное ? WinAPI-шное, штоле ?


да, апишное.
Цитата(borisbn @  6.5.2011,  14:15 Найти цитируемый пост)
код C++ Builder
1:
2:
TForm * form = new TForm();
form->Parent = Form1->Frame21;



Если бы я знал как после этого в openGl там рисовать...

PM MAIL   Вверх
borisbn
Дата 7.5.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  6.5.2011,  14:25 Найти цитируемый пост)
Если бы я знал как после этого в openGl там рисовать...

в OpenGl ты передаёшь HWND. Для этого у TForm усть TFrom::Handle типа HWND.
т.е. вместо
Код

HWND wnd = CreateWindow(...);
glFunction( wnd );

используй Handle
Код

TForm * form = new TForm();
form->Parent = Form1->Frame21;
glFunction( form->Handle );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 10.5.2011, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



А как мне тогда к WNDPROC подобраться?
PM MAIL   Вверх
borisbn
Дата 10.5.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  10.5.2011,  09:22 Найти цитируемый пост)
А как мне тогда к WNDPROC подобраться?

А зачем ? У TForm есть практически все нужные event'ы


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 10.5.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Цитата(borisbn @  10.5.2011,  09:25 Найти цитируемый пост)
А зачем ? У TForm есть практически все нужные event'ы 


Мне кажется, что гораздо удобнее все нужные евенты описать в одном месте, чем для каждого писать свои процедуры.

1) Так работает (показывает в фрейме на форме):

Код

     TFrame * frame = new TFrame(TForm1->Frame21);
      frame->Parent = TForm1->Frame21;
      HWND ghWnd = frame->Handle;


2) Так открывается в новом окне:

Код

      TForm * frame = new TForm(TForm1->Frame21);
      frame->Parent = TForm1->Frame21;
      HWND ghWnd = frame->Handle;


3) Так выдает ошибку Access violation:

Код

    HWND ghWnd = Frame2->Handle;    // Frame2 просто добавлена в проект


По сути вопрос закрыт, осталось только понять как msg обрабатывать.

Это сообщение отредактировал(а) Riviero - 10.5.2011, 14:14
PM MAIL   Вверх
borisbn
Дата 10.5.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  10.5.2011,  14:13 Найти цитируемый пост)
2) Так открывается в новом окне:

хммм. не понятно. должно быть также как с frame. где-то у меня был проект, где одна форма лежала на другой. щаз поищу

Цитата(Riviero @  10.5.2011,  14:13 Найти цитируемый пост)
3) Так выдает ошибку Access violation:

это-то, как раз, понятно. 
Цитата(Riviero @  10.5.2011,  14:13 Найти цитируемый пост)
// Frame2 просто добавлена в проект

не Frame2, а TFrame2 добавлен, т.е. добавлен тип, а вот объект этого типа никто не создаёт, Frame2 указывает либо на мусор, либо на 0 (что, в общем-то, тоже мусор)

Цитата(Riviero @  10.5.2011,  14:13 Найти цитируемый пост)
 осталось только понять как msg обрабатывать.

посмотри TApplication::OnMessage

 smile 
Я тут тебе пытаюсь помочь, а ты цены сбиваешь  smile 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 11.5.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Цитата(borisbn @  10.5.2011,  14:31 Найти цитируемый пост)
посмотри TApplication::OnMessage


Не догнал я что-то как этим пользоваться...

Нашел такую тему.

SetClassLong Function

Replaces the specified 32-bit (long) value at the specified offset into the extra class memory or the WNDCLASSEX structure for the class to which the specified window belongs. 

Пишу 

Код

    LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM); 

    ghWnd = frame->Handle;
    SetClassLong(ghWnd, GCL_WNDPROC, (WNDPROC)MainWndProc);


Выдает ошибку : [BCC32 Error] Unit1.cpp(1928): E2034 Cannot convert 'long (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'long'
PM MAIL   Вверх
borisbn
Дата 11.5.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Riviero @  11.5.2011,  14:53 Найти цитируемый пост)
Не догнал я что-то как этим пользоваться...

забей. Только сейчас вспомнил попроще:
Цитата

typedef void __fastcall (__closure *TWndMethod)(Messages::TMessage &Message);

__property TWndMethod WindowProc = {read=FWindowProc, write=FWindowProc};


пишешь так:
Код

// h-файл
TWndMethod oldWndMethod;
void __fastcall WindowProcFunc( Messages::TMessage &Message );
// cpp-файл
void __fastcall TForm1::TForm1()
{
    oldWndMethod = WindowProc;
    WindowProc = WindowProcFunc;
}

void __fastcall TForm1::WindowProcFunc( Messages::TMessage &Message )
{
    switch ( Message.Msg )
    {
        case ...... : Message.WParam ... Message.LParam ...
        break;
    }
    oldWndMethod( Message );
}



Цитата(Riviero @  11.5.2011,  14:53 Найти цитируемый пост)
Нашел такую тему.SetClassLong Function

зачем тебе "голое" WinAPI. Пользуешь дебилдер - юзай по-полной...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Riviero
Дата 12.5.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



Все получилось, спасибо!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.