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; } }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 17-06-2006 18:08 » |
|
я в борланде ноль, но предполагаю, надо Image1MouseUp заменить на Image 3MouseUp короче говоря - обрабатывать не сообщение WM_LBUTTONUP , а сообщение WM_RBUTTONUP
|
|
|
Записан
|
|
|
|
trosh
Гость
|
|
« Ответ #2 : 17-06-2006 18:16 » |
|
короче говоря - обрабатывать не сообщение WM_LBUTTONUP , а сообщение WM_RBUTTONUP
Я об этом тоже догадываюсь, только что-то я там не дописываю. Например, в самом начале ставить: if(Button != mbLeft) return; не помогает, хотя должно
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 17-06-2006 18:19 » |
|
попробуй так
if(Button == mbRight) { //действие }
|
|
|
Записан
|
|
|
|
trosh
Гость
|
|
« Ответ #4 : 17-06-2006 18:25 » |
|
Так тоже было. Блин, я уже все варианты перебрал...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 17-06-2006 18:30 » |
|
trosh, тады не знаю. Чёт тупо всё в вашем борланде, извиняюсь
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 17-06-2006 18:31 » |
|
а под отладчиком не судьба посмотреть - что приходит во время нажатия той или иной кнопки?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 18-06-2006 12:09 » |
|
trosh, ага, программа не работает из-за севших батареек и остывшего чая Сейчас сказать ничего не могу, но завтра, если попаду на работу, посмотрю что к чему. В общем, если среди событий TImage есть касающиеся правой кнопки, то узать нужно их, а иначе никак. VCL - это довольно толстая прослойка от Win32 API - многие события уже обработаны. Писать самому на Win32 довольно гимморно - "много букф".
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #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
Специалист
Offline
|
|
« Ответ #11 : 19-06-2006 07:11 » |
|
Че то мне подсказывает, что тебе придется ловить нотификационные коды от Windows. Типа WM_SETCURSOR, и там вызывать что то вроде SetCursor. У меня на Delphi есть коды... Сам давно этим не занимался...
|
|
|
Записан
|
while (8==8)
|
|
|
trosh
Гость
|
|
« Ответ #12 : 19-06-2006 19:33 » |
|
Может как-то через TShiftState проверять? Вообще не пойму, почему проблема тут такая получается ... ?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 19-06-2006 20:37 » |
|
TShiftState Shift насколько я помню содержит флаги состояния функциональных клавиш. Таких как: Shift, Ctrl, Alt ... Я не думаю, что они как-то будут влиять на работу, если правда ты не хочеш ввести дополнительные действия. Image насколько я помню не содержит собственного хэндла окна. Вся поддержка производится через родительский класс. Мой совет: поставь брэкпоинт на начало функции и попробуй над твоим Image нажать правую клавишу мыши и посмотреть, будет ли отработана твоя функция и чему будет равна переменная Button.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #14 : 20-06-2006 00:42 » |
|
Как говорил, пример только на 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)
|
|
|
|