Jump to content
Sign in to follow this  
jennico

add a size grip with DrawFrameControl

Recommended Posts

jennico

hi there

i wonder why this has not been asked before:

i want to add a size grip to a sizable GUI ($WS_SIZEBOX) without statusbar. can anyone give me an example ? all i can do is just guess: i need a WM_PAINT event or is it WM_NCHITTEST ? the function should be:

Func DrawFrameControl($hDC, $nLeft, $nTop, $nRight, $nBottom, $nType, $nState)
    Local Const $DFC_SCROLL = 3,$DFCS_SCROLLSIZEGRIP = 8    
    Local $stRect = DllStructCreate("int;int;int;int")

    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)

    DllCall("user32.dll", "int", "DrawFrameControl", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "int", $DFC_SCROLL, "int", $DFCS_SCROLLSIZEGRIP)

    $stRect = 0
EndFunc  ;==>DrawFrameControl

so the size grip is originally a scrollbar element. but what would be the device context (the window ?), and what is the rectangle (client size bottom right 16 x 16 ?)in this case ?

(btw: on the other hand, one could simply place an icon, but where to find it ?)

can anyone provide a working example using DrawFrameControl ?

thx j.


Spoiler

I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.OixB7.jpgDon't forget this IP: 213.251.145.96

 

Share this post


Link to post
Share on other sites
fireryblaze

#include <WindowsConstants.au3>
#Include <WinAPI.au3>
Opt("TrayIconDebug", 1)
$Gui = GUICreate("", default, default, default, default, $WS_SIZEBOX)
$DC = _WinAPI_GetDC($Gui)
GUISetState()

DrawFrameControl($DC, 10,10,100,100)

while 1 
WEnd


Func DrawFrameControl($hDC, $nLeft, $nTop, $nRight, $nBottom)
    Local Const $DFC_SCROLL = 3,$DFCS_SCROLLSIZEGRIP = 8    
    Local $stRect = DllStructCreate("int;int;int;int")

    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)

    DllCall("user32.dll", "int", "DrawFrameControl", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "int", $DFC_SCROLL, "int", $DFCS_SCROLLSIZEGRIP)
MsgBox(0, "", @error)
    $stRect = 0
EndFunc  ;==>DrawFrameControl

I leave the rest to you...

PS ALOT of icons can be found within various dll's...

Also you can make your own.

http://www.glennslayden.com/code/win32/shell32-dll-icons

or go here and get a 30 day free trial of an excellent tool

http://www.gdgsoft.com/download/gconvert.aspx

Edited by fireryblaze

Share this post


Link to post
Share on other sites
jennico

$DC = _WinAPI_GetDC($Gui)

....so easy, can't believe it, thanx

j.


Spoiler

I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.OixB7.jpgDon't forget this IP: 213.251.145.96

 

Share this post


Link to post
Share on other sites
ProgAndy

You really should put the drawing in WM_PAINT. Then it won't disappear ;)

#include<WindowsConstants.au3>
#include<GUIConstantsEx.au3>
Global $hGUI = GUICreate("Sizetest", default, default, default, default, $WS_SIZEBOX)
GUIRegisterMsg($WM_PAINT, "_MY_WM_PAINT")
GUISetState()
While GUIGetMsg()<>-3
WEnd

Func _MY_WM_PAINT($hWnd, $uMsg, $wParam, $lParam)
    ; Init paint
    Local $tPS = DllStructCreate("ptr hdc; BOOL fErase;long rcPaint[4]; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];")
    Local $aPaint = DllCall("user32.dll", "handle", "BeginPaint", "hwnd", $hWnd, "ptr", DllStructGetPtr($tPS))
    If @error Then Return $GUI_RUNDEFMSG
    Local $hDC = $aPaint[0]

    ; Draw
    Local $pos = WinGetClientSize($hWnd)
    DrawFrameControl($hDC, $pos[0]-10, $pos[1]-10, $pos[0], $pos[1])

    ; Finish Paint
    DllCall("user32.dll", "bool", "EndPaint", "hwnd", $hWnd, "ptr", $aPaint[2])

    Return $GUI_RUNDEFMSG
EndFunc
Func DrawFrameControl($hDC, $nLeft, $nTop, $nRight, $nBottom)
    Local Const $DFC_SCROLL = 3,$DFCS_SCROLLSIZEGRIP = 8
    Local $stRect = DllStructCreate("int;int;int;int")

    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)

    DllCall("user32.dll", "int", "DrawFrameControl", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "int", $DFC_SCROLL, "int", $DFCS_SCROLLSIZEGRIP)

    $stRect = 0
EndFunc  ;==>DrawFrameControl
Edited by ProgAndy

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Share this post


Link to post
Share on other sites
jennico

hmm i made it with WM_NCHITTEST .

#include <WindowsConstants.au3>
;#Include <WinAPI.au3>

Global Const $DFC_SCROLL = 3,$DFCS_SCROLLSIZEGRIP = 8    
$Gui = GUICreate(" Size Grip Window", 400, 300, default, default, $WS_SIZEBOX)

GUIRegisterMsg($WM_NCHITTEST , "DrawFrameControl")

GUISetState()

Do
    Sleep(20)
Until GUIGetMsg() = -3



Func DrawFrameControl($hWndGUI, $MsgID, $WParam, $LParam)
    Local $stRect = DllStructCreate("int;int;int;int")
    Local $stSize = WinGetClientSize($hWndGUI)
    Local $hDC = DllCall("User32.dll", "hwnd", "GetDC", "hwnd", $hWndGUI)   
    
    DllStructSetData($stRect, 1, $stSize[0] - 16)
    DllStructSetData($stRect, 2, $stSize[1] - 16)
    DllStructSetData($stRect, 3, $stSize[0])
    DllStructSetData($stRect, 4, $stSize[1])

    DllCall("user32.dll", "int", "DrawFrameControl", "hwnd", $hDC[0], "ptr", DllStructGetPtr($stRect), "int", $DFC_SCROLL, "int", $DFCS_SCROLLSIZEGRIP)
    
    DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hWndGUI, "hwnd", $hDC[0])
    $stRect = 0
EndFunc  ;==>DrawFrameControl

seems the same.

j

edit: @progandy: _MY_WM_PAINT does not work for me (xpsp3)

Edited by jennico

Spoiler

I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.OixB7.jpgDon't forget this IP: 213.251.145.96

 

Share this post


Link to post
Share on other sites
ProgAndy

You need the current version of AutoIt. Do you have it?


*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Share this post


Link to post
Share on other sites
jennico

i admit, no. ;)

does this matter ? wm_paint was working before, didn't it ?

Edited by jennico

Spoiler

I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.OixB7.jpgDon't forget this IP: 213.251.145.96

 

Share this post


Link to post
Share on other sites
ProgAndy

DLLCall and DLLStructCreate have got new types wich I'm using. You have to change them to the old ones (bool -> int, handle -> ptr, ...)


*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Share this post


Link to post
Share on other sites
jennico

ok, this is a sizing window with custom status bar (much easier than the system statusbar) and custom size grip.

#include <WindowsConstants.au3>
;#Include <WinAPI.au3>

Global Const $DFC_SCROLL = 3,$DFCS_SCROLLSIZEGRIP = 8    
$Gui = GUICreate(" Size Grip Window", 400, 300, default, default, $WS_SIZEBOX)

$size=WinGetClientSize($Gui)
GUICtrlCreateLabel("", 0, $size[1] - 18, $size[0], 18, -1, $WS_EX_STATICEDGE)
GUICtrlSetResizing(-1, 582)

GUIRegisterMsg($WM_NCHITTEST , "DrawFrameControl")

GUISetState()

DrawFrameControl($Gui, 0, 0, 0)

Do
    Sleep(20)
Until GUIGetMsg() = -3



Func DrawFrameControl($hWndGUI, $MsgID, $WParam, $LParam)
    Local $stRect = DllStructCreate("int;int;int;int")
    Local $stSize = WinGetClientSize($hWndGUI)
    Local $hDC = DllCall("User32.dll", "hwnd", "GetDC", "hwnd", $hWndGUI)   
    
    DllStructSetData($stRect, 1, $stSize[0] - 17)
    DllStructSetData($stRect, 2, $stSize[1] - 17)
    DllStructSetData($stRect, 3, $stSize[0] - 1)
    DllStructSetData($stRect, 4, $stSize[1] - 1)

    DllCall("user32.dll", "int", "DrawFrameControl", "hwnd", $hDC[0], "ptr", DllStructGetPtr($stRect), "int", $DFC_SCROLL, "int", $DFCS_SCROLLSIZEGRIP)
    
    DllCall("User32.dll", "int", "ReleaseDC", "hwnd", $hWndGUI, "hwnd", $hDC[0])
    $stRect = 0
EndFunc  ;==>DrawFrameControl

very nice, looks just like explorer.

now this has been done with AutoIt ;)

thx again, j.

edit: $WM_EXITSIZEMOVE = 0x0232 would probably be the most correct event.

Edited by jennico

Spoiler

I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.OixB7.jpgDon't forget this IP: 213.251.145.96

 

Share this post


Link to post
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
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.