Code: Select all
; Direct2D QuickStart - Drawing a Simple Rectangle
; https://docs.microsoft.com/en-us/windows/win32/direct2d/getting-started-with-direct2d
#DllLoad D2d1.dll
Gui := GuiCreate(, "Direct2D QuickStart - Drawing a Simple Rectangle")
Gui.Show("w500 h500")
Gui.OnEvent("Close", "ExitApp")
; Create an ID2D1Factory.
ID2D1Factory := BufferAlloc(16)
DllCall("Ole32.dll\CLSIDFromString", "Str", "{06152247-6f50-465a-9245-118bfd3b6007}", "Ptr", ID2D1Factory)
pIFactory := 0
DllCall("D2d1.dll\D2D1CreateFactory", "Int", 0, "Ptr", ID2D1Factory, "Ptr", 0, "UPtrP", pIFactory)
/*
typedef struct D2D1_RENDER_TARGET_PROPERTIES
{
D2D1_RENDER_TARGET_TYPE type;
D2D1_PIXEL_FORMAT pixelFormat;
FLOAT dpiX;
FLOAT dpiY;
D2D1_RENDER_TARGET_USAGE usage;
D2D1_FEATURE_LEVEL minLevel;
} D2D1_RENDER_TARGET_PROPERTIES;
*/
D2D1_RENDER_TARGET_PROPERTIES := BufferAlloc(28)
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 0) ; type
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 4) ; pixelFormat.format
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 8) ; pixelFormat.alphaMode
NumPut("Float", 0, D2D1_RENDER_TARGET_PROPERTIES, 12) ; dpiX
NumPut("Float", 0, D2D1_RENDER_TARGET_PROPERTIES, 16) ; dpiY
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 20) ; usage
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 24) ; minLevel
/*
typedef struct D2D1_HWND_RENDER_TARGET_PROPERTIES
{
HWND hwnd;
D2D1_SIZE_U pixelSize;
D2D1_PRESENT_OPTIONS presentOptions;
} D2D1_HWND_RENDER_TARGET_PROPERTIES;
*/
D2D1_HWND_RENDER_TARGET_PROPERTIES := BufferAlloc(2*A_PtrSize+8)
NumPut("Ptr" , Gui.hWnd , D2D1_HWND_RENDER_TARGET_PROPERTIES, 0) ; hwnd
NumPut("UInt", Gui.ClientPos.W, D2D1_HWND_RENDER_TARGET_PROPERTIES, A_PtrSize) ; pixelSize.width
NumPut("UInt", Gui.ClientPos.H, D2D1_HWND_RENDER_TARGET_PROPERTIES, A_PtrSize+4) ; pixelSize.height
NumPut("Int" , 0 , D2D1_HWND_RENDER_TARGET_PROPERTIES, A_PtrSize+8) ; presentOptions
; Create an ID2D1HwndRenderTarget.
pRenderTarget := 0
ComCall(2+12, pIFactory, "Ptr", D2D1_RENDER_TARGET_PROPERTIES, "Ptr", D2D1_HWND_RENDER_TARGET_PROPERTIES, "UPtrP", pRenderTarget)
COLORF := BufferAlloc(16)
NumPut("Float", 0xFF, COLORF, 0) ; R
NumPut("Float", 0x00, COLORF, 4) ; G
NumPut("Float", 0x00, COLORF, 8) ; B
NumPut("Float", 0xFF, COLORF, 12) ; A
; Create a Brush.
pSolidBrush := 0
ComCall(2+1+5, pRenderTarget, "Ptr", COLORF, "Ptr", 0, "UPtrP", pSolidBrush)
;MsgBox "pBrush -> " . pSolidBrush
; Draw the Rectangle.
; BeginDraw
ComCall(2+1+45, pRenderTarget, "Int") ; Error: Function returned failure. | Specifically: 0xdc993630
; DrawRectangle
RECTF := BufferAlloc(16)
NumPut("Float", 100, RECTF, 0) ; left
NumPut("Float", 100, RECTF, 4) ; top
NumPut("Float", 200, RECTF, 8) ; right
NumPut("Float", 200, RECTF, 12) ; bottom
ComCall(2+1+13, pRenderTarget, "Ptr", RECTF, "Ptr", pSolidBrush, "Float", 1, "Ptr", 0, "Int")
; EndDraw
ComCall(2+1+46, pRenderTarget, "UInt64P", 0, "UInt64P", 0)
;MsgBox "Done!"
;ExitApp
AutoHotkey v2.0-a136-feda41f4:
Code: Select all
#Requires AutoHotkey v2.0-a136-feda41f4
; Direct2D QuickStart - Drawing a Simple Rectangle
; https://docs.microsoft.com/en-us/windows/win32/direct2d/getting-started-with-direct2d
#DllLoad D2D1.dll
wnd := Gui(, "Direct2D QuickStart - Drawing a Simple Rectangle")
wnd.Show("w500 h500")
wnd.OnEvent("Escape", ExitApp)
wnd.OnEvent("Close", ExitApp)
; Create an ID2D1Factory.
ID2D1Factory := Buffer(16)
DllCall("Ole32\CLSIDFromString", "Str", "{06152247-6f50-465a-9245-118bfd3b6007}", "Ptr", ID2D1Factory)
DllCall("D2D1\D2D1CreateFactory", "Int", 0, "Ptr", ID2D1Factory, "Ptr", 0, "PtrP", &pIFactory:=0)
/*
typedef struct D2D1_RENDER_TARGET_PROPERTIES
{
D2D1_RENDER_TARGET_TYPE type;
D2D1_PIXEL_FORMAT pixelFormat;
FLOAT dpiX;
FLOAT dpiY;
D2D1_RENDER_TARGET_USAGE usage;
D2D1_FEATURE_LEVEL minLevel;
} D2D1_RENDER_TARGET_PROPERTIES;
*/
D2D1_RENDER_TARGET_PROPERTIES := Buffer(28)
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 0) ; type
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 4) ; pixelFormat.format
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 8) ; pixelFormat.alphaMode
NumPut("Float", 0, D2D1_RENDER_TARGET_PROPERTIES, 12) ; dpiX
NumPut("Float", 0, D2D1_RENDER_TARGET_PROPERTIES, 16) ; dpiY
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 20) ; usage
NumPut("Int" , 0, D2D1_RENDER_TARGET_PROPERTIES, 24) ; minLevel
/*
typedef struct D2D1_HWND_RENDER_TARGET_PROPERTIES
{
HWND hwnd;
D2D1_SIZE_U pixelSize;
D2D1_PRESENT_OPTIONS presentOptions;
} D2D1_HWND_RENDER_TARGET_PROPERTIES;
*/
wnd.GetClientPos(&cx, &cy, &cw, &ch)
D2D1_HWND_RENDER_TARGET_PROPERTIES := Buffer(2*A_PtrSize+8)
NumPut("Ptr" , wnd.hWnd, D2D1_HWND_RENDER_TARGET_PROPERTIES, 0) ; hwnd
NumPut("UInt", cw , D2D1_HWND_RENDER_TARGET_PROPERTIES, A_PtrSize) ; pixelSize.width
NumPut("UInt", ch , D2D1_HWND_RENDER_TARGET_PROPERTIES, A_PtrSize+4) ; pixelSize.height
NumPut("Int" , 0 , D2D1_HWND_RENDER_TARGET_PROPERTIES, A_PtrSize+8) ; presentOptions
; Create an ID2D1HwndRenderTarget.
ComCall(2+12, pIFactory, "Ptr", D2D1_RENDER_TARGET_PROPERTIES, "Ptr", D2D1_HWND_RENDER_TARGET_PROPERTIES, "PtrP", &pRenderTarget:=0)
COLORF := Buffer(16)
NumPut("Float", 0xFF, COLORF, 0) ; R
NumPut("Float", 0x00, COLORF, 4) ; G
NumPut("Float", 0x00, COLORF, 8) ; B
NumPut("Float", 0xFF, COLORF, 12) ; A
; Create a Brush.
ComCall(2+1+5, pRenderTarget, "Ptr", COLORF, "Ptr", 0, "PtrP", &pSolidBrush:=0)
; Draw the Rectangle.
; BeginDraw
ComCall(2+1+45, pRenderTarget, "Int") ; Error: Function returned failure. | Specifically: 0xdc993630
; DrawRectangle
RECTF := Buffer(16)
NumPut("Float", 100, RECTF, 0) ; left
NumPut("Float", 100, RECTF, 4) ; top
NumPut("Float", 200, RECTF, 8) ; right
NumPut("Float", 200, RECTF, 12) ; bottom
ComCall(2+1+13, pRenderTarget, "Ptr", RECTF, "Ptr", pSolidBrush, "Float", 1, "Ptr", 0, "Int")
; EndDraw
ComCall(2+1+46, pRenderTarget, "UInt64P", 0, "UInt64P", 0)