![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить TShiftState который в OnMouseDown используется ? [D7]
Enabled © (2005-01-09 01:52:00)Я хочу его значения в таймере использовать. Просто он удобнее, чем опрашивать клавиатуру и мышь по отдельности.
Благодарный пользователь (2005-01-21 04:01:00) [1]
> ЮЮ © (17.01.05 04:25) [12]
Спасибо, ЮЮ !
ЮЮ (2005-01-17 04:25:00) [2]
procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
Итак, обработчик соообщения Windows DoMouseDown формирует привычный для VCL TShiftState, и вызывает метод MouseDown, который вызывает уже знакомый обработчик OnMouseDown:
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;
Enabled (2005-01-17 03:02:00) [3]
> ЮЮ © (13.01.05 07:16) [9]
> Если уж хочещь TShiftState, то и делай как в VCL, благо
> код доступен, обрабаьывая соответствующие сообщения Windows
А где этот код, который доступен ? Можно его сюда запостить ?
asafr (2005-01-13 12:02:00) [4]Ну а так? Зачем Timer-то?
public
procedure WMLBUTTONDBLCLK (var Message: TMessage); message WM_LBUTTONDBLCLK;
{ Public declarations }
end;
.........
.........
implementation
{$R *.dfm}
procedure TForm1.WMLBUTTONDBLCLK(var Message: TMessage);
begin
Label1.Caption:='Ура!';
end;
ЮЮ (2005-01-13 07:16:00) [5]>Ну, так сделай для ssDouble, если можно.
Типа DoubleClick по таймеру обнаружить? :) Если уж хочещь TShiftState, то и делай как в VCL, благо код доступен, обрабаьывая соответствующие сообщения Windows, а не опрашивая устройства в таймере
Enabled (2005-01-13 06:57:00) [6]
> Gero © (12.01.05 17:18) [7]
> if GetKeyState(VK_SHIFT) < 0
Надо не VK_SHIFT, а TShiftState, в котором много параметров.
> asafr © (12.01.05 12:18) [6]
> аналогии можно поступить с остальными кнопками, описаными
> в TShiftState...
Ну, так сделай для ssDouble, если можно.
Gero (2005-01-12 17:18:00) [7]if GetKeyState(VK_SHIFT) < 0
asafr (2005-01-12 12:18:00) [8]Вот пример функции, отлавливающей нажатие Shift и заталкиваешь в обработку таймера. По аналогии можно поступить с остальными кнопками, описаными в TShiftState...
function TForm1.ShiftKeyDown : boolean;
begin
result:=(Word(GetKeyState(VK_SHIFT)) and $8000)<>0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ShiftKeyDown then Label1.Caption:='Ура!';
end;
begin...end (2005-01-12 08:56:00) [9]> [4] Enabled (12.01.05 01:34)
Тогда попробуйте GetKeyboardState.
Enabled (2005-01-12 01:34:00) [10]Это не даёт TShiftState, а даёт лишь некоторые значения. Кроме того, требует многократного обращения к одной и той же функции, с разными параметрами, что скорости не добавляет.
Дмитрий В. Белькевич (2005-01-09 06:12:00) [11]F1?
Enabled (2005-01-09 02:46:00) [12]
function GetAsyncKeyState(vKey: Integer): SHORT; stdcall;
И что это ? Какой vKey ей посылать ? И как ею воспользоваться вообще ?
Kerk (2005-01-09 01:53:00) [13]GetAsyncKeyState