Small Basic - Transparent GraphicsWindow
I recently added a feature to the LitDev Extension to create a completely transparent GraphicsWindow.
The method to do this is:
LDUtilities``.``TransparentGW``(``)
I can't show a screenshot because there is absolutely nothing to see!
So, what's the point...
Well, anything we add to the transparent GraphicsWindow will be visible, so we can do things like:
- Create a window with a non-rectangular shape by drawing a png image.
- Create nice simple widget applications.
- Make things appear to float free from a containing window.
Features
- The transparent GraphicsWindow must be created before any other command creates a GraphicsWindow.
- Once a transparent GraphicsWindow is created it cannot be changed back to a normal GraphicsWindow.
- Because the window is completely transparent, it doesn't even register Mouse Clicks or other events unless something is drawn on it or its background is modified with GraphicsWindow.BackgroundColor.
- A partially transparent color can be created using the hex format with the first 2 characters being opacity (e.g. "#01FFFFFF" is almost completely transparent white - you won't see it but it will register events if used as a background).
- You can add anything to the transparent GraphicsWindow that you would to a normal one, including drawings, shapes and controls as well as move, rotate, show/hide and zoom (everything you can do normally).
- You can use the associated new method LDUtilities.TopMostGW("True") to ensure that the window always remains above all other windows, good for widgets.
Example
The following is the code for a simple clock widget using these methods.
'Simple LitDev Extension widget clock
'Transparent Topmost GraphicsWindow
LDUtilities``.``TransparentGW``(``)
LDUtilities``.``TopMostGW``(``"True"``)
'Clock Face
GraphicsWindow``.`` Width `` = ``100
GraphicsWindow``.`` Height `` = ``100
GraphicsWindow``.`` BrushColor `` = `` "#40FFFFFF" ``'Partially transparent White
GraphicsWindow``.``FillEllipse``(``0``,``0``,``100``,``100``)
GraphicsWindow``.`` FontSize `` = ``10
For `` i `` = `` 1 `` To ``12
`` angle `` = ``i``*``Math``.``PI``/`` 6 `` - ``Math``.``Pi``/``2
``GraphicsWindow``.``DrawText``(``50``+``45``*``Math``.``Cos``(``angle``)``-``3``,``50``+``45``*``Math``.``Sin``(``angle``)``-``7``,``i``)
EndFor
'Hands
GraphicsWindow``.`` PenColor `` = ``"Black"
GraphicsWindow``.`` PenWidth `` = ``4
hourHand `` = ``Shapes``.``AddLine``(``0``,``0``,``0``,``0``)
GraphicsWindow``.`` PenWidth `` = ``2
minuteHand `` = ``Shapes``.``AddLine``(``0``,``0``,``0``,``0``)
GraphicsWindow``.`` PenColor `` = ``"Red"
GraphicsWindow``.`` PenWidth `` = ``1
secondHand `` = ``Shapes``.``AddLine``(``0``,``0``,``0``,``0``)
'Register Events
GraphicsWindow``.`` MouseDown `` = ``OnMouseDown
GraphicsWindow``.`` MouseUp `` = ``OnMouseUp
LDDialogs``.``AddRightClickMenu``(``"1=Exit;"``,``""``)
LDDialogs``.`` RightClickMenu `` = ``OnRightClickMenu
'MAIN LOOP
While ``(``"True"``)
``'Get angles (Clockwise from top)
`` second `` = ``Clock``.``Second``*``Math``.``PI``/`` 30 `` - ``Math``.``Pi``/``2
`` minute `` = ``(``Clock``.``Minute``+``Clock``.``Second``/``60``)``*``Math``.``PI``/`` 30 `` - ``Math``.``Pi``/``2
`` hour `` = ``(``Clock``.``Hour``+``Clock``.``Minute``/``60``+``Clock``.``Second``/``3600``)``*``Math``.``PI``/`` 6 `` - ``Math``.``Pi``/``2
``'Move hands - extension used to move lines coz its easier
``LDShapes``.``MoveLine``(``hourHand``,``50``,``50``,``50``+``35``*``Math``.``Cos``(``hour``)``,``50``+``35``*``Math``.``Sin``(``hour``)``)
``LDShapes``.``MoveLine``(``minuteHand``,``50``,``50``,``50``+``45``*``Math``.``Cos``(``minute``)``,``50``+``45``*``Math``.``Sin``(``minute``)``)
``LDShapes``.``MoveLine``(``secondHand``,``50``,``50``,``50``+``50``*``Math``.``Cos``(``second``)``,``50``+``50``*``Math``.``Sin``(``second``)``)
``'Move the clock with mouse down
`` If ``(``mouseDown`` ) ``Then
``GraphicsWindow``.`` Left `` = ``offsetX``+``Mouse``.``MouseX
``GraphicsWindow``.`` Top `` = ``offsetY``+``Mouse``.``MouseY
``EndIf
``Program``.``Delay``(``100`` ) ``' Delay 0.1 sec to prevent mashing cpu unnecessarily
EndWhile
'EVENT HANDLING SUBROUTINES
Sub ``OnMouseDown
`` mouseDown `` = ``"True"
`` offsetX `` = ``GraphicsWindow``.``Left``-``Mouse``.``MouseX
`` offsetY `` = ``GraphicsWindow``.``Top``-``Mouse``.``MouseY
EndSub
Sub ``OnMouseUp
`` mouseDown `` = ``"False"
EndSub
Sub ``OnRightClickMenu
`` If ``(``LDDialogs``.`` LastRightClickMenuItem `` = ``1`` ) ``Then
``Program``.``End``(``)
``EndIf
EndSub
The partially transparent clock floats above all windows, it can be moved by grabbing with a mouse click and dragging. A right click gives an option to exit it.
With these basic code segments you can create your own fancy professional looking widgets, perhaps with options to change and store settings.