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

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

Переход по TAB на API


Users ©   (2004-11-24 11:31:00) 

Почему не работает переход по TAB между контролами ?
И не работает Click на фокусированной кнопке при нажатии Enter? Нужно ли писать самому обработчик нажатий клавиш, самому переводить фокус или какие то параметры контролов заданы не верно?


Program Some;
Uses
 Windows, Messages, CommCtrl;
Var
 ProgramWinClass   : TWndClass;
 ProgramInst       : HINST;
 MainWindow        : HWND;
 MainMessage       : TMsg;
 Edit1             : HWND;
 Button1           : HWND;
 Button2           : HWND;
 Button3           : HWND;

Const
 CLASSNAME         = 'SomeWindowClass';
 TITLE             = 'Some';

Function WindowProc(hWindow: HWND; Msg: Integer; wParam: LongInt; lParam: LongInt): LRESULT; Stdcall;
Begin
 Result := 0;
 Case Msg Of
   WM_CREATE:
     Begin
       InitCommonControls;
     End;
   WM_COMMAND:
     Begin
       If (HWND(lParam) = Button1) Then
         Begin
           MessageBox(hWindow, 'Button1', '', 0);
         End;
       If (HWND(lParam) = Button2) Then
         Begin
           MessageBox(hWindow, 'Button2', '', 0);
         End;

       If (HWND(lParam) = Button3) Then
         Begin
           DestroyWindow(hWindow);
         End;
     End;
   WM_DESTROY:
     Begin
       PostQuitMessage(0);
       Exit;
     End;
   Else
     Result := DefWindowProc(hWindow, Msg, wParam, lParam);
 End;
End;

Begin
 ProgramInst := hInstance;
 
 With ProgramWinClass Do
   Begin
     style := CS_CLASSDC Or CS_PARENTDC;
     lpfnWndProc := @WindowProc;
     hInstance := ProgramInst;
     hbrBackground := color_btnface + 1;
     lpszClassname := CLASSNAME;
     HICON := LoadIcon(hInstance, 'MAINICON');
     hCursor := LoadCursor(0, IDC_ARROW);
   End;

 RegisterClass(ProgramWinClass);

 MainWindow := CreateWindowEx(
   WS_EX_APPWINDOW,
   CLASSNAME,
   TITLE,
   WS_TILEDWINDOW Or WS_VISIBLE Or WS_TABSTOP,
   129,
   119,
   334,
   324,
   0,
   0,
   ProgramInst,
   Nil);

 Edit1 := CreateWindowEx(
   WS_EX_CLIENTEDGE,
   'Edit',
   '',
   WS_CHILD Or WS_VISIBLE Or WS_BORDER Or WS_TABSTOP,
   72,
   20,
   233,
   21,
   MainWindow,
   0,
   ProgramInst,
   Nil
   );

 Button1 := CreateWindow(
   'Button',
   'Button&1',
   WS_VISIBLE Or WS_CHILD Or BS_PUSHLIKE Or BS_TEXT Or WS_TABSTOP,
   86,
   262,
   75,
   25,
   MainWindow,
   0,
   ProgramInst,
   Nil
   );

 Button2 := CreateWindow(
   'Button',
   'Button&2',
   WS_VISIBLE Or WS_CHILD Or BS_PUSHLIKE Or BS_TEXT Or WS_TABSTOP,
   166,
   262,
   75,
   25,
   MainWindow,
   0,
   ProgramInst,
   Nil
   );

 Button3 := CreateWindow(
   'Button',
   '&Exit',
   WS_VISIBLE Or WS_CHILD Or BS_PUSHLIKE Or BS_TEXT Or WS_TABSTOP,
   246,
   262,
   75,
   25,
   MainWindow,
   0,
   ProgramInst,
   Nil
   );

 SetFocus(Edit1);

 UpdateWindow(MainWindow);

 While GetMessage(MainMessage, 0, 0, 0) Do
   Begin
     TranslateMessage(MainMessage);
     DispatchMessage(MainMessage);
   End;
 UnregisterClass(CLASSNAME, ProgramInst);
End.


Users   (2004-12-01 11:17:00) [1]

Спасибо DVM.

Подтолкнуло на мысль о вот таком коде:


 ...
 UpdateWindow(MainWindow);
 While GetMessage(MainMessage, 0, 0, 0) Do
  Begin
    if (Not IsDialogMessage(MainWindow, MainMessage)) Then
    begin
    TranslateMessage(MainMessage);
    DispatchMessage(MainMessage);
    end;
  End;


Работает переход по TAB между контролами, Enter на кнопке, ALT+буква и т.д. Т.е. работают все "вкусности" диалога.


DVM   (2004-11-24 11:34:00) [2]


> Почему не работает переход по TAB между контролами ?
> И не работает Click на фокусированной кнопке при нажатии
> Enter? Нужно ли писать самому обработчик нажатий клавиш,
> самому переводить фокус или какие то параметры контролов
> заданы не верно?

Все самому делать. Автоматически это происходит только в окнах диалога (уже сделано в их оконной процедуре)


Наверх

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