![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переход по 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? Нужно ли писать самому обработчик нажатий клавиш,
> самому переводить фокус или какие то параметры контролов
> заданы не верно?
Все самому делать. Автоматически это происходит только в окнах диалога (уже сделано в их оконной процедуре)