| 
			| 
					
						| 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  заменить на Image3 MouseUp   короче говоря - обрабатывать не сообщение 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 | 
								|  | « Ответ #9 : 18-06-2006 12:09 »  |  | 
 
 trosh, ага, программа не работает из-за севших батареек и остывшего чая   Сейчас сказать ничего не могу, но завтра, если попаду на работу, посмотрю что к чему. В общем, если среди событий TImage есть касающиеся правой кнопки, то узать нужно их, а иначе никак. VCL - это довольно толстая прослойка от Win32 API - многие события уже обработаны. Писать самому на Win32 довольно гимморно - "много букф". |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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)  |  |  | 
	|  |