The really cool part is that all functions are implemented entirely within AHk -- no external calls, whatsoever.
SelectCanvas* p_title = name of AHk GUI window
* p_origin?x, p_origin?y = origin of associated coordinate system (cs), or specify "native" for p_origin?x to use display coordinate systemCanvas_SetPixel* p_x, p_y = coordinates
* p_size = size of pixel
* p_color = 0xRRGGBB or color name
* p_refresh = forced refreshCanvas_DrawLine* p_x1, p_y1, p_x2, p_y2
* p_w = width of line
* p_colorCanvas_DrawCircle* p_x, p_y = center
* p_r = radius
* p_t = thickness of outline
* p_color
* p_smooth = true/false[/list]
Enjoy!
demonstration:
Gui, Show, x100 y50 w281 h281, Analytic Graphing Facility SelectCanvas( "Analytic Graphing Facility", 140, 140, ?, ? ) Canvas_DrawCircle( 0, 0, 40, 1, "blue" ) Canvas_DrawCircle( 0, 0, 60, 2, "navy", false ) Canvas_DrawCircle( 0, 0, 80, 3, "red" ) Canvas_DrawCircle( 0, 0, 100, 4, "maroon", false ) Canvas_DrawCircle( -78, 78, 40, 2, "teal" ) Canvas_DrawCircle( 78, 78, 40, 2, "teal", false ) Canvas_DrawCircle( 78, -78, 40, 2, "teal" ) Canvas_DrawCircle( -78, -78, 40, 2, "teal", false ) Canvas_DrawLine( -140, 140, -80, 80, 2, "white" ) Canvas_DrawLine( -140, -140, -80, -80, 2, "white" ) Canvas_DrawLine( 140, 140, 80, 80, 2, "white" ) Canvas_DrawLine( 140, -140, 80, -80, 2, "white" ) Canvas_DrawLine( -29, -1, -21, -1, 2, "green" ) Canvas_DrawLine( -25, 10, -35, -10, 2, "green" ) Canvas_DrawLine( -25, 10, -15, -10, 2, "green" ) Canvas_DrawLine( -10, 0, 10, 0, 2, "green" ) Canvas_DrawLine( -10, 10, -10, -10, 2, "green" ) Canvas_DrawLine( 10, 10, 10, -10, 2, "green" ) Canvas_DrawLine( 15, 10, 15, -10, 2, "green" ) Canvas_DrawLine( 15, -3, 24, 6, 2, "green" ) Canvas_DrawLine( 15, -1, 28, -10, 2, "green" ) return
functions:
SelectCanvas( p_title, p_origin?x, p_origin?y, byref r_origin?x, byref r_origin?y ) { static hw_canvas, origin?x, origin?y if ( p_title ) { Process, Exist WinGet, hw_canvas, ID, %p_title% ahk_class AutoHotkeyGUI ahk_pid %ErrorLevel% origin?x := p_origin?x origin?y := p_origin?y } else { r_origin?x := origin?x r_origin?y := origin?y } return, hw_canvas } Canvas_SetPixel( p_x, p_y, p_size, p_color, p_refresh=true ) { static total total++ hw_canvas := SelectCanvas( false, ?, ?, origin?x, origin?y ) if ( origin?x != "native" ) { p_x += origin?x p_y := origin?y-p_y } Gui, Add, Progress, % "x" ( p_x-1 ) " y" ( p_y-1 ) " w" ( p_size+2 ) " h" ( p_size+2 ) " background" p_color ; WS_EX_STATICEDGE Control, ExStyle, -0x20000, msctls_progress32%total%, ahk_id %hw_canvas% if ( p_refresh ) WinSet, Redraw,, ahk_id %hw_canvas% } Canvas_DrawLine( p_x1, p_y1, p_x2, p_y2, p_w, p_color ) { x := p_x1-1 if ( p_x1 > p_x2 ) { x := p_x2-1 p_x2 := p_x1 p_x1 := x+1 temp := p_y2 p_y2 := p_y1 p_y1 := temp } if ( p_x1 = p_x2 ) { loop, % ( p_y1-p_y2+1 ) Canvas_SetPixel( p_x1, p_y1-A_Index+1, p_w, p_color, false ) } else { m := ( p_y2-p_y1 )/( p_x2-p_x1 ) loop, % ( p_x2-p_x1+1 ) { x++ Canvas_SetPixel( x, m*( x-p_x1 )+p_y1, p_w, p_color, false ) } } WinSet, Redraw,, % "ahk_id " SelectCanvas( "", ?, ?, ?, ? ) } Canvas_DrawCircle( p_x, p_y, p_r, p_t, p_color, p_smooth=true ) { delta := p_t*!p_smooth+p_smooth r2 := p_r**2 x = 0 y = %p_r% loop, % Ceil( p_r/1.4142/delta ) { if ( y-Sqrt( r2-x**2 ) > 0.5 ) y -= delta Canvas_SetPixel( p_x+x, p_y+y, p_t, p_color, false ) Canvas_SetPixel( p_x+y, p_y+x, p_t, p_color, false ) Canvas_SetPixel( p_x-x, p_y+y, p_t, p_color, false ) Canvas_SetPixel( p_x-y, p_y+x, p_t, p_color, false ) Canvas_SetPixel( p_x-x, p_y-y, p_t, p_color, false ) Canvas_SetPixel( p_x-y, p_y-x, p_t, p_color, false ) Canvas_SetPixel( p_x+x, p_y-y, p_t, p_color, false ) Canvas_SetPixel( p_x+y, p_y-x, p_t, p_color, false ) x += delta } WinSet, Redraw,, % "ahk_id " SelectCanvas( "", ?, ?, ?, ? ) }