localmotion34 wrote:someone has to know.
Are you requesting that we should write your code, or did you
try yourself ??
If you tried yourself, its an good idea to show your current code.
Look how my above selector-examples work, look what messages
i catch, look in PSDK/MSDN what WM_MOUSEMOVE, WM_LBUTTONDOWN,
WM_LBUTTONUP etc. do, read a book about WinAPI, ...
...and look at this small'n dirty example:
Code: Select all
;
; simple gadget mover example
;
; by Danilo, 10.06.2004 - english forum
; (coded for lazy localmotion34)
;
Structure MouseBtnMover
WndProc.l
hGadget.l
Gadget.l
EndStructure
NewList oldCallbacks.MouseBtnMover()
Global MouseBtnDown , hMouseBtnDown
Global MouseBtnDownX , MouseBtnDownY
Global MouseMoveCursor, rect.RECT
Global MoveMode
Procedure DrawSelectorBox()
If StartDrawing(WindowOutput())
DrawingMode(2|4)
Box(rect\left-1,rect\Top-1,rect\right+2,rect\bottom+2)
Box(rect\left-2,rect\Top-2,rect\right+4,rect\bottom+4)
StopDrawing()
EndIf
EndProcedure
Procedure SetCurrentRect(hWnd)
GetWindowRect_(hWnd,@rect)
MapWindowPoints_(0,WindowID(0),@rect,2)
rect\right - rect\left
rect\bottom - rect\top
EndProcedure
Procedure _MoveCallback(hWnd,Msg,wParam,lParam)
If MoveMode
SetCursor_(MouseMoveCursor)
If Msg = #WM_LBUTTONDOWN Or Msg = #WM_LBUTTONDBLCLK
MouseBtnDownX = lParam&$FFFF
MouseBtnDownY = (lParam>>16)&$FFFF
MouseBtnDown = #TRUE
hMouseBtnDown = hWnd
SetCurrentRect(hWnd)
DrawSelectorBox()
GetClientRect_(WindowID(0),ClipRect.RECT)
MapWindowPoints_(WindowID(0),0,@ClipRect,2)
ClipCursor_(@ClipRect)
SetCapture_(hWnd)
ProcedureReturn 0
ElseIf Msg = #WM_LBUTTONUP
MouseBtnDown = #FALSE
DrawSelectorBox()
ForEach oldCallbacks()
If oldCallbacks()\hGadget = hWnd
ResizeGadget(oldCallbacks()\Gadget,rect\left,rect\top,-1,-1)
EndIf
Next
;MoveWindow_(hWnd,rect\left,rect\top,rect\right,rect\bottom,1)
SetCapture_(0)
ClipCursor_(0)
;InvalidateRect_(WindowID(0),0,1)
;UpdateWindow_(WindowID(0))
ProcedureReturn 0
ElseIf Msg = #WM_MOUSEMOVE
If MouseBtnDown
MouseOffsetX.w = lParam&$FFFF - MouseBtnDownX
MouseOffsetY.w = (lParam>>16)&$FFFF - MouseBtnDownY
DrawSelectorBox()
rect\left + MouseOffsetX
rect\top + MouseOffsetY
MouseBtnDownX + MouseOffsetX
MouseBtnDownY + MouseOffsetY
DrawSelectorBox()
EndIf
ProcedureReturn 0
EndIf
EndIf
ForEach oldCallbacks()
If oldCallbacks()\hGadget = hWnd
ProcedureReturn CallWindowProc_(oldCallbacks()\WndProc,Hwnd,Msg,wParam,lParam)
EndIf
Next
EndProcedure
Procedure SetMoveCallback(gadget)
AddElement(oldCallbacks())
oldCallbacks()\WndProc = SetWindowLong_(GadgetID(gadget),#GWL_WNDPROC,@_MoveCallback())
oldCallbacks()\hGadget = GadgetID(gadget)
oldCallbacks()\Gadget = gadget
EndProcedure
MouseMoveCursor = LoadCursor_(0,#IDC_SIZEALL)
OpenWindow(0,150,150,500,500,#PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_SizeGadget,"move button")
CreateGadgetList(WindowID())
CheckBoxGadget(0,10,5,100,15,"Move Mode")
ButtonGadget(1, 10,25,100,30,"Button 1")
ButtonGadget(2,120,25,100,30,"Button 2")
ListViewGadget(3,10,65,100,150)
For a = 1 To 10 : AddGadgetItem(3,-1,"ListView Item "+Str(a)) : Next a
ComboBoxGadget(4,120,65,100,200)
For a = 1 To 10 : AddGadgetItem(4,-1,"ComboBox Item "+Str(a)) : Next a
StringGadget(5,120,95,100,20,"StringGadget")
ExplorerTreeGadget(6,10,225,210,200,"c:")
ProgressBarGadget(7,120,130,100,20,0,100)
SetGadgetState(7,30)
TrackBarGadget(8,120,165,100,20,0,100)
SpinGadget(9,120,195,100,20,0,100)
SetGadgetText(9,"SpinGadget")
For a = 1 To 9 ; Add MoveCallback to all gadgets (except gadget 0)
SetMoveCallback(a)
Next a
HideWindow(0,0)
Repeat
Select WaitWindowEvent()
Case #PB_EVENT_CLOSEWINDOW
Break
Case #PB_EventGadget
Select EventGadgetID()
Case 0 ; Move Mode
MoveMode = GetGadgetState(0)
EndSelect
EndSelect
ForEver
You dont learn anything if you use this code for your own project.
You have to *understand* the main thing here:
how to handle mouse events (WM_MOUSEMOVE,WM_LBUTTONDOWN/UP,...)
with WinAPI in a callback.
If you understood how it works, why it works and what this messages
do... you can code such things and much more yourself.
And finally an old example of moving an image gadget with the mousecursor:
Code: Select all
;
; by Danilo, 23.10.2003 - german forum
;
#IMAGE = 1
Procedure WindowProc(hWnd,Msg,wParam,lParam)
Shared WindowProc_ImageInMove
Select Msg
Case #WM_LBUTTONDOWN
WindowProc_ImageInMove = 1
Case #WM_LBUTTONUP
WindowProc_ImageInMove = 0
Case #WM_MOUSEMOVE
If ChildWindowFromPoint_(hWnd,lParam & $FFFF,(lParam>>16) & $FFFF) = GadgetID(#IMAGE) And wParam&#MK_LBUTTON And WindowProc_ImageInMove
ResizeGadget(#IMAGE,(lParam & $FFFF)-GadgetWidth(#IMAGE)/2,((lParam>>16)&$FFFF)-GadgetHeight(#IMAGE)/2,-1,-1)
UpdateWindow_(hWnd) ; Win9x fix
Else
WindowProc_ImageInMove = 0
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(0,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible,"image")
SetWindowCallback(@WindowProc())
CreateGadgetList(WindowID())
If CreateImage(#IMAGE,100,100)=0
MessageRequester("ERROR","Cant create image",#MB_ICONERROR)
End
EndIf
StartDrawing(ImageOutput())
f.f = $FF / ImageHeight()
For a = 0 To ImageHeight()
Line(0,a,ImageWidth(),0,RGB($FF,f*a,$00))
Next a
StopDrawing()
ImageGadget(#IMAGE,0,0,0,0,UseImage(#IMAGE))
HideWindow(0,0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver