Jump to content

Adding checkboxes on a movable picture


yuser
 Share

Recommended Posts

No, i'm searching something which will work on moveable picture. I will use it with this kind of code. Checkboxes need to stuck to the picture sth like that

#include-once
#include <GUIConstantsEx.au3>
#Include <Misc.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Middle.au3>

Opt("GUIOnEventMode",1)
Opt("MouseCoordMode", 2)

$sPictureLocation=@ScriptDir&'\Logo.png'

Global $hMain=GUICreate("Smooth Move",@DesktopWidth-6,(@DesktopWidth-6)/2,0,0,BitOR($WS_MINIMIZEBOX,$WS_POPUP,$WS_GROUP))
WinSetTrans("Smooth Move","","230")
GUISetBkColor(0xFFFFFF,$hMain)
GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")
GUISetState(@SW_SHOW,$hMain)

; create pic control last
_GDIPlus_Startup()
$hImage1 = _GDIPlus_ImageLoadFromFile($sPictureLocation)
$hPic=GUICtrlCreatePic('',100,25,_GDIPlus_ImageGetWidth($hImage1),_GDIPlus_ImageGetHeight($hImage1))
GUICtrlSetOnEvent(-1,"_PicClick")
$hBMP1=_GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage1)
_WinAPI_DeleteObject(GUICtrlSendMsg($hPic, 0x0172, 0, $hBMP1))
_GDIPlus_ImageDispose($hImage1)
_GDIPlus_Shutdown()

While 1
    Sleep(10)
WEnd

Func _PicClick()
_SmoothMove(@GUI_CtrlId)

    $bChange=False
    $arPos=ControlGetPos($hMain,'',@GUI_CtrlId)
    If $arPos[0]<0 Then
        $arPos[0]=0
        $bChange=True
    EndIf
    If $arPos[1]<0 Then
        $arPos[1]=0
        $bChange=True
    EndIf
    If $arPos[0]+$arPos[2]>@DesktopWidth-6 Then
        $arPos[0]=@DesktopWidth-6-$arPos[2]
        $bChange=True
    EndIf
    If $arPos[1]+$arPos[3]>(@DesktopWidth-6)/2 Then
        $arPos[1]=(@DesktopWidth-6)/2-$arPos[3]
        $bChange=True
    EndIf
    If $bChange Then GUICtrlSetPos(@GUI_CtrlId,$arPos[0],$arPos[1])

EndFunc

Func _ControlMove($nCID)
    $arPos=MouseGetPos()
    $arPieceInfo=ControlGetPos($hMain,"",$nCID)
    $nXOffset=$arPos[0]-$arPieceInfo[0]
    $nYOffset=$arPos[1]-$arPieceInfo[1]

    While _IsPressed("01")
        $arPos=MouseGetPos()
        ControlMove($hMain,'',$nCID,$arPos[0]-$nXOffset,$arPos[1]-$nYOffset)
        Sleep(10)
    WEnd
EndFunc

Func _SetPositionmove($nCID)
    $arPos=MouseGetPos()
    $arPieceInfo=ControlGetPos($hMain,"",$nCID)
    $nXOffset=$arPos[0]-$arPieceInfo[0]
    $nYOffset=$arPos[1]-$arPieceInfo[1]
    While _IsPressed("01")
        $arPos=MouseGetPos()
        GUICtrlSetPos($nCID,$arPos[0]-$nXOffset,$arPos[1]-$nYOffset)
        Sleep(10)
    WEnd
EndFunc

Func _SmoothMove($nCID)
    $arPos=MouseGetPos()

    Opt("MouseCoordMode",1)
    $Temp=MouseGetPos()
    Opt("MouseCoordMode",2)
    Local $nGlobalYOffset=$Temp[1]-$arPos[1]
    Local $nGlobalXOffset=$Temp[0]-$arPos[0]

    $arPieceInfo=ControlGetPos($hMain,"",$nCID)
    $nXOffset=$arPos[0]-$arPieceInfo[0]
    $nYOffset=$arPos[1]-$arPieceInfo[1]
    Local $hTempWin=GUICreate('temp',$arPieceInfo[2],$arPieceInfo[3],$arPieceInfo[0]+$nGlobalXOffset,$arPieceInfo[1]+$nGlobalYOffset, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD,$WS_EX_TOPMOST),$hMain)
    _GDIPlus_Startup()
    $hImage1 = _GDIPlus_ImageLoadFromFile($sPictureLocation)
    _SetBitmap($hTempWin,$hImage1,255)
    _GDIPlus_ImageDispose($hImage1)
    GUISetState(@SW_SHOWNA,$hTempWin)
    GUICtrlSetState($nCID,$GUI_HIDE)

    While _IsPressed("01")
        $arPos=MouseGetPos()
        WinMove($hTempWin,'',$arPos[0]-$nXOffset+$nGlobalXOffset,$arPos[1]-$nYOffset+$nGlobalYOffset)
    WEnd

    $arPos=WinGetPos($hTempWin)
    GUICtrlSetPos($nCID,$arPos[0]-$nGlobalXOffset,$arPos[1]-$nGlobalYOffset)
    GUICtrlSetState($nCID,$GUI_SHOW)
    GUIDelete($hTempWin)
    GUISwitch($hMain)
EndFunc

Func _SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    Local $AC_SRC_ALPHA=1
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
 EndFunc 
 
 Func _Exit()
    GUIDelete($hMain)
    Exit
EndFunc
Link to comment
Share on other sites

You are technically correct.  I hadn't noticed that $WS_CLIPSIBLINGS isn't an option for Pic controls.

However, with a little slight of hand, you can gain a workable result.  I have used the more complex approach you've outlined in your example, but have learned to avoid the complexity it entails whenever possible.

Here's a working example that's based on the post I referred to:

;
;   Example of checkbox on movable picture
;
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$GUI = GuiCreate("Test GUI" , 200 , 200, -1, -1, $WS_POPUP)

$close = GUICtrlCreateLabel("  Close  ", 120, 30 , 40, 14)      ; unseen "functional" button
GUICtrlSetColor(-1 , 0xCC0000)
GUICtrlSetTip(-1, "Click to close")

$check = GUICtrlCreateCheckbox("Active checkbox", 40, 80 , 100, 14)
GUICtrlSetColor(-1 , 0xCC0000)
GUICtrlSetTip(-1, "Click to check")

GUICtrlCreatePic("C:\AutoIt3\Examples\Helpfile\Extras\Tech.bmp", 0, 0, 200, 200, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor(-1 , 0xBBBBBB)

$closeShow = GUICtrlCreateLabel("  Close  ", 120, 30 , 40, 14)  ; visible "display" button
GUICtrlSetColor(-1 , 0xCC0000)

$checkShow = GUICtrlCreateCheckbox("Active checkbox", 40, 80 , 100, 14)
GUICtrlSetColor(-1 , 0xCC0000)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $close
            Exit
    EndSwitch
WEnd

.

I hope this helps. 

post-29172-0-34676800-1414346724.png

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...