RubberBand Selection PhotoShop style. No screen

Just starting out? Need help? Post your questions and find answers here.
SiggeSvahn
User
User
Posts: 40
Joined: Wed Oct 06, 2010 9:37 pm

RubberBand Selection PhotoShop style. No screen

Post by SiggeSvahn »

Hi forum! I'm a newbie. Hopefully you experienced guys can improve this rubberband selection tool. Thanks to member Thorium it's now flickerfree. The only difference is the single code line by the option gadgets. Thoriums advice removed the flicker. No need to use BitBlt any more (unvoluntarily). I dislike "screens" since they change the "feel" (resolution) of my monitor (and it even goes BOING when using full screens).

Here you go:

Code: Select all

EnableExplicit
Define.l lMouse, FlagDrag, n

Structure udtMousePos
  lMoX.l
  lMoY.l
EndStructure

Define.udtMousePos udvMouseXY, udvOldMouseXY ,udvStartPosXY

;==============================================================
;   CONSTANTS 
;==============================================================

#LMouseButtonUp = 0

Enumeration
  #Main_Window
  #ImageOriginal
  #ImageCanvas
  #ImageGadgetBG
  #OptImageGadget
  #OptSetGadget
EndEnumeration


Procedure Draw_RubberBand()
  Define.l ctrX, ctrY, lSwitch, lModuloRest
  Shared udvMouseXY, udvStartPosXY
  CopyImage(#ImageOriginal,#ImageCanvas);Clearing the old rubberband.
  If StartDrawing(ImageOutput(#ImageCanvas))
    
    For ctrX = udvStartPosXY\lMoX To (udvMouseXY\lMoX - 3) Step 4;Line with dashes 4 pixels wide.
      lSwitch= 1 - lSwitch
;       If udvMouseXY\lMoX - udvStartPosXY\lMoX > 20
;         Debug ""
;       EndIf
       LineXY(ctrX, udvStartPosXY\lMoY, ctrX + 3, udvStartPosXY\lMoY,#White * lSwitch)
    Next ctrX;Row below taking care of rest (modulus) pixel 1 to 3 if any.
    If ctrX-4+3 < (udvMouseXY\lMoX);If last dravingstartpoint+3px was smaller than desired endpoint.
      lModuloRest = (udvMouseXY\lMoX) - (ctrX-4+3)
      LineXY(ctrX-4+3, udvStartPosXY\lMoY, udvMouseXY\lMoX , udvStartPosXY\lMoY,#White * (1-lSwitch))
    EndIf
  
    For ctrY = udvStartPosXY\lMoY To (udvMouseXY\lMoY-3) Step 4;Dashed line with 3 pixels
      lSwitch= 1 - lSwitch
      LineXY(udvStartPosXY\lMoX, ctrY, udvStartPosXY\lMoX, ctrY + 3, #White * lSwitch)
    Next ctrY;Row below taking care of rest (modulus) pixel 1 to 3 if any.
    If ctrY-4+3 < (udvMouseXY\lMoY);If last dravingstartpoint+3px was smaller than desired endpoint.
      lModuloRest = (udvMouseXY\lMoY) - (ctrY-4+3)
      LineXY(udvStartPosXY\lMoX, ctrY-4+3, udvStartPosXY\lMoX, udvMouseXY\lMoY,#White * (1-lSwitch))
    EndIf
  
    For ctrX = udvStartPosXY\lMoX To (udvMouseXY\lMoX - 3) Step 4;Dashed line with 3 pixels
      lSwitch= 1 - lSwitch
      LineXY(ctrX, udvMouseXY\lMoY, ctrX + 3, udvMouseXY\lMoY,#White * lSwitch)
    Next ctrX;Row below taking care of rest (modulus) pixel 1 to 3 if any.
    If ctrX-4+3 < (udvMouseXY\lMoX);If last dravingstartpoint+3px was smaller than desired endpoint.
      lModuloRest = (udvMouseXY\lMoX) - (ctrX-4+3)
      LineXY(ctrX-4+3, udvStartPosXY\lMoY, udvMouseXY\lMoX , udvStartPosXY\lMoY,#White * (1-lSwitch))
    EndIf
  
    For ctrY = udvStartPosXY\lMoY To (udvMouseXY\lMoY - 3) Step 4;Dashed line with 3 pixels
      lSwitch= 1 - lSwitch
      LineXY(udvMouseXY\lMoX, ctrY, udvMouseXY\lMoX, ctrY + 3, #White * lSwitch)
    Next ctrY;Row below taking care of rest (modulus) pixel 1 to 3 if any.
    If ctrY-4+3 < (udvMouseXY\lMoY);If last dravingstartpoint+3px was smaller than desired endpoint.
      lModuloRest = (udvMouseXY\lMoY) - (ctrY-4+3)
      LineXY(udvMouseXY\lMoX, ctrY-4+3, udvMouseXY\lMoX, udvMouseXY\lMoY,#White * (1-lSwitch))
    EndIf
    
  StopDrawing()
    
  Select #True
     Case GetGadgetState(#OptImageGadget)
       ImageGadget(#ImageGadgetBG,#PB_Any,#PB_Any,#PB_Any,#PB_Any,ImageID(#ImageCanvas))
       
     Case GetGadgetState(#OptSetGadget)
       SetGadgetState(#ImageGadgetBG, ImageID(#ImageCanvas))
  EndSelect
  
EndIf;Regarding StartDrawing(ImageOutput(#ImageCanvas))     
EndProcedure

;================================================================================
;     GADGETS
;================================================================================

CreateImage(#ImageOriginal, 222,222)
StartDrawing(ImageOutput(#ImageOriginal))
  Box(0,0,222,222,#Blue)
StopDrawing()

CopyImage(#ImageOriginal,#ImageCanvas)

OpenWindow(#Main_Window,0,0,222,222,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

ImageGadget(#ImageGadgetBG,0,0,160,120,ImageID(#ImageOriginal))
DisableGadget(#ImageGadgetBG,1); Has to be DISABLED to allow actions from the optiongadgets.

OptionGadget(#OptImageGadget,0,0,133,13, "ImageGadget - Flicker")
OptionGadget(#OptSetGadget,0,15,133,13, "SetGadget - No Flicker")

;==========================================================================================
;     MAIN LOOP
;==========================================================================================
Repeat
WaitWindowEvent()
  ;---SENSE MOUSE MOVEMENTS *********************************
lMouse = GetAsyncKeyState_(#VK_LBUTTON);API MS_WINDOWS.   *
;******* HOVERING MOUSEOVER ********************************
udvMouseXY\lMoX = WindowMouseX(#Main_Window)
udvMouseXY\lMoY = WindowMouseY(#Main_Window)

;Debug EventGadget()
Select EventGadget()
  Case   #OptImageGadget
    DisableGadget(#ImageGadgetBG,0); Has to be ENABLED below to make the EventGadget() = #ImageGadgetBG work.

  Case #OptSetGadget 
    DisableGadget(#ImageGadgetBG,0); Has to be ENABLED below to make the EventGadget() = #ImageGadgetBG work.

  Case #ImageGadgetBG;Something action is happening on #ImageGadgetBG.
  ;MessageRequester("","EventGadget() = #ImageGadgetBG")
 ;*** DETECTING IF USER HITS THE MOUSE BUTTON FOR A FRESH ROUND *** IF SO THE DO INITIATE THE DRAWING COORDINATES ****************
  If lMouse<> #LMouseButtonUp;This means that mousebutton is DOWN. I don't normally use #LMouseButtonDown because PB gives me several flags from the mouse down.
   If FlagDrag=#False;Waiting for user to hit the mousebuton.
      FlagDrag=#True
      udvStartPosXY = udvMouseXY;starting to detect differences in mousepos aka movements.
      ;n+1:SetWindowTitle(0,Str(n) + " visits in StartPos!")
   EndIf
  EndIf
  DisableGadget(#ImageGadgetBG,1); Has to be DISABLED to work as a stable container.

  SetWindowTitle(#Main_Window,Str(FlagDrag))
 
EndSelect;Regarding EventGadget()

;SetWindowTitle(#Main_Window,Str(lMouse))
   ;*** DETECTING IF MOUSE I STILL DOWN AND MOVING ELSE 
  If FlagDrag = #True
   If lMouse <> #LMouseButtonUp;This means that mousebutton is DOWN. I don't normally use #LMouseButtonDown because PB gives me several flags from the mouse down.
       If  udvMouseXY <> udvOldMouseXY; If mouse has moved.
         Draw_RubberBand()
       EndIf
   Else
     FlagDrag = #False;MouseButton is UP.
     MessageRequester("","Please click option before trying again!")
     DisableGadget(#ImageGadgetBG,1); Has to be DISABLED to make the other gadgets work.
     ;*** REFRESH GADGETS ***
     SetActiveGadget(#OptImageGadget)
     SetActiveGadget(#OptSetGadget)

   EndIf
 EndIf

Until WaitWindowEvent()=#WM_CLOSE
Last edited by SiggeSvahn on Thu Jan 13, 2011 9:13 pm, edited 2 times in total.
Newbie
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: RubberBand Selection PhotoShop style. No screen

Post by netmaestro »

Here's some code ripped from a project of mine, see if there's anything of interest (my rope icon is crappy, it's not the one from my project) Anyway, it will run as posted without dependencies:

Code: Select all

;==============================================
;                 STRUCTURES
;==============================================

Structure WINDOWDATA
  oldproc.l
  win.l
  imain.l
  gmain.l
  imap.l
  gmap.l
  numanchors.l
  anchor.POINT[16000]
  anchortype.b[16000]
EndStructure

Structure ARGB
  alpha.l
  red.l
  green.l
  blue.l
EndStructure

With alphablue.ARGB
  \alpha = 128
  \red = 0
  \green = 0
  \blue = 255
EndWith

;==============================================
;                 GLOBALS
;==============================================

ExamineDesktops()
Global freq = DesktopFrequency(0)

Global twimage, hook, imgcx, imgcy, curwindow, toolwindow
Global finisheddrawing, numanchors=0
Global btnLasso, btnRect, btnEllipse, tid
Global imgLasso, imgLassoH, imgRect, imgRectH, imgEllipse, imgEllipseH

*unpacked = AllocateMemory(12344)
UnpackMemory(?PicPak, *unpacked)
hatch = CatchImage(#PB_Any, *unpacked, 12344)
FreeMemory(*unpacked)

Global hatch1 = GrabImage(hatch, #PB_Any, 0,0,32,32)
Global hatch2 = GrabImage(hatch, #PB_Any, 32,0,32,32)
Global hatch3 = GrabImage(hatch, #PB_Any, 64,0,32,32)
Global hatch4 = GrabImage(hatch, #PB_Any, 96,0,32,32)

Global lb1.LOGBRUSH
With lb1
  \lbStyle = #BS_PATTERN
  \lbColor = #Red
  \lbHatch = ImageID(hatch1)
EndWith

Global lb2.LOGBRUSH
With lb2
  \lbStyle = #BS_PATTERN
  \lbColor = #Red
  \lbHatch = ImageID(hatch2)
EndWith

Global lb3.LOGBRUSH
With lb3
  \lbStyle = #BS_PATTERN
  \lbColor = #Red
  \lbHatch = ImageID(hatch3)
EndWith

Global lb4.LOGBRUSH
With lb4
  \lbStyle = #BS_PATTERN
  \lbColor = #Red
  \lbHatch = ImageID(hatch4)
EndWith

Global pen = CreatePen_(#PS_SOLID, 1, #White)
Global pen1 = ExtCreatePen_(#PS_GEOMETRIC|#PS_SOLID, 1, lb1, 0, 0)
Global pen2 = ExtCreatePen_(#PS_GEOMETRIC|#PS_SOLID, 1, lb2, 0, 0)
Global pen3 = ExtCreatePen_(#PS_GEOMETRIC|#PS_SOLID, 1, lb3, 0, 0)
Global pen4 = ExtCreatePen_(#PS_GEOMETRIC|#PS_SOLID, 1, lb4, 0, 0)
Global curpen = pen

Global brush = CreateHatchBrush_(#HS_CROSS, #Blue)
;==============================================
;                 MACROS
;==============================================

Macro LOWORD(Value) 
  Value & $FFFF 
EndMacro 

Macro HIWORD(Value) 
  (Value >> 16) & $FFFF 
EndMacro 

UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()

Procedure CbtProc(nCode, wParam, lParam) 
  Select nCode 
    Case #HCBT_CREATEWND 
      hWnd = wParam 
      *pcbt.CBT_CREATEWND = lParam 
      *pcs.CREATESTRUCT = *pcbt\lpcs
      *pcs\x = 66 + *pcs\x 
      If imgcx+13 <= WindowWidth(0)
        *pcs\cx = imgcx + 13
      Else
        *pcs\cx = WindowWidth(0)-100
      EndIf
      If imgcy <= WindowHeight(0)
        *pcs\cy = imgcy + 59
      Else
        *pcs\cy = WindowHeight(0)-80
      EndIf
  EndSelect 
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, lParam) 
 EndProcedure 

Procedure AnchorProc(hwnd, msg, wparam, lparam)
  oldproc = GetProp_(hwnd, "oldproc")
  Select msg
    Case #WM_NCDESTROY
      RemoveProp_(hwnd, "oldproc")
    Case #WM_LBUTTONDOWN
      y=HIWORD(lparam)
      If y <= 17
        ;ReleaseCapture_()
        SendMessage_(hwnd, #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
      EndIf
    Case #WM_WINDOWPOSCHANGING
      GetWindowPlacement_(hwnd, @wr.WINDOWPLACEMENT)
      *wp.WINDOWPOS = lparam
      If Not GetAsyncKeyState_(#VK_LBUTTON) & 32768
        With *wp
          \x = wr\rcnormalposition\left
          \y = wr\rcnormalposition\top
          \cx = ImageWidth(twimage)
          \cy = ImageHeight(twimage)
        EndWith
        ProcedureReturn 0
      Else
        ;================================
        ;  Stay inside window section
        ;================================
        If *wp\x < 0
          *wp\x = 0
        EndIf
        If *wp\y < 0
          *wp\y = 0
        EndIf
        If *wp\x > GadgetWidth(0)-WindowWidth(toolwindow)-5
          *wp\x = GadgetWidth(0)-WindowWidth(toolwindow)-5
        EndIf
        If *wp\y > GadgetHeight(0)-WindowHeight(toolwindow)-5
          *wp\y = GadgetHeight(0)-WindowHeight(toolwindow)-5
        EndIf
        ProcedureReturn 0
     EndIf
   Default
    ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
  EndSelect
EndProcedure

Procedure AnimatePen(hwnd)
  del=120
  Repeat
    curpen = pen4
    InvalidateRect_(hwnd, 0,1)
    Delay(del)
    curpen = pen3
    InvalidateRect_(hwnd, 0,1)
    Delay(del)
    curpen = pen2
    InvalidateRect_(hwnd, 0,1)
    Delay(del)
    curpen = pen1
    InvalidateRect_(hwnd, 0,1)
    Delay(del)
  ForEver
EndProcedure

Procedure ImageCallback(hwnd, msg, wparam, lparam)
  Static fin
  
  result = #PB_Any
  
  *wd.WINDOWDATA = GetProp_(hwnd, "windata")
  
  With *wd
    oldproc       = \oldproc   
    window        = \win       
    imain         = \imain     
    gmain         = \gmain     
    imap          = \imap      
    gmap          = \gmap      
  EndWith       
 
  Select msg
 
    Case #WM_NCDESTROY
      RemoveProp_(hwnd, "windata")
 
    Case #WM_PAINT
      
      hdc = BeginPaint_(hwnd, ps.PAINTSTRUCT)

      dcin = StartDrawing(ImageOutput(imain))
        BitBlt_(hdc, 0,0,ImageWidth(imain),ImageHeight(imain),dcin,0,0,#SRCCOPY)
      StopDrawing()
      If fin=0 Or IsThread(tid)=0
        SetROP2_(hdc, #R2_XORPEN)
      EndIf
      SelectObject_(hdc, curpen)
      PolyDraw_(hdc, @*wd\anchor[0], @*wd\anchortype[0], *wd\numanchors) 
      If finisheddrawing
        rgn = CreatePolygonRgn_(@*wd\anchor[0], *wd\numanchors, #WINDING)
        hdc2 = StartDrawing(ImageOutput(imap))
          SetBkMode_(hdc2, #TRANSPARENT)
          FillRgn_(hdc2, rgn, brush)
        StopDrawing()
        InvalidateRect_(GadgetID(gmap),0,1)
        tid = CreateThread(@AnimatePen(),hwnd)
        fin=1
        finisheddrawing = 0
      EndIf     
      EndPaint_(hwnd, ps)
      result = 0
      
    Case #WM_LBUTTONDOWN
      If IsThread(tid)
        KillThread(tid)
        curpen=pen
      EndIf
      RtlZeroMemory_(@*wd\anchor[0], 16000*SizeOf(point))
      RtlZeroMemory_(@*wd\anchortype[0], 16000)
      
      x = LOWORD(lparam)
      y = HIWORD(lparam)
      *wd\anchor[0]\x=x
      *wd\anchor[0]\y=y
      *wd\anchortype[0] = #PT_MOVETO
      *wd\numanchors = 0
      InvalidateRect_(hwnd,0,1)
      
    Case #WM_LBUTTONUP
      finisheddrawing = 1
      If *wd\numanchors
        *wd\anchortype[*wd\numanchors-1] = #PT_LINETO|#PT_CLOSEFIGURE
      Else
        *wd\anchortype[0] = #PT_LINETO|#PT_CLOSEFIGURE
      EndIf
      InvalidateRect_(hwnd, 0, 1)        
  
    Case #WM_MOUSEMOVE
      If GetAsyncKeyState_(#VK_LBUTTON) & 32768
        x = LOWORD(lparam)
        y = HIWORD(lparam)
        *wd\numanchors+1
        *wd\anchor[*wd\numanchors]\x = x
        *wd\anchor[*wd\numanchors]\y = y
        *wd\anchortype[*wd\numanchors] = #PT_LINETO
        InvalidateRect_(hwnd, 0, 0)
      EndIf
  EndSelect
  
  If result = #PB_Any
    ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
  Else
    ProcedureReturn result
  EndIf
  
EndProcedure



Procedure GetImage(picin.s)
  Pattern$ = "Image Files (*.bmp, *.jpg, *.png, *.tif)|*.bmp;*.jpg;*.png;*.tif" 
  If picin = "" 
    picin.s = OpenFileRequester("Choose an image file", "", pattern$, 0) 
  EndIf
  If picin <> "" And picin <> " "
    thisimage = LoadImage(#PB_Any, picin)
    If IsImage(thisimage)
      thismap = CreateImage(#PB_Any,ImageWidth(thisimage),ImageHeight(thisimage),24)
      imgcx = ImageWidth(thisimage) 
      imgcy = ImageHeight(thisimage)
      hook = SetWindowsHookEx_(#WH_CBT, @CbtProc(), #Null, GetCurrentThreadId_()) 
      thiswindow = AddGadgetItem(0,#PB_Any,"")
      UnhookWindowsHookEx_(hook)      
      SmartWindowRefresh(thiswindow, 1)
      thispanel = PanelGadget(#PB_Any,0,0,WindowWidth(thiswindow),WindowHeight(thiswindow))
      AddGadgetItem(thispanel,0,"Image View")
      If ImageWidth(thisimage) <= GadgetWidth(thispanel)-12 And ImageHeight(thisimage) <= GadgetHeight(thispanel)-59
        thisimagegadget = ImageGadget(#PB_Any,0,0,0,0,ImageID(thisimage))
      Else
        scroll1  = ScrollAreaGadget(#PB_Any,0,0,GadgetWidth(thispanel),GadgetHeight(thispanel)-21,ImageWidth(thisimage),ImageHeight(thisimage),1)
        thisimagegadget = ImageGadget(#PB_Any,0,0,0,0,ImageID(thisimage))
        CloseGadgetList()
      EndIf
      oldproc = SetWindowLong_(GadgetID(thisimagegadget),#GWL_WNDPROC,@ImageCallBack())
      AddGadgetItem(thispanel,1,"Map View")
      If ImageWidth(thisimage) <= GadgetWidth(thispanel)-12 And ImageHeight(thisimage) <= GadgetHeight(thispanel)-59
        thisimagegadget2 = ImageGadget(#PB_Any,0,0,0,0,ImageID(thismap))
      Else
        scroll2  = ScrollAreaGadget(#PB_Any,0,0,GadgetWidth(thispanel),GadgetHeight(thispanel)-21,ImageWidth(thisimage),ImageHeight(thisimage),1)
        thisimagegadget2 = ImageGadget(#PB_Any,0,0,0,0,ImageID(thismap))
        CloseGadgetList()
      EndIf
      UseGadgetList(WindowID(0))
      *windata.WINDOWDATA = AllocateMemory(SizeOf(WINDOWDATA))
      With *windata
        \oldproc    = oldproc
        \win        = thiswindow
        \imain      = thisimage
        \gmain      = thisimagegadget
        \imap       = thismap
        \gmap       = thisimagegadget2
        \numanchors = 0
        \anchortype[0]  = #PT_MOVETO
      EndWith      
      SetProp_(GadgetID(thisimagegadget), "windata", *windata)
    Else
      MessageRequester("Error:","Cannot open that image",#MB_ICONERROR)
    EndIf
  EndIf
EndProcedure

SystemParametersInfo_(#SPI_GETWORKAREA,0,@wa.RECT,0) ; Client area of the desktop 
Global deskw = wa\right - GetSystemMetrics_(#SM_CXFIXEDFRAME)*2
Global deskh = wa\bottom - (GetSystemMetrics_(#SM_CYFIXEDFRAME)*2 + GetSystemMetrics_(#SM_CYCAPTION))

*unpacked = AllocateMemory(84920)
UnpackMemory(?tw, *unpacked)
twimage = CatchImage(#PB_Any, *unpacked, 84920)
FreeMemory(*unpacked)

*unpacked = AllocateMemory(4286)
UnpackMemory(?lass, *unpacked)
tmplasso = CatchImage(#PB_Any, *unpacked, 4286)
FreeMemory(*unpacked)

imgLasso = CreateImage(#PB_Any, 25,25,#PB_Image_DisplayFormat)
hdc=StartDrawing(ImageOutput(imgLasso))
  Box(0,0,25,25,GetSysColor_(#COLOR_BTNFACE))
  DrawIconEx_(hdc,0,0,ImageID(tmpLasso),26,26,0,0,#DI_COMPAT|#DI_NORMAL)
StopDrawing()
imgLassoH = CreateImage(#PB_Any, 24,24,#PB_Image_DisplayFormat)
hdc=StartDrawing(ImageOutput(imgLassoH))
  Box(0,0,25,25,#White)
  DrawIconEx_(hdc,0,0,ImageID(tmpLasso),24,24,0,0,#DI_COMPAT|#DI_NORMAL)
StopDrawing()
FreeImage(tmpLasso)


OpenWindow(0,0,0,deskw,deskh,"ImageMap Editor",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SystemMenu)

CreateMenu(0, WindowID(0))
 MenuTitle("File")
   MenuItem(0, "Load Image File")
   MenuItem(99, "Exit")
 MenuTitle("Window")
   MenuItem(0, "self created item")
   MenuItem(1, "self created item")
MDIGadget(0,0,0,0,0,1,100,#PB_MDI_AutoSize)

toolwindow = AddGadgetItem(0, #PB_Any, "")
HideWindow(toolwindow,1)
tw = WindowID(toolwindow)
 
SetWindowLong_(tw,#GWL_STYLE,GetWindowLong_(tw,#GWL_STYLE) &~ #WS_SYSMENU)
SetWindowLong_(tw,#GWL_STYLE,GetWindowLong_(tw,#GWL_STYLE) &~ #WS_THICKFRAME)
SetWindowLong_(tw,#GWL_STYLE,GetWindowLong_(tw,#GWL_STYLE) &~ #WS_CAPTION)
SetWindowLong_(tw,#GWL_STYLE,GetWindowLong_(tw,#GWL_STYLE) &~ #WS_BORDER)
SetWindowPos_(tw,0,0,0,0,0,39)
ResizeWindow(toolwindow,0,0,ImageWidth(twimage),ImageHeight(twimage))

bkgnd = ImageGadget(#PB_Any,0,0,0,0,ImageID(twimage))
DisableGadget(bkgnd, 1)

btnLasso = ButtonImageGadget(#PB_Any, 17,30,30,30,ImageID(imgLasso),#PB_Button_Toggle)
SetGadgetAttribute(btnLasso,2,ImageID(imgLassoH))

HideWindow(toolwindow,0)
oldproc = SetWindowLong_(tw, #GWL_WNDPROC, @AnchorProc())
SetProp_(tw, "oldproc", oldproc)

quit=0
Repeat
  EventID = WaitWindowEvent()
  Select EventID
    Case #PB_Event_CloseWindow
      If EventWindow() = 0
        quit=1
      Else
        CloseWindow(EventWindow())
      EndIf
    Case #PB_Event_Menu
      Select EventMenu()
        Case 0
          GetImage("")
        Case 99
          quit=1
      EndSelect
  EndSelect    
Until quit

DataSection
  tw:
  Data.b $4A,$43,$B8,$4B,$01,$00,$A1,$63,$3C,$9E,$BB,$A9,$D0,$20,$8A,$04,$5C,$8A,$65,$04
  Data.b $D8,$24,$DD,$12,$50,$09,$46,$06,$68,$02,$10,$04,$8F,$01,$10,$59,$28,$31,$BF,$14
  Data.b $60,$13,$1B,$30,$89,$59,$E7,$DF,$9F,$FE,$6C,$7E,$1F,$ED,$9D,$7A,$B7,$05,$EC,$BB
  Data.b $01,$43,$FB,$78,$1F,$D8,$75,$03,$06,$FE,$FF,$3F,$B0,$F9,$19,$00,$DE,$FF,$F3,$D7
  Data.b $7F,$4F,$9E,$B5,$6D,$17,$1B,$79,$77,$EE,$DE,$90,$8E,$3D,$EE,$6E,$80,$29,$6C,$1C
  Data.b $F9,$75,$8D,$E3,$CA,$8D,$81,$99,$D9,$B6,$B2,$7B,$6F,$00,$66,$FC,$1D,$49,$C1,$3E
  Data.b $DE,$02,$97,$FC,$EF,$DF,$01,$26,$A9,$F0,$FD,$FE,$F9,$BA,$01,$B3,$89,$FE,$AC,$57
  Data.b $17,$6F,$F8,$25,$2C,$A1,$3C,$40,$7D,$FB,$93,$19,$30,$92,$94,$60,$F9,$2B,$37,$84
  Data.b $F1,$C0,$03,$53,$85,$E5,$30,$1E,$60,$1E,$9E,$61,$5C,$DB,$2A,$18,$27,$30,$50,$8B
  Data.b $E5,$B7,$50,$24,$15,$0C,$B7,$80,$19,$57,$3D,$D2,$A3,$7F,$F6,$92,$F8,$F2,$18,$00
  Data.b $3E,$FB,$C0,$3A,$14,$5D,$17,$63,$60,$FE,$18,$87,$30,$F7,$6F,$27,$CC,$60,$61,$DC
  Data.b $03,$93,$B5,$C1,$AC,$B3,$AC,$E7,$24,$18,$BE,$55,$26,$A3,$33,$A9,$E2,$5E,$3C,$E7
  Data.b $6E,$01,$9B,$47,$FF,$91,$7A,$F1,$E4,$D7,$40,$3D,$65,$7C,$A1,$C0,$C0,$1E,$22,$F5
  Data.b $0E,$70,$84,$5D,$F4,$80,$0C,$E6,$00,$33,$83,$09,$03,$05,$86,$51,$0E,$73,$27,$D0
  Data.b $A1,$CF,$AA,$60,$94,$F4,$8C,$42,$F1,$30,$BC,$2D,$58,$39,$CA,$85,$BD,$A7,$D7,$6E
  Data.b $01,$33,$EF,$E6,$97,$33,$BE,$7D,$3C,$F7,$ED,$F6,$00,$CB,$C1,$C8,$5F,$20,$0F,$4C
  Data.b $3B,$25,$4C,$7C,$0C,$58,$0C,$EC,$42,$09,$25,$18,$45,$BB,$18,$7D,$36,$CC,$7B,$60
  Data.b $1F,$2B,$AC,$43,$27,$8C,$6B,$E7,$6E,$03,$CC,$30,$DD,$CD,$93,$1C,$BB,$05,$4F,$AF
  Data.b $FE,$7D,$01,$A2,$4F,$BA,$13,$80,$4E,$DD,$04,$46,$19,$B0,$EF,$3E,$51,$A8,$0C,$3A
  Data.b $33,$30,$CF,$86,$D9,$27,$3E,$0F,$A6,$A1,$A7,$CE,$2D,$31,$2A,$D6,$C3,$4B,$97,$80
  Data.b $05,$CC,$97,$E5,$CE,$B1,$33,$80,$F2,$E6,$5C,$98,$53,$92,$0F,$E5,$42,$E9,$0C,$90
  Data.b $00,$F2,$78,$60,$1A,$4A,$10,$7E,$60,$03,$F4,$80,$B2,$FC,$AC,$F9,$12,$5C,$94,$3F
  Data.b $80,$09,$C3,$6E,$21,$06,$F9,$09,$D8,$67,$41,$21,$86,$1D,$17,$E4,$CD,$9F,$3A,$84
  Data.b $C1,$2E,$C1,$30,$20,$09,$E7,$DE,$03,$B4,$05,$CC,$9C,$43,$BD,$78,$A6,$BA,$0C,$40
  Data.b $9C,$32,$38,$92,$F4,$E1,$17,$4A,$09,$50,$BB,$08,$BF,$40,$00,$09,$C6,$03,$C8,$83
  Data.b $51,$7E,$12,$06,$3C,$C0,$61,$18,$36,$EC,$0E,$DD,$36,$8C,$32,$FA,$61,$97,$17,$48
  Data.b $18,$29,$23,$04,$5F,$62,$EC,$55,$C0,$0C,$1E,$1D,$B9,$72,$0A,$98,$FD,$0E,$0D,$FC
  Data.b $39,$71,$83,$F3,$00,$F3,$71,$9E,$01,$BD,$13,$85,$88,$72,$59,$21,$AC,$37,$9C,$F7
  Data.b $76,$80,$7D,$02,$C4,$C0,$86,$99,$04,$EB,$99,$01,$A1,$DE,$5D,$C1,$8C,$84,$B7,$90
  Data.b $D8,$36,$2D,$0E,$2D,$73,$61,$60,$E6,$0C,$7A,$9C,$6A,$D6,$BA,$9A,$5C,$9A,$03,$CA
  Data.b $1B,$60,$2E,$ED,$03,$6C,$D4,$33,$40,$54,$86,$01,$8C,$28,$2E,$1A,$54,$98,$C2,$2E
  Data.b $B4,$C1,$30,$C7,$60,$A4,$78,$60,$DC,$D9,$C2,$7C,$83,$51,$81,$9F,$64,$A6,$AB,$E3
  Data.b $CA,$6E,$26,$86,$98,$71,$7B,$3B,$30,$13,$37,$43,$83,$77,$80,$3D,$47,$8B,$01,$0B
  Data.b $B7,$7B,$E8,$CF,$86,$B9,$67,$A3,$33,$C0,$D9,$E2,$36,$5F,$00,$33,$07,$42,$7B,$C9
  Data.b $CB,$E1,$D7,$0D,$30,$86,$9D,$AE,$CC,$6C,$DA,$4A,$4C,$6D,$86,$67,$60,$B6,$5C,$EC
  Data.b $2D,$E9,$86,$7C,$0C,$6E,$8C,$ED,$BA,$01,$45,$43,$A3,$57,$03,$33,$06,$51,$35,$77
  Data.b $77,$3B,$E0,$EC,$0F,$EF,$D7,$0D,$B0,$60,$BC,$F2,$8B,$4D,$C0,$8C,$79,$59,$BE,$6F
  Data.b $80,$59,$5C,$80,$59,$10,$00,$00,$91,$48
  twend:
    lass:
  Data.b $4A,$43,$BE,$10,$00,$00,$92,$67,$89,$ED,$01,$23,$91,$20,$20,$01,$99,$00,$44,$4D
  Data.b $01,$22,$C0,$22,$08,$40,$80,$50,$46,$18,$00,$25,$80,$1C,$02,$0C,$0C,$8B,$02,$5B
  Data.b $38,$91,$01,$BD,$03,$0C,$94,$06,$4A,$60,$3D,$32,$28,$11,$02,$8A,$61,$04,$C8,$77
  Data.b $80,$45,$A6,$50,$26,$0B,$33,$81,$7E,$20,$12,$4A,$07,$65,$50,$08,$9C,$C0,$2D,$A0
  Data.b $20,$56,$94,$06,$BF,$11,$6F,$62,$28,$21,$85,$B2,$D9,$40,$4E,$60,$0E,$25,$D0,$E4
  Data.b $31,$86,$07,$68,$11,$8A,$05,$B3,$80,$5E,$28,$48,$60,$07,$52,$45,$69,$A2,$61,$0D
  Data.b $25,$89,$03,$A0,$06,$8A,$83,$92,$40,$BF,$1A,$12,$40,$40,$08,$B0,$08,$69,$38,$C6
  Data.b $C0,$C6,$2B,$A2,$31,$0A,$28,$41,$E4,$2F,$40,$73,$52,$5B,$1A,$CF,$A2,$2F,$25,$00
  Data.b $95,$11,$A3,$87,$0E,$43,$E1,$25,$8B,$19,$61,$41,$A1,$92,$51,$94,$3C,$CA,$2D,$84
  Data.b $CE,$48,$1A,$C2,$E2,$20,$FA,$0D,$68,$15,$C4,$C3,$B3,$04,$56,$52,$D4,$68,$83,$03
  Data.b $1F,$1E,$89,$DC,$B9,$FF,$09,$DF,$BE,$15,$D2,$D3,$E7,$72,$3A,$00,$F5,$55,$43,$67
  Data.b $A4,$36,$3A,$E8,$08,$D4,$68,$05,$19,$DA,$D4,$03,$9A,$CF,$C0,$49,$A2,$82,$AE,$5F
  Data.b $8B,$12,$B8,$10,$76,$57,$33,$36,$2D,$51,$66,$FF,$4B,$14,$B3,$D1,$92,$B2,$23,$50
  Data.b $24,$C5,$72,$08,$0B,$A3,$70,$0A,$1D,$D3,$44,$23,$C8,$81,$A4,$06,$34,$6F,$21,$87
  Data.b $6F,$0D,$34,$12,$80,$86,$57,$4A,$16,$5A,$42,$55,$42,$10,$0D,$59,$BE,$43,$9A,$46
  Data.b $3A,$7B,$4A,$CB,$E8,$11,$8B,$28,$4D,$74,$C2,$2D,$74,$46,$D1,$21,$1A,$47,$86,$47
  Data.b $15,$A0,$25,$3C,$7B,$12,$37,$6F,$E0,$58,$C7,$A6,$FD,$DF,$11,$52,$F1,$65,$79,$12
  Data.b $12,$24,$5C,$3A,$3F,$95,$1A,$29,$A5,$94,$3A,$24,$F5,$51,$44,$E7,$A4,$30,$04,$E5
  Data.b $98,$D4,$9A,$D3,$7A,$14,$2C,$2E,$43,$23,$31,$2A,$C0,$38,$D7,$AF,$11,$42,$46,$FC
  Data.b $D6,$6B,$A2,$E9,$0F,$1B,$C0,$FE,$27,$00,$55,$5A,$91,$78,$0A,$5B,$91,$2C,$5C,$C5
  Data.b $4A,$1F,$0C,$C0,$59,$96,$E4,$08,$38,$86,$A2,$39,$A1,$21,$47,$31,$89,$34,$45,$D0
  Data.b $71,$3D,$39,$84,$1E,$39,$ED,$00,$8D,$91,$CD,$12,$B1,$64,$87,$E4,$B2,$E6,$11,$59
  Data.b $99,$84,$D9,$5A,$09,$29,$B6,$5C,$D1,$2A,$6E,$5C,$91,$54,$0B,$94,$97,$2C,$36,$AD
  Data.b $63,$09,$F6,$2D,$47,$82,$B7,$6E,$45,$D2,$ED,$5A,$59,$32,$82,$77,$B7,$6A,$67,$A2
  Data.b $22,$00,$28,$71,$94,$0E,$43,$0E,$C6,$BB,$AA,$E5,$21,$DA,$7A,$40,$EB,$38,$37,$13
  Data.b $C0,$48,$A8,$FF,$43,$81,$01,$C5,$AC,$40,$2B,$12,$CA,$F0,$2B,$92,$C6,$8E,$B9,$42
  Data.b $00,$58,$EC,$8A,$C4,$83,$EE,$8A,$04,$B6,$F2,$8A,$04,$F7,$EA,$8A,$C4,$B8,$AD,$BC
  Data.b $E4,$B4,$B2,$EA,$48,$48,$84,$2A,$29,$69,$5C,$56,$94,$58,$68,$10,$9D,$DD,$43,$34
  Data.b $8C,$4E,$39,$25,$E5,$D0,$B4,$87,$CE,$6F,$01,$F8,$A4,$06,$41,$9C,$78,$33,$20,$42
  Data.b $FB,$2F,$A8,$CC,$95,$18,$A4,$AE,$5D,$19,$24,$22,$C4,$8A,$04,$20,$B1,$BF,$2B,$10
  Data.b $48,$FB,$2B,$12,$93,$27,$FA,$92,$97,$30,$FE,$84,$69,$D3,$3F,$09,$2C,$F8,$2A,$A4
  Data.b $E9,$FE,$91,$18,$50,$D3,$24,$80,$82,$12,$65,$84,$02,$7A,$B0,$2A,$0C,$6A,$74,$50
  Data.b $CB,$E3,$A0,$39,$A9,$35,$C2,$D7,$AF,$1D,$84,$1E,$BD,$59,$00,$58,$FE,$97,$4A,$04
  Data.b $56,$85,$5C,$91,$24,$55,$5C,$91,$48,$A6,$CD,$1D,$37,$86,$09,$58,$D9,$07,$00,$4B
  Data.b $E9,$28,$15,$DF,$38,$86,$25,$BF,$83,$2B,$49,$6E,$DD,$F7,$62,$F6,$EC,$7F,$30,$75
  Data.b $AA,$5F,$A4,$E8,$D6,$97,$80,$87,$CD,$C1,$23,$96,$69,$24,$61,$74,$4A,$4A,$B3,$87
  Data.b $0C,$6C,$01,$70,$12,$E5,$12,$DE,$88,$F0,$64,$30,$E1,$CD,$24,$2B,$F8,$94,$E9,$E8
  Data.b $D1,$BD,$01,$24,$EC,$3B,$A9,$69,$B3,$2D,$84,$0E,$CD,$3B,$3E,$45,$A4,$4E,$6A,$0E
  Data.b $21,$86,$00,$3D,$BB,$0A,$30,$66,$24,$4B,$98,$B1,$BC,$4A,$D4,$AA,$41,$4B,$E9,$F2
  Data.b $7F,$6A,$4E,$95,$2D,$69,$45,$6B,$4B,$A2,$C5,$C6,$02,$6C,$CE,$40,$71,$74,$65,$E4
  Data.b $B3,$89,$00,$16,$35,$A0,$04,$E0,$B4,$B4,$2B,$01,$8E,$FF,$3D,$94,$89,$FA,$6A,$20
  Data.b $87,$CB,$CE,$25,$74,$22,$A3,$05,$18,$0F,$8B,$72,$72,$11,$B0,$C7,$8A,$25,$7D,$49
  Data.b $5F,$C0,$88,$96,$7A,$B5,$5C,$42,$B8,$30,$54,$02,$48,$C9,$14,$44,$28,$A0,$04,$B3
  Data.b $E8,$00,$50,$03,$5A,$45,$F6,$14,$76,$78,$CF,$2A,$3A,$80,$3A,$AD,$51,$84,$44,$75
  Data.b $94,$38,$3E,$AA,$89,$4E,$80,$54,$08,$39,$92,$81,$0C,$F0,$96,$1B,$4A,$14,$57,$38
  Data.b $E5,$C9,$CE,$EB,$CD,$BB,$FD,$78,$EF,$52,$6F,$B8,$F0,$61,$4A,$38,$76,$0C,$B6,$31
  Data.b $28,$86,$74,$80,$E6,$FC,$8F,$88,$73,$72,$9C,$3B,$67,$8E,$DD,$BA,$FF,$25,$00,$A1
  Data.b $76,$09,$73,$7B,$22,$09,$39,$72,$CE,$23,$C8,$C1,$7B,$15,$15,$0E,$C2,$6B,$06,$21
  Data.b $CA,$60,$84,$B2,$40,$00,$FF,$12,$C0,$C5,$FF,$12,$B1,$63,$BF,$64,$B5,$EB,$2A,$39
  Data.b $89,$52,$25,$51,$36,$33,$AF,$95,$17,$80,$C9,$DF,$C0,$14,$E2,$1B,$38,$66,$09,$00
  Data.b $28,$4B,$EA,$E0,$5B,$FB,$66,$12,$C0,$C7,$1D,$DE,$93,$C4,$C8,$91,$73,$1A,$15,$8F
  Data.b $9A,$A2,$22,$72,$2C,$5E,$8F,$A5,$D0,$18,$07,$83,$43,$0B,$E6,$CB,$9F,$FF,$C9,$4B
  Data.b $98,$15,$72,$28,$9E,$D1,$FD,$42,$AD,$22,$EE,$49,$00,$32,$6F,$4B,$0C,$23,$FF,$92
  Data.b $D2,$A6,$79,$2A,$90,$DD,$0A,$35,$F4,$0D,$65,$D0,$0F,$0B,$F7,$3A,$3A,$25,$04,$A6
  Data.b $91,$C3,$44,$10,$DB,$E8,$55,$72,$14,$69,$97,$44,$95,$5A,$9F,$00,$5A,$5E,$58,$B2
  Data.b $B9,$7A,$94,$4C,$A4,$98,$86,$4E,$4E,$95,$A0,$B8,$00,$BC,$A0,$66,$84,$46,$67,$CF
  Data.b $3B,$09,$DD,$1B,$BD,$33,$04,$EC,$97,$E8,$B1,$B5,$88,$5C,$3C,$2A,$A9,$68,$AD,$C2
  Data.b $64,$A9,$DA,$48,$00,$07,$0A,$DE,$9C,$8D,$05,$91,$22,$30,$25,$31,$C2,$6B,$E3,$A3
  Data.b $13,$92,$66,$CE,$78,$B1,$FF,$9A,$33,$73,$BA,$04,$68,$D0,$36,$10,$40,$2B,$02,$4F
  Data.b $A1,$60,$3D,$A1,$45,$38,$1C,$09,$20,$23,$78,$10,$A9,$E0,$5F,$B2,$B9,$33,$97,$B4
  Data.b $75,$8B,$39,$4B,$C9,$DD,$41,$66,$24,$9A,$16,$D1,$8F,$1E,$A5,$E4,$94,$C8,$4A,$29
  Data.b $23,$00,$A6,$AD,$94,$54,$22,$48,$A9,$22,$7D,$73,$12,$51,$E6,$55,$A7,$66,$F7,$3F
  Data.b $44,$56,$AE,$F0,$DD,$DB,$E3,$81,$01,$0F,$9D,$43,$F9,$2C,$BA,$86,$3C,$BF,$45,$36
  Data.b $FF,$14,$67,$49,$68,$04,$AD,$DA,$85,$84,$0E,$BD,$B1,$24,$CB,$48,$25,$69,$93,$B7
  Data.b $70,$FD,$13,$80,$D6,$F3,$C9,$43,$56,$C5,$8C,$AA,$40,$57,$41,$12,$08,$90,$5B,$99
  Data.b $80,$66,$8E,$9F,$90,$2D,$79,$AC,$57,$B5,$2F,$4C,$F8,$B0,$2A,$18,$A2,$F3,$63,$97
  Data.b $5A,$64,$40,$AB,$0A,$4F,$B4,$0E,$30,$3E,$0A,$5D,$09,$91,$34,$B9,$4A,$82,$6F,$B0
  Data.b $92,$99,$FD,$BC,$44,$B7,$FF,$2F,$C9,$DE,$2B,$C5,$89,$23,$4A,$6F,$DE,$BF,$20,$00
  Data.b $04,$93,$C7,$2B,$9A,$DD,$43,$97,$1E,$04,$7D,$39,$AC,$9E,$57,$82,$33,$67,$95,$F8
  Data.b $FC,$19,$93,$00,$60,$76,$5C,$1C,$38,$67,$15,$60,$DE,$00,$1A,$84,$0A,$5A,$81,$25
  Data.b $6F,$E5,$68,$89,$63,$C8,$59,$02,$58,$B0,$F2,$E2,$DD,$7B,$66,$09,$05,$02,$E5,$A2
  Data.b $B7,$2F,$05,$14,$8B,$6F,$59,$12,$58,$70,$96,$D4,$BD,$FB,$89,$00,$52,$35,$65,$78
  Data.b $28,$3F,$5B,$C8,$03,$FA,$C0,$B8,$07,$E6,$A3,$B4,$A3,$2A,$FC,$01,$A8,$F2,$01,$E9
  Data.b $2F,$C0,$80,$71,$B8,$5E,$AB,$02,$52,$7D,$3E,$C0,$38,$2C,$6C,$56,$02,$E9,$E8,$DF
  Data.b $01,$E6,$EE,$79,$AD,$0A,$40,$EA,$0A,$30,$3F,$E9,$E8,$7F,$50,$FA,$18,$01,$10,$EC
  Data.b $B9,$F4,$7F,$E8,$A0,$7F,$46,$C0,$DF,$08,$0A,$E4,$91,$7E,$FE,$BF,$50,$70,$89,$01
  Data.b $95,$09,$A3,$7F,$08,$F8,$00,$15,$60,$E0,$50,$00,$02,$50,$20,$18,$1E,$57,$9F,$02
  Data.b $83,$31,$69,$0C,$5B,$00,$24,$5C,$67,$56,$00,$20,$91,$48
  lassend:
  PicPak:
  Data.b $4A,$43,$38,$30,$00,$00,$EE,$4F,$B8,$8F,$B3,$A9,$D0,$20,$69,$14,$81,$89,$12,$CA
  Data.b $08,$B0,$4A,$20,$25,$C0,$0C,$30,$46,$02,$89,$81,$20,$70,$60,$10,$D8,$42,$C4,$A3
  Data.b $FF,$14,$FE,$C2,$B0,$48,$32,$AE,$4E,$33,$0C,$F3,$BA,$EA,$BC,$AE,$CB,$28,$A3,$AA
  Data.b $06,$A4,$90,$A2,$BF,$2E,$BA,$8C,$AA,$1A,$BA,$9B,$B2,$FE,$EA,$34,$8E,$AA,$AA,$1A
  Data.b $90,$E2,$8A,$FE,$BA,$8C,$2E,$AA,$6A,$40,$FC,$FC,$3F,$40,$FF,$EB,$AF,$00,$00,$00
  Data.b $22,$11
  PicPakend:
EndDataSection

BERESHEIT
SiggeSvahn
User
User
Posts: 40
Joined: Wed Oct 06, 2010 9:37 pm

Re: RubberBand Selection PhotoShop style. No screen

Post by SiggeSvahn »

Looks beautiful. Thanks!
Newbie
User avatar
flaith
Enthusiast
Enthusiast
Posts: 704
Joined: Mon Apr 25, 2005 9:28 pm
Location: $300:20 58 FC 60 - Rennes
Contact:

Re: RubberBand Selection PhotoShop style. No screen

Post by flaith »

Thanks for sharing your code, awesome :shock:
“Fear is a reaction. Courage is a decision.” - WC
Post Reply