Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | создание окна и его элементов средствами WinAPI

Ответить
Настройки темы
Delphi - Delphi | создание окна и его элементов средствами WinAPI

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Подскажите, в чем трабл...
Код: Выделить весь код
 ........
  handleWnd:=CreateWindow(myClassName, 'See a label below?', WS_OVERLAPPEDWINDOW,400,300,200,100,0,0,hInstance,nil);
  if handleWnd = 0 then begin // окно создается
	MessageBox(0,'Failed to create Window',nil,MB_OK);
	Exit;
  end;
  Label1:=CreateWindow('Label','See me?',WS_VISIBLE or WS_CHILD or WM_SETTEXT,10,10,60,23,handleWnd,0,hInstance,nil);
  if Label1 = 0 then begin // а текст нет :(
	MessageBox(0, 'Failed to create Label', nil, MB_OK);
	Exit;
  end;
........

Отправлено: 08:14, 17-01-2005

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


А Вы не забыли SS_LEFT какой-нибудь? Вместо WM_SETTEXT? А то WM_SETTEXT - это "сообщение", а не "стиль"

Отправлено: 09:03, 17-01-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Thanks, это у меня заскок малец
А проблема была в другом (Винда и с WM_SETTEXT все правильно создает): вместо Label1:=CreateWindow('Label','See me?',....) надо было Label1:=CreateWindow('STATIC','See me?',....) Это второй заскок

Отправлено: 09:10, 17-01-2005 | #3


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Кстати, вот еще интересная ситуация. Во многих примерах я видел следующее:
Код: Выделить весь код
while GetMessage( lpMsg, hWnd, 0, 0 ) do begin
  TranslateMessage( lpMsg );
  DispatchMessage( lpMsg );
end;
У меня подобная конструкция приводит к тому, что окно после WM_DESTROY разрушается, а из цикла программа не выходит! Исправляю на GetMessage( lpMsg, 0, 0, 0 ) и все "ок". Кто-нибудь может это прокомментировать?

Отправлено: 09:45, 17-01-2005 | #4


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Честно, я пока чего-то не догоняю, в чём проблема (не проснулся ещё ), но можете почитать тут описание по-русски
http://www.mini-soft.net.ru/msdn/glob_1.php потом Crtl+F GetMessage

Отправлено: 09:56, 17-01-2005 | #5


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Да не, проблемы-то нет . Я просто указываю на то, что почти везде GetMessage() дается примерно в таком контексте
Код: Выделить весь код
while GetMessage( lpMsg, hWnd, 0, 0 ) {...}
А у меня почему-то подобная конструкция из цикла не выходит, когда окно с хендлом hWnd закрывается
Цитата http://www.mini-soft.net.ru/msdn/glob_1.php:
hWnd - дескриптор окна, сообщения для которого следует получить. Этот аргумент может принимать нулевое значение. Это значение свидетельствует о том, что функция GetMessage должна получать сообщения для любого окна, принадлежащего данному потоку, и сообщения от потока, посланные функцией PostThreadMessage
Вот когда на нуль подправил, тогда все запахало (о чем и написал постом выше)... Тогда как же использовать аргумент hWnd?

ps: 1. Я и английский знаю
2. Не спал еще , отсюда и ляпы разные

Отправлено: 10:07, 17-01-2005 | #6


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Дык а откуда взялся hWnd? Его кто инициализировал? И как? Дайте кусок текста.

Отправлено: 13:59, 17-01-2005 | #7


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


Petzold дает эту конструкцию во всех примерах в таком виде:
Код: Выделить весь код
while (GetMessage (&msg, NULL, 0, 0))
          {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
          }

-------
Ehhh.. what's up, doc?..


Отправлено: 16:20, 17-01-2005 | #8


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Уважаемый mrcnn, я знаю, что "с нулём" (т.е. когда функция принимает все сообщения из потока) все отлично работает, гораздо более интересно, почему не работает с конкретным значением hWnd (т.е. когда функция принимает сообщения от данного окна).

Уважаемый hasherfrog, вот нарезка кода:
Код: Выделить весь код
var
  Msg: TMsg; // аналог MSG в Си
  handleWnd, Label1 : THandle; // аналог HWND в Си
  .........
  handleWnd:=CreateWindow(myClassName,'See a label below?',WS_OVERLAPPEDWINDOW,0,0,200,100,hWndParent,0,hInstance,nil);
  if handleWnd = 0 then
    if MessageBox(0,'Failed to create Window'#13'Close Application?',nil,MB_TASKMODAL or MB_ICONWARNING or MB_OKCANCEL)=ID_OK then
      Exit;
  Label1:=CreateWindow('STATIC','See me?',WS_VISIBLE or WS_CHILD or WM_SETTEXT,10,10,60,23,handleWnd,0,hInstance,nil);
  if Label1 = 0 then
    if MessageBox(0,'Failed to create Label'#13'Close Application?',nil,MB_TASKMODAL or MB_ICONWARNING or MB_OKCANCEL)=ID_OK then
      Exit;
  .........
  ShowWindow(handleWnd, SW_SHOW);
  UpdateWindow(handleWnd);
  while GetMessage(Msg, handleWnd, 0, 0) do begin // если вместо handleWnd поставить 0, то все отлично
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  .........
Проблема в том, что программа не выходит из цикла while.

Отправлено: 18:00, 17-01-2005 | #9


Аватара для frizzn

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


Savant
Цитата:
"с нулём" (т.е. когда функция принимает все сообщения из потока) все отлично работает, гораздо более интересно, почему не работает с конкретным значением hWnd (т.е. когда функция принимает сообщения от данного окна)
AFAIK, когда приходит WM_QUIT, окно уже не существует (hWnd показывает пальцем в небо). Поэтому приходится указывать NULL, т.е. независимо от окна

-------
Здесь могла быть ваша реклама


Отправлено: 03:46, 18-01-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | создание окна и его элементов средствами WinAPI

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Win32 API - Создание "сквозной" формы средствами WinAPI garkin123 Программирование и базы данных 7 14-11-2009 23:41
Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке? XCodeR Программирование и базы данных 4 12-03-2007 19:51
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI DillerInc Программирование и базы данных 60 13-03-2006 21:36
Delphi - Delphi, WinAPI | Корректное завершение программы fossil Программирование и базы данных 6 10-08-2005 14:52
Delphi - *Решено* | Использование WinAPI под Delphi Savant Программирование и базы данных 2 14-01-2005 21:40




 
Переход