Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Второе окно на API


demon ©   (2008-08-03 16:11:00) 

Чтобы создать второе окно, написал процедуру :

procedure makePLWindow;
var
 Wc: TWndClassEx;
 Wnd: HWND;
 Msg: TMsg;
begin

with Wc do
  begin
     cbSize     := SizeOf( Wc );
     style      := CS_VREDRAW or CS_HREDRAW;
     lpfnWndProc:= @WindowProc;
     cbClsExtra := 0;
     cbWndExtra := 0;
     hInstance  := hInstance;
     hIcon      := LoadIcon( 0, IDI_APPLICATION );
     hCursor    := LoadCursor( 0, IDC_ARROW );
     hbrBackground := COLOR_WINDOW;
     lpszMenuName  := nil;
     lpszClassName := 'Tdp3PLWindow';
  end;

  RegisterClassEx( Wc );

  Wnd := CreateWindowEx( 0,
  'Tdp3PLWindow',
  main.PLWindowName,
  WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX or WS_BORDER,
  60,
  60,
  200,
  700,
  0,
  0,
  hInstance,
  nil );

  ShowWindow( Wnd, SW_SHOWNORMAL );

  while GetMessage( Msg, 0, 0, 0 ) do
  begin
     TranslateMessage( Msg );
     DispatchMessage( Msg );
  end;

 Halt( Msg.wParam );
end;

Но при вызове этой процедуры окно не появляеться. Если же убрать строку:
 style      := CS_VREDRAW or CS_HREDRAW;
то окно появляеться, но естественно, теряет свойство менять размеры.
В чем проблема?


  (2008-08-14 17:02:00) [1]

Удалено модератором


Loginov Dmitry   (2008-08-04 07:52:00) [2]

> Всё работает отлично, оба обработчика функционируют


точно оба? :)


Юрий Зотов   (2008-08-04 01:17:00) [3]

> demon ©   (04.08.08 01:06) [13]

Если Application не используется, то и второй поток не нужен. См. [12].


demon   (2008-08-04 01:06:00) [4]

Госпада! Всё работает отлично, оба обработчика функционируют, никаких глюков пока не видать. Как замечу глюк, так сразу паток создам.


Юрий Зотов   (2008-08-04 00:53:00) [5]

> demon ©   (04.08.08 00:44) [11]

А тогда какие могут быть проблемы? Оба окна запихнуть в dpr, там же сделать их оконные функции и цикл выборки сообщений.


demon   (2008-08-04 00:44:00) [6]

У меня оба окна на API.


Loginov Dmitry   (2008-08-04 00:19:00) [7]

И я вот тоже что-то не пойму. В VCL уже есть цикл обработки оконных сообщений

зачем добавлять свой собственный цикл обработки? Без него не работает?

Самый главный вопрос: зачем извращаться с окнами на WinAPI при работе с VCL?


Юрий Зотов   (2008-08-04 00:07:00) [8]

> demon ©   (04.08.08 00:00) [8]

У Вас в одном потоке появилось 2 цикла выборки сообщений - один из VCL, второй Ваш, причем второй не дает работать первому. Как Вы предполагаете решить этот конфликт, не создавая второго потока?


demon   (2008-08-04 00:00:00) [9]

Ну, вместо того чтобы вызвать:

 makePLWindow;

и повесить прогу, я сделал так:

postmessage(Handle,WM_COMMAND,12345,12345);

а в обработчике написал
.....
 WM_COMMAND :
     if (wParam = 12345) and (lParam  = 12345) then  makePLWindow;
....


Loginov Dmitry   (2008-08-03 23:51:00) [10]

> Запихнуть в dpr не получиться, там у меня создаётся первое
> окно программы.


оправдание


> А если послать самому себе sendMessage и обработать его,
> это будет грамотно?


?


> Нет,  sendMessage не прокатило, а с postmessage работает!


это вообще про что?


demon   (2008-08-03 23:42:00) [11]

Нет,  sendMessage не прокатило, а с postmessage работает!
Потестирую, может появились какие подводные грабли...


demon   (2008-08-03 23:33:00) [12]

Счас окно нормально создаеться, я код подправил.
Запихнуть в dpr не получиться, там у меня создаётся первое окно программы.
Целый поток создавать для этого тоже както зажирно.
А если послать самому себе sendMessage и обработать его, это будет грамотно?


Loginov Dmitry   (2008-08-03 22:59:00) [13]

> Не поиню что поменял, но запустил, но без  hInstance  :=
> hInstance; не работает.


Заблуждаетесь. В данном случае переменной присваивается ее же значение, причем рандомное, т.к. поля структуры TWndClassEx обнулены не были. При вызове же CreateWindowEx() используется вполне определенное значение глобальной переменной hInstance, которое в общем случае не совпадает с TWndClassEx.hInstance. В результате могут быть различные эффекты, в том числе "окно то не появляется, то появляется" (hInstance очень важен, именно его Windows использует для поиска требуемого для CreateWindowEx() класса окна).
Рекомендую анализировать, чему равно Wnd после вызова фукнции CreateWindowEx(). Подозреваю, что там ноль.


Юрий Зотов   (2008-08-03 22:04:00) [14]

> demon ©   (03.08.08 21:14) [2]

1. Что и чему присваивается? Само себе?

2. Надо реализовать оконную функцию, а весь Ваш код поместить либо в dpr (убрав из него все остальное), либо в отдельный поток.


demon   (2008-08-03 21:14:00) [15]

Не поиню что поменял, но запустил, но без  hInstance  := hInstance; не работает.

Еще один вопрос. А как вызвать эту процедуру с текста программы? до этого я вызывал её с меню, а при попытке вызвать с другой процедуры, программа зависает.


Юрий Зотов   (2008-08-03 19:58:00) [16]

with Wc do
begin
...
 hInstance  := hInstance;
...


Наверх

Титульная страница Поиск, карта сайта Написать письмо