Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщение при нажатии на кномку. WM_CLICK сделать забыли. 
:(
    Опции темы
Dimannn
  Дата 17.8.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



ButtonDown нащёл, ButtonUP нащёл, DblClick нащёл, а клика нету. Пособите пожалуйста.


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Girder
Дата 18.8.2005, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 25
Всего: 155



BM_CLICK


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Rrader
  Дата 18.8.2005, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



BM_CLICK = WM_LBUTTONDOWN + WM_LBUTTONUP smile


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Dimannn
Дата 26.8.2005, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



Не работает. Вот код:
Код

  h1:=CreateWindowEx (0,'BUTTON','GENERATE',WS_CHILD , 10,120, 90, 20,Handle,0,instance, nil);
 ShowWindow(Handle, SW_SHOW);
 ShowWindow(h1, SW_SHOW);
 UpdateWindow (Handle);
 UpdateWindow (h1);

 while (GetMessage(msg, 0, 0, 0)) do
  begin

  If (msg.hwnd=h1)and(msg.message=BM_CLICK) then Edit1Change;

   translatemessage(msg);
   dispatchmessage (msg);
  end;
end.



--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Rrader
  Дата 27.8.2005, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Так бы сразу и сказал, что нужно отслеживать нажатие. smile Тогда тебе нужно обрабатывать уведомление BN_CLICKED, которое придет с сообщением WM_COMMAND.

Типа:
Код

If (Msg.LParam = Button.Handle) And (Msg.Message = WM_COMMAND) And
  (HiWord(Msg.WParam) = BN_CLICKED) Then ...

Добавлено @ 06:20
P. S.
Обработку мессаг лучше проводить в оконной процедуре smile

Это сообщение отредактировал(а) Rrader - 27.8.2005, 06:21


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Dimannn
Дата 27.8.2005, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



Цитата(Rrader @ 27.8.2005, 06:19)
P. S.
Обработку мессаг лучше проводить в оконной процедуре


Как это зделать? Формы создаю с помощью RegisterClasss, а не Form1:=TForm.Create;


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Rrader
Дата 28.8.2005, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Тут дан пример, где обрабатывается нажатие на кнопку. smile
Код

{Author: Rrader}
Program WinAPI; // Пример простой программы на "чистом" WinAPI с кнопкой    
{$R *.res}    
Uses    
  Windows,    
  Messages;    
Const    
  ButtonID = 100; // Это идентификатор кнопки, используется для определения исходящих от неё событий, число - произвольное    
Function GetFont(AName: String): HFONT; // Возвращает дескриптор шрифта    
Begin    
  Result := CreateFont(0,    
   0,    
   0,    
   0,    
   FW_NORMAL,    
   0,    
   0,    
   0,    
   DEFAULT_CHARSET, // Набор символов    
   OUT_DEFAULT_PRECIS,    
   CLIP_DEFAULT_PRECIS,    
   PROOF_QUALITY, // Качество    
   DEFAULT_PITCH,    
   PChar(AName)); // Имя шрифта    
End;    
Procedure InitCommonControls; External 'comctl32.dll' Name 'InitCommonControls'; // Описание см. ниже    
Function WinProc(HWND: THandle; // Окно-получатель каждого входящего сообщения    
  Msg: Cardinal; // Само сообщение    
  WParam, // Первый и второй уточняющие параметры сообщения    
  LParam: Cardinal): Cardinal; Stdcall; // Оконная процедура, здесь мы задаем реакцию программы на все нужные нам сообщения    
Var    
  Rect: TRect; // Для записи размеров клиентской области нашего окна    
Begin    
  Result := 0; // Чтобы в случае сбоя программы до последней строки функции Windows правильно определила ошибку    
  Case Msg Of    
    WM_CREATE: // При создании окна:    
    Begin    
      {Создаём кнопку}    
      CreateWindowEx (0, // Расширенные стили окна - нам никакие не нужны    
        'BUTTON', // Предопределенный класс Windows - у нас кнопка    
        'Кнопка', // Это заголовок кнопки - Caption :)    
        WS_CHILD Or WS_VISIBLE{если не указан, ничего не будет} // Это комбинация оконных стилей    
          Or BS_PUSHBUTTON,    
           // А это продолжение, но стили уже идут кнопочные (ранее были оконные)    
        0, 0, // Положение левого верхнего угла кнопки: смотри ниже реакцию на WM_SIZE    
        200, 80, // Размеры    
        HWND, // Родительское окно (здесь: параметр оконной процедуры)    
        ButtonID, // Если мы создаем НЕ формы, то сюда прописываем идентификатор контрола, а если формы - то идентификатор меню окна    
        HInstance, // Грубо говоря - дескриптор всей программы в целом (используется для того, чтобы программа имела доступ к сегменту данных - для знающих ассемблер)    
        NIL); // Указатель на дополнительную информацию - нам не нужен    
      SendMessage(GetDlgItem(HWND, ButtonID), WM_SETFONT,  GetFont('Verdana'), -1); // Меняем шрифт    
    End;    
    WM_SIZE: // Посылается после изменения размеров окна (формы)    
    Begin    
      GetClientRect(HWND, Rect); // Получаем размеры клиентской (без рамки и заголовка) области формы    
      {В зависимости от размеров формы перемещаем кнопку:}    
      SetWindowPos(    
        GetDlgItem(HWND, ButtonID), // Возвращает дескриптор контрола по его идентификатору    
        HWND_TOP, // Порядок Z - порядок приоритета контролов, сейчас у кнопки наивысший    
        Rect.Right Div 2 - 100,    
        Rect.Bottom Div 2 - 40,    
        0, 0, // Нулевой размер    
        { А теперь обламываем функцию :) }    
        SWP_NOZORDER // Игнорируем параметр, где определили HWND_TOP    
        Or SWP_NOSIZE); // Игнорируем параметры, где указывали размер    
    End;    
   {ОБРАБОТЧИК НАЖАТИЯ НА КНОПКУ}
    WM_COMMAND: // Через это сообщение определяем нажатие на кнопку    
     {Если мессага пришла от кнопки}    
      If LoWord (WParam) = ButtonID Then    
        {И если это было нажатие}    
        If HiWord (WParam) = BN_CLICKED then    
          MessageBox(HWnd, 'Вы нажали на кнопочку!',    
            'Демонстрация WinAPI', MB_OK);    
    WM_DESTROY: // При уничтожении окна (можно и не задавать реакцию - прога автоматически выгрузится, однако оставив след в памяти)    
      PostQuitMessage(0); // Помещает в очередь сообщений сообщение завершения работы программы (WM_QUIT)    
    Else // Если пришедщее сообщение мы не определили:    
      Result := DefWindowProc(HWnd, Msg, WParam, LParam); // Эта функция обрабатывает ВСЕ ОСТАЛЬНЫЕ сообщения по умолчанию    
  End; // Конец блока Case    
End;    
Procedure WinMain; // Эта процедура сформирует окно и отобразит его, запустив цикл обработки сообщений    
Var    
  HWnd: THandle; // Сюда поместим дескриптор созданного окна    
  Msg: TMsg; // Входящие мессаги    
  WndClassEx: TWndClassEx; // Класс окна - несёт инфу об окне (запись)    
Begin    
  // Заполняем запись информацией:    
  WndClassEx.cbSize := SizeOf(TWndClassEx); // Размер структуры    
  WndClassEx.lpszClassName := 'APIWindow'; // Имя класса окна (для примера - второй параметр функции FindWindow)    
  WndClassEx.style := CS_VREDRAW Or CS_HREDRAW; // Стили окна - в данном случае окно будет перерисовываться при изменении как горизонтальных, так и вертикальных размеров    
  WndClassEx.hInstance := HInstance; // Ищи описание выше    
  WndClassEx.lpfnWndProc := @WinProc; // адрес окнной процедуры    
  WndClassEx.cbClsExtra := 0;    
  WndClassEx.cbWndExtra := 0;    
  WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Икнока окна    
  WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Тоже иконка (но маленькая :)    
  WndClassEx.hCursor := LoadCursor(0, IDC_ARROW); // Курсор мыши для окна (у нас - стрелка)    
  WndClassEx.hbrBackground := COLOR_BTNFACE + 1; // Фон окна    
  WndClassEx.lpszMenuName := NIL; // Указатель на меню (у нас меню нет)    
    
  // Теперь регистрируем класс окна в системе    
  If RegisterClassEx(WndClassEx) = 0 Then    
    MessageBox(0, 'Невозможно зарегистрировать класс окна', 'Ошибка', MB_OK Or MB_ICONHAND)    
  Else    
  Begin    
  // Создаём окно    
    HWnd := CreateWindowEx(    
      WS_EX_OVERLAPPEDWINDOW, // Расширенные стили    
      WndClassEx.lpszClassName, // Имя класса окна    
      'Демонстрация WinAPI', // Заголовок    
      WS_OVERLAPPEDWINDOW, // Обычные стили    
      CW_USEDEFAULT, 0, // Позиция относительно экрана (CW_USEDEFAULT означает, что размеры будут определяться Windows)    
      CW_USEDEFAULT, 0, // Размеры    
      0, // Родитель - у нас нет родителей :)    
      0, // Меню    
      HInstance, // Смотри описание выше    
      NIL); // Дополнительные параметры    
    If HWnd = 0 Then // Если окно не создалось:    
      MessageBox (0, 'Окно не создалось!',    
        'Ошибка', MB_OK Or MB_ICONHAND)    
    Else    
    Begin    
      ShowWindow (HWnd, SW_SHOWNORMAL); // Показывем окно    
      UpdateWindow(HWnd); // Перерисовываем окно    
      {Запускаем цикл жизни программы}    
      While GetMessage(Msg, 0, 0, 0) Do // Эта функция извлекает очередное сообщение из очереди сообщений, вернет 0 только если попадется сообщение WM_QUIT    
      Begin    
        TranslateMessage(Msg); // Переводит нажатия клавиш, чтобы их можно было обработать оконной процедуре    
        DispatchMessage(Msg); // Отправляем мессагу оконной процедуре    
      End;    
      Halt(Msg.WParam); // Завершение работы при получении мессаги WM_QUIT (при выходе из цикла жизни программы)    
    End;    
  End;    
End;    
Begin    
  InitCommonControls; // Для поддержки нового стиля Windows XP    
  WinMain; // Вот и вся программа! :)    
End.



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

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

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


 




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


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

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