Here's
DesktopDrawer - Draw on your desktop!
Just run the script, paint using your mouse, press Esc to exit, or use the toolbar.
I was unable to post the whole code because of size limitations on the forum, so you have to download two files:
The script requires
Gdip.ahk from
http://www.autohotke...orum/topic32238.html and
COM.ahk from
http://www.autohotke...orum/topic22923.htmlJust place the ahk-files in the same folder as the script.
It's an early release! I'm having trouble with GDI+, Vista won't always update the desktop, and it's lacking in functionality, but give it a try.
Skrommel
;DesktopDrawer.ahk
; Paint on your desktop
; Just run the script, paint using your mouse, press Esc to quit
; Requires Gdip.ahk from http://www.autohotkey.com/forum/topic32238.html
; and COM.ahk from http://www.autohotkey.com/forum/topic22923.html
;Skrommel @ 2008
#SingleInstance, Force
#NoEnv
SetBatchLines,-1
SetWorkingDir %A_ScriptDir%
SetWinDelay,0
applicationname=DesktopDrawer
START:
IniRead,penwidth,%applicationname%.ini,Settings,penwidth
IniRead,pencolor,%applicationname%.ini,Settings,pencolor
If penwidth=ERROR
penwidth=4
If pencolor=ERROR
pencolor=FF0000
wallpaperfile=wallpaper.bmp
drawingfile=drawing.png
If !pToken := Gdip_Startup()
{
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
ExitApp
}
;GUI
Gui,1:Destroy
Gui,1:-Caption +E0x80000 +LastFound -AlwaysOnTop -ToolWindow +OwnDialogs
Gui,1:Show, NA
hwnd1:= WinExist()
width1:=A_ScreenWidth
height1:=A_ScreenHeight
hbm1 := CreateDIBSection(width1,height1)
hdc1 := CreateCompatibleDC()
obm1 := SelectObject(hdc1, hbm1)
pGraphic1 := Gdip_GraphicsFromHDC(hdc1)
;LOADWALLPAPER
RegRead,tile,HKEY_CURRENT_USER,Control Panel\Desktop,TileWallpaper
RegRead,style,HKEY_CURRENT_USER,Control Panel\Desktop,WallpaperStyle
RegRead,wallpaper,HKEY_CURRENT_USER,Control Panel\Desktop,WallPaper
RegRead,background,HKEY_CURRENT_USER,Control Panel\Colors,Background
If wallpaper=%A_Scriptdir%\%wallpaperfile%
{
IniRead,tile,%applicationname%.ini,Settings,tile
IniRead,style,%applicationname%.ini,Settings,style
IniRead,wallpaper,%applicationname%.ini,Settings,wallpaper
}
Else
{
background:=DECR_G_BTOHEXRGB(background)
IniWrite,%tile%,%applicationname%.ini,Settings,tile
IniWrite,%style%,%applicationname%.ini,Settings,style
IniWrite,%wallpaper%,%applicationname%.ini,Settings,wallpaper
}
width3 := A_ScreenWidth
height3 := A_ScreenHeight
pBitmap3 := Gdip_CreateBitmap(width3,height3)
pGraphic3 := Gdip_GraphicsFromImage(pBitmap3)
pBitmapFile3 := Gdip_CreateBitmapFromFile(wallpaper)
fileWidth3 := Gdip_GetImageWidth(pBitmapFile3)
fileHeight3 := Gdip_GetImageHeight(pBitmapFile3)
Gdip_SetSmoothingMode(pGraphic3, 4)
Gdip_SetInterpolationMode(pGraphic3, 7)
hBrush:= Gdip_BrushCreateSolid("0xFF" background)
Gdip_FillRectangle(pGraphic3, hBrush, 0, 0, width3, height3)
Gdip_DeleteBrush(hBrush)
If tile=1 ;tile
{
x:=-1*filewidth3
y:=0
Loop
{
x+=filewidth3
If (x>=A_ScreenWidth)
{
x:=0
y+=fileheight3
If (y>=A_ScreenHeight)
Break
}
Gdip_DrawImage(pGraphic3, pBitmapFile3, x, y, filewidth3, fileheight3, 0, 0, filewidth3, fileheight3)
}
}
Else
If style=2 ;stretch
Gdip_DrawImage(pGraphic3, pBitmapFile3, 0, 0, width3, height3, 0, 0, filewidth3, fileheight3)
Else ;center
Gdip_DrawImage(pGraphic3, pBitmapFile3, width3/2-filewidth3/2, height3/2-fileheight3/2, filewidth3, fileheight3, 0, 0, filewidth3, fileheight3)
Gdip_DisposeImage(pBitmapFile3)
Gdip_DrawImage(pGraphic1, pBitmap3, 0, 0, width3, height3, 0, 0, width3, height3)
;LOADDRAWING
width2 := A_ScreenWidth
height2 := A_ScreenHeight
pBitmap2 := Gdip_CreateBitmap(width2,height2)
pGraphic2 := Gdip_GraphicsFromImage(pBitmap2)
pBitmapFile2 := Gdip_CreateBitmapFromFile(drawingfile)
fileWidth2 := Gdip_GetImageWidth(pBitmapFile2)
fileHeight2 := Gdip_GetImageHeight(pBitmapFile2)
Gdip_SetSmoothingMode(pGraphic2, 4)
Gdip_SetInterpolationMode(pGraphic2, 7)
Gdip_DrawImage(pGraphic2, pBitmapFile2, 0, 0, fileWidth2, fileheight2, 0, 0, fileWidth2, fileHeight2)
Gdip_DisposeImage(pBitmapFile2)
Gdip_DrawImage(pGraphic1, pBitmap2, 0, 0, width2, height2, 0, 0, width2, height2)
hBrush:=Gdip_BrushCreateSolid("0xFF" pencolor)
hPen := Gdip_CreatePen("0xFF" pencolor, penwidth)
DllCall("gdiplus\GdipSetPenLineCap197819",UInt,hpen,UInt,2,UInt,2,UInt,0)
Loop,10
UpdateLayeredWindow(hwnd1, hdc1, 0, 0, width1, height1, 25*A_Index+5)
;TOOLBAR
Gui,4:Destroy
Gui,4:Margin,0,0
Gui,4:+LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui,4:Font,C000000 S20,Wingdings
Loop,5
Gui,4:Add,Text,% "x+0 yp GPEN Vwidth_" A_Index*2,% Chr(0x8B+A_Index*2)
Gui,4:Add,Picture,xm w0 h0
colors=000000|FFFFFF|FF0000|00FF00|0000FF
Loop,Parse,colors,|
{
Gui,4:Font,C%A_LoopField% S24,Wingdings
Gui,4:Add,Text,x+0 GPEN Vcolor_%A_LoopField%,% Chr(0x6C)
}
Gui,4:Font,
Gui,4:Add,Edit,xm,
Gui,4:Add,Button,xm w40 Default GSAVE,&Save
Gui,4:Add,Button,x+0 w40 GEXIT,&Quit
Gui,4:Add,Button,x+0 w40 GCLEAR,&Clear
Gui,4:Show,x0 y0 NA
hwnd4:= WinExist()
OnMessage(0x201, "WM_LBUTTONDOWN")
OnExit,Exit
Return
PEN:
StringSplit,part_,A_GuiControl,_
If part_1=color
pencolor:=part_2
If part_1=width
penwidth:=part_2
Gdip_DeleteBrush(hBrush)
Gdip_DeletePen(hPen)
hBrush:=Gdip_BrushCreateSolid("0xFF" pencolor)
hPen := Gdip_CreatePen("0xFF" pencolor, penwidth)
DllCall("gdiplus\GdipSetPenLineCap197819",UInt,hpen,UInt,2,UInt,2,UInt,0)
IniWrite,%pencolor%,%applicationname%.ini,Settings,pencolor
IniWrite,%penwidth%,%applicationname%.ini,Settings,penwidth
Return
UPDATE(pBitmap,width,height,x=0,y=0)
{
Local empty
Gdip_DrawImage(pGraphic1, pBitmap, x, y, width, height, x, y, width, height)
UpdateLayeredWindow(hwnd1, hdc1, 0, 0, width1, height1)
}
SAVETOFILE:
Gdip_SaveBitmapToFile(pBitmap2, drawingfile)
Gdip_DrawImage(pGraphic3, pBitmap2, 0, 0, width3, height3, 0, 0, width3, height3)
UpdateLayeredWindow(hwnd3, hdc3, 0, 0, width3, height3)
Gdip_SaveBitmapToFile(pBitmap3, wallpaperfile)
RegWrite,REG_SZ,HKEY_CURRENT_USER,Control Panel\Desktop,TileWallpaper,0
RegWrite,REG_SZ,HKEY_CURRENT_USER,Control Panel\Desktop,WallpaperStyle,2
RegWrite,REG_SZ,HKEY_CURRENT_USER,Control Panel\Desktop,WallPaper,%A_Scriptdir%\%wallpaperfile%
Gosub,CHANGEWALLPAPER
Return
CLEANUP:
Gui,4:Destroy
Loop,10
UpdateLayeredWindow(hwnd1, hdc1, 0, 0, width1, height1, 255-A_Index*25-5)
SelectObject(hdc1, obm1)
DeleteObject(hbm1)
DeleteDC(hdc1)
Gdip_DeleteGraphics(pGraphic1)
Gdip_DeletePen(hPen)
Gdip_DeletePen(hBrush)
Gdip_DeleteGraphics(pGraphic2)
Gdip_DisposeImage(pBitmap2)
Gdip_DeleteGraphics(pGraphic3)
Gdip_DisposeImage(pBitmap3)
Gdip_Shutdown(pToken)
Return
CLEAR:
FileDelete,%A_ScriptDir%\%wallpaperfile%
FileDelete,%A_ScriptDir%\%drawingfile%
Gosub,CLEANUP
Goto,START
GuiEscape:
GuiClose:
SAVE:
Gosub,SAVETOFILE
EXIT:
Gosub,CLEANUP
ExitApp
WM_LBUTTONDOWN(wParam, lParam)
{
Local empty
mx:=lParam & 0xFFFF
my:=lParam >> 16
Gdip_FillEllipse(pGraphic1, hBrush, mx-penwidth/2, my-penwidth/2, penwidth, penwidth)
UpdateLayeredWindow(hwnd1, hdc1, 0, 0, width1, height1)
Gdip_FillEllipse(pGraphic2, hBrush, mx-penwidth/2, my-penwidth/2, penwidth, penwidth)
OnMessage(0x200, "WM_MOUSEMOVE")
OnMessage(0x202, "WM_LBUTTONUP")
}
WM_LBUTTONUP(wParam, lParam)
{
OnMessage(0x200, "") ;"WM_MOUSEMOVE"
OnMessage(0x202, "") ;"WM_LBUTTONUP"
}
WM_MOUSEMOVE(wParam, lParam)
{
Local empty
oldlbutton:=lbutton
GetKeyState,lbutton,LButton,P
If (lbutton="U")
Return
oldmx:=mx
oldmy:=my
mx:=lParam & 0xFFFF
my:=lParam >> 16
Gdip_DrawLine(pGraphic1, hPen, oldmx, oldmy, mx, my)
UpdateLayeredWindow(hwnd1, hdc1, 0, 0, width1, height1)
Gdip_DrawLine(pGraphic2, hPen, oldmx, oldmy, mx, my)
}
RGBTOBGR(rgb)
{
StringMid, prefix, rgb, 1, 2
offset=0
If (prefix="0x")
offset=2
Else
prefix=
StringMid, r, rgb,% 1+offset, 2
StringMid, g, rgb,% 3+offset, 2
StringMid, b, rgb,% 5+offset, 2
Return, prefix . b . g . r
}
DECR_G_BTOHEXRGB(rgb)
{
StringSplit,color_,rgb,%A_Space% ;Transform dec "R G B" to hex "RGB"
rgb=
Loop,% color_0
{
tempcolor:=color_%A_Index%
SetFormat,Integer,Hex
EnvAdd,tempcolor,0x100
SetFormat,Integer,Dec
StringRight,tempcolor,tempcolor,2
rgb=%rgb%%tempcolor%
}
Return,rgb
}
CHANGEWALLPAPER:
;Stolen from Sean at http://www.autohotkey.com/forum/topic16905.html
sFile = %A_Scriptdir%\%wallpaperfile%
sOpt := "STRETCH"
WPSTYLE_CENTER := 0
WPSTYLE_TILE := 1
WPSTYLE_STRETCH := 2
WPSTYLE_MAX := 3
COM_Init()
pad := COM_CreateObject("{75048700-EF1F-11D0-9888-006097DEACF9}", "{F490EB00-1240-11D1-9888-006097DEACF9}")
DllCall(NumGet(NumGet(1*pad)+28), "Uint", pad, "int64P", WPSTYLE_%sOpt%<<32|8, "Uint", 0) ; SetWallpaperOptions
/*
DllCall(NumGet(NumGet(1*pad)+24), "Uint", pad, "int64P", nOpt:=8, "Uint", 0); GetWallpaperOptions
RegExMatch("CENTER TILE STRETCH MAX", "(?:\w+\s+){" . nOpt>>32 . "}(?<OPTION>\w+\b)", WPSTYLE_)
MsgBox, % WPSTYLE_OPTION
*/
DllCall(NumGet(NumGet(1*pad)+20), "Uint", pad, "Uint", COM_Unicode4Ansi(wFile,sFile), "Uint", 0) ; SetWallpaper
DllCall(NumGet(NumGet(1*pad)+12), "Uint", pad, "Uint", 7) ; ApplyChanges
COM_Release(pad)
COM_Term()
Return
#Include Gdip.ahk
;Download from tic at http://www.autohotkey.com/forum/topic32238.html
#Include COM.ahk
;Download from Sean at http://www.autohotkey.com/forum/topic22923.html