Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Mouse  (Прочитано 15019 раз)
0 Пользователей и 1 Гость смотрят эту тему.
trosh
Гость
« : 17-06-2006 18:01 » 

Привет всем!
Здесь, при нажатии на кнопку мыши, меняется курсор (рука хватает).
Как сделать так, чтобы хватало при нажатии на правую кнопку, а не на левую?
Нелпы не помогли..  Улыбаюсь
Код:
void __fastcall TMainForm::Image1MouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
//
 HCURSOR hCursor=LoadImage
                  (GetModuleHandle(NULL),
                    "HAND_OPEN",IMAGE_CURSOR,0,0,
                    LR_COPYFROMRESOURCE | LR_CREATEDIBSECTION);
 if(hCursor == 0) ShowMessage(""Курсор не загружен"");
 else
 {
  Screen->Cursors[1] = hCursor;
  Image1->Cursor =(TCursor)1;
 }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
//
 HCURSOR hCursor=LoadImage
                  (GetModuleHandle(NULL),
                    "HAND_GRAB",IMAGE_CURSOR,0,0,
                    LR_COPYFROMRESOURCE | LR_CREATEDIBSECTION);
 if(hCursor == 0) ShowMessage(""Курсор не загружен"");
 else
 {
  Screen->Cursors[1] = hCursor;
  Image1->Cursor =(TCursor)1;
 }
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 17-06-2006 18:08 » 

я в борланде ноль, но предполагаю, надо  Image1MouseUp  заменить на Image3MouseUp Улыбаюсь

короче говоря - обрабатывать не сообщение WM_LBUTTONUP  ,  а сообщение WM_RBUTTONUP
Записан

trosh
Гость
« Ответ #2 : 17-06-2006 18:16 » 

короче говоря - обрабатывать не сообщение WM_LBUTTONUP  ,  а сообщение WM_RBUTTONUP
Я об этом тоже догадываюсь, только что-то я там не дописываю.
Например, в самом начале ставить: if(Button != mbLeft) return;
не помогает, хотя должно Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 17-06-2006 18:19 » 

попробуй так

if(Button == mbRight)
{
   //действие
}
Записан

trosh
Гость
« Ответ #4 : 17-06-2006 18:25 » 

Так тоже было. Блин, я уже все варианты перебрал...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 17-06-2006 18:30 » 

trosh, тады не знаю.  Чёт тупо всё в вашем борланде, извиняюсь Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 17-06-2006 18:31 » 

а под отладчиком не судьба посмотреть - что приходит во время нажатия той или иной кнопки?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 17-06-2006 19:28 » 

trosh, первая ошибка: Открываеш ресурс в функции и затем не закрываеш его. Я бы объявил в описании класса TMainForm переменную HCURSOR hCursor. В обработчике OnCreate  инцилизировал бы ее и в OnDestroy осбождал бы ресурс. Попробуй примерно такой код:
Код:
void __fastcall TMainForm::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 if(hCursor == 0) ShowMessage(""Курсор не загружен"");
 else
 {
  if (Button == mbRight)
      {
           Screen->Cursors[1] = hCursor;
            Image1->Cursor =(TCursor)1;
      }
 }
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
trosh
Гость
« Ответ #8 : 17-06-2006 19:50 » 

А эти косяки возможны из-за мышки? У меня COM-овская сейчас, у PS/2 батарейки сдохли  Отлично
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 18-06-2006 12:09 » 

trosh, ага, программа не работает из-за севших батареек и остывшего чая Ага

Сейчас сказать ничего не могу, но завтра, если попаду на работу, посмотрю что к чему.
В общем, если среди событий TImage есть касающиеся правой кнопки, то узать нужно их, а иначе никак. VCL - это довольно толстая прослойка от Win32 API - многие события уже обработаны. Писать самому на Win32 довольно гимморно - "много букф".
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 19-06-2006 05:35 » 

Цитата
Occurs when the user presses a mouse button with the mouse pointer over a control.

typedef void __fastcall (__closure *TMouseEvent)(System::TObject* Sender, TMouseButton Button, Classes::TShiftState Shift, int X, int Y);

__property TMouseEvent OnMouseDown = {read=FOnMouseDown, write=FOnMouseDown};

Description

Use the OnMouseDown event handler to implement any special processing that should occur as a result of pressing a mouse button.

The OnMouseDown event handler can respond to left, right, or center mouse button presses and shift key plus mouse-button combinations. Shift keys are the Shift, Ctrl, and Alt keys. X and Y are the pixel coordinates of the mouse pointer in the client area of the Sender.
--------------------------------------------------------------------------
TMouseButton defines the mouse-button constants used by mouse-event handlers.

Unit

Controls

enum TMouseButton { mbLeft, mbRight, mbMiddle };

Description

The TMouseButton type defines the mouse-button constants used by mouse-event handlers to distinguish which button generated the mouse event.

В общем все, как сказал Finch.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #11 : 19-06-2006 07:11 » 

Че то мне подсказывает, что тебе придется ловить нотификационные коды от Windows.
Типа WM_SETCURSOR, и там вызывать что то вроде SetCursor. У меня на Delphi есть коды... Сам давно этим не занимался...
Записан

while (8==8)
trosh
Гость
« Ответ #12 : 19-06-2006 19:33 » 

Может как-то через TShiftState проверять?
Вообще не пойму, почему проблема тут такая получается ... ?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 19-06-2006 20:37 » 

TShiftState Shift насколько я помню содержит флаги состояния функциональных клавиш. Таких как: Shift, Ctrl, Alt ... Я не думаю, что они как-то будут влиять на работу, если правда ты не хочеш ввести дополнительные действия. Image насколько я помню не содержит собственного хэндла окна. Вся поддержка производится через родительский класс. Мой совет: поставь брэкпоинт на начало функции и попробуй над твоим Image нажать правую клавишу мыши и посмотреть, будет ли отработана твоя функция и чему будет равна переменная Button.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sss
Специалист

ru
Offline Offline

« Ответ #14 : 20-06-2006 00:42 » new

Как говорил, пример только на Delphi 5, писал это очень давно.
Код:

TImageViewPanel = class (TCustomPanel)
....
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
    procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
....
end;

procedure TImageViewPanel.WMLButtonUp(var Message: TWMLButtonUp);
begin
 inherited;
 FMouseUp := True;
 WMSetCursor(TWMSetCursor(Message));
end;

procedure TImageViewPanel.WMMouseMove(var Message: TWMMouseMove);
begin
 inherited;
 if FMouseUp then Exit;
 if not FSavedPos then
  begin
   FOldPos := Message.Pos;
   FSavedPos := True;
  end else
   begin
    OriginImage(Message.Pos.X - FOldPos.X, Message.Pos.Y - FOldPos.Y);
    FOldPos := Message.Pos;
   end;
end;
procedure TImageViewPanel.WMSetCursor(var Message: TWMSetCursor);
begin
 if Empty then SetCursor( FEmptyCur) else

 if FMouseUp then SetCursor( FHandFree)
             else SetCursor(FHandPress);
end;

procedure TImageViewPanel.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
 inherited;
 FMouseUp := False;
 FSavedPos := False;
 WMSetCursor(TWMSetCursor(Message));
end;

procedure TImageViewPanel.WMLButtonDown(var Message: TWMLButtonDown);
begin
 inherited;
 FMouseUp := False;
 FSavedPos := False;
 WMSetCursor(TWMSetCursor(Message));
end;

Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines