Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Сообщение при нажатии на кномку.


Автор: Dimannn 17.8.2005, 21:27
ButtonDown нащёл, ButtonUP нащёл, DblClick нащёл, а клика нету. Пособите пожалуйста.

Автор: Girder 18.8.2005, 00:30
BM_CLICK

Автор: Rrader 18.8.2005, 03:08
BM_CLICK = WM_LBUTTONDOWN + WM_LBUTTONUP smile

Автор: Dimannn 26.8.2005, 18:33
Не работает. Вот код:
Код

  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.

Автор: Rrader 27.8.2005, 06:19
Так бы сразу и сказал, что нужно отслеживать нажатие. 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

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


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

Автор: Rrader 28.8.2005, 09:12
Тут дан пример, где обрабатывается нажатие на кнопку. 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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)