Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2012, 11:19   #1
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию Переопределение события OnMouseDown

Имеется форма с сомпонентом TWebBrowser. Необходимо обработать событие мыши OnMouseDown на этом компоненте. Это событие на панели своиств недоступно. Что можно сделать? Нужно реализовать интерфейс скроллинга "пальцем по экрану".
Aleksandr_59 вне форума Ответить с цитированием
Старый 18.05.2012, 13:04   #2
НЕ_АЙС
Форумчанин
 
Регистрация: 18.04.2007
Сообщений: 135
По умолчанию вот как-то так

Код:
type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure MessageHandler(var Msg: TMsg; var Handler: Boolean);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:= MessageHandler;
end;

procedure TForm1.MessageHandler(var Msg: TMsg; var Handler: Boolean);
begin
   if (Msg.message = WM_LBUTTONDOWN)and (Msg.hwnd=WebBrowser1.Handle)then
   Caption:= IntToStr(Msg.pt.X)+' '+IntToStr(Msg.pt.Y);
end;
end.
НЕ_АЙС вне форума Ответить с цитированием
Старый 18.05.2012, 16:25   #3
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от НЕ_АЙС Посмотреть сообщение
Код:
procedure TForm1.MessageHandler(var Msg: TMsg; var Handler: Boolean);
begin
   if (Msg.message = WM_LBUTTONDOWN)and (Msg.hwnd=WebBrowser1.Handle)then
   Caption:= IntToStr(Msg.pt.X)+' '+IntToStr(Msg.pt.Y);
end;
Попробовал - не работает. При кликом левой кнопки Msg.hwnd не равно WebBrowser1.Handle. Что-то не складывается.

Цитата:
Сообщение от Aleksandr_59 Посмотреть сообщение
Попробовал - не работает. При кликом левой кнопки Msg.hwnd не равно WebBrowser1.Handle. Что-то не складывается.
Не работает потому, что WebBrowser1.Handle не равен элементу управления загруженной веб-странички (Msg.hwnd). На пустом веб-браузере работает. Кто подскажет, как обойти?

Последний раз редактировалось Stilet; 18.05.2012 в 19:14.
Aleksandr_59 вне форума Ответить с цитированием
Старый 18.05.2012, 18:23   #4
НЕ_АЙС
Форумчанин
 
Регистрация: 18.04.2007
Сообщений: 135
По умолчанию

Хм...ну сейчас дельфи под рукой нет, посмотреть не могу. Скорее всего при загрузке странички создается окно вкладки со своим hwnd.
Ну самое элементарное, что приходит на ум для обхода
Код:
procedure TForm1.MessageHandler(var Msg: TMsg; var Handler: Boolean);
begin
   if (Msg.message = WM_LBUTTONDOWN) then
   if (курсор мыши лежит в пределах прямоугольника браузера) then  
   Caption:= IntToStr(Msg.pt.X)+' '+IntToStr(Msg.pt.Y);
end;
Координаты курсора при нажатии хранятся в Msg.Pt.X и Msg.Pt.Y
И они указывают координаты относительно экрана, а не формы. Так что не перепутайте.
НЕ_АЙС вне форума Ответить с цитированием
Старый 23.05.2012, 17:59   #5
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Сделал так: в обработчике события просматриваю все дочерние окна браузера и, если равны дескрипторы, выполняю обработчик.

Код:
procedure TForm1.MessageHandler(var Msg: TMsg; var Handler: Boolean);
begin
   if (Msg.message = WM_LBUTTONDOWN) or (Msg.message = WM_LBUTTONUP)
    or (Msg.message = WM_MOUSEMOVE) then
    begin
    iHwnd:=Msg.hwnd;
    EnumChildWindows(WebBrowser1.Handle,@AddWinInfo,LParam(1));
    if Msg.hwnd=iH then
      begin
      if Msg.message = WM_LBUTTONUP then
        Form1.OnMouseUpPr(Msg.pt.X,Msg.pt.Y);
      if Msg.message = WM_LBUTTONDOWN then
        Form1.OnMouseDownPr(Msg.pt.X,Msg.pt.Y);
      if Msg.message = WM_MOUSEMOVE then
        Form1.OnMouseMovePr(Msg.pt.X,Msg.pt.Y);
      end;
    end;
end;

function AddWinInfo(WinHandle: HWnd; List: TStringList): Boolean; stdcall;
begin
  Result:=True;
  if WinHandle=iHwnd then iH:=WinHandle;
end;

procedure TForm1.OnMouseUpPr(X, Y: Integer);
begin
  if Capturing then Capturing := false;
end;

procedure TForm1.OnMouseDownPr(X, Y: Integer);
begin
      Widget.Form1.TimerCancel.Enabled:=false;
      Widget.Form1.TimerCancel.Interval:=conTWeb;
      Widget.Form1.TimerCancel.Enabled:=true;
    Capturing := true;
    MouseDownSpot.X := x;
    MouseDownSpot.Y := Y;
end;

procedure TForm1.OnMouseMovePr(X, Y: Integer);
begin
  if Capturing and (GetKeyState(VK_LBUTTON)<0) then
  //if Capturing then
  begin
    Form1.WebBrowser1.OleObject.Document.ParentWindow.ScrollBy
      ( MouseDownSpot.X - X, MouseDownSpot.Y - Y );
    MouseDownSpot.Y:=Y;
    MouseDownSpot.X:=X;
  end;
end;
Получилось сотворить скроллинг курсором мыши (пальце по сенсорному экрану). Наверное не совсем изящно, но ничего другого в голову не пришло.
Появилась проблема: при быстром перемещении курсора не всегда происходит обработка отжатия кнопки. Пришлось ввести дополнительно определение состояния кнопки.
Aleksandr_59 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dbgrid OnMouseDown vavajke Общие вопросы Delphi 2 17.11.2010 20:01
События в WPF. Обращение к компонентам формы из события Casper-SC Общие вопросы .NET 3 25.07.2010 19:03
Переопределение события OnClick в динамическом объекте-компоненте CyberJohn Общие вопросы Delphi 8 06.01.2010 15:56
OnMouseDown в игре. Titan123 Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 29.07.2008 13:10
Переопределение реакции на события ByWatt Общие вопросы Delphi 1 20.12.2007 17:22