Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];

Вниз

Второе окно на API   Найти похожие ветки 

 
demon ©   (2008-08-03 16:11) [0]

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

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-03 19:58) [1]

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


 
demon ©   (2008-08-03 21:14) [2]

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

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


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

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

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

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


 
Loginov Dmitry ©   (2008-08-03 22:59) [4]

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


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


 
demon ©   (2008-08-03 23:33) [5]

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


 
demon ©   (2008-08-03 23:42) [6]

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


 
Loginov Dmitry ©   (2008-08-03 23:51) [7]

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


оправдание


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


?


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


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


 
demon ©   (2008-08-04 00:00) [8]

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

 makePLWindow;

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

postmessage(Handle,WM_COMMAND,12345,12345);

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


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

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

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


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

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

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

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


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

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


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

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

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


 
demon ©   (2008-08-04 01:06) [13]

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


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

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

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


 
Loginov Dmitry ©   (2008-08-04 07:52) [15]

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


точно оба? :)


 
имя   (2008-08-14 17:02) [16]

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.046 c
15-1216037491
sD
2008-07-14 16:11
2008.09.28
Структура приложение на Delphi + MS SQL


15-1217744147
ketmar
2008-08-03 10:15
2008.09.28
как не надо писать код


2-1219139868
pushkin42
2008-08-19 13:57
2008.09.28
Ошибка при выполнении запроса SQL


15-1218131612
Nic
2008-08-07 21:53
2008.09.28
Накрылся вентилятор блока питания ПК


2-1219219368
silver222
2008-08-20 12:02
2008.09.28
ado paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский