- Can insert up to 20 different objects
- Alt + Arrow Keys for smooth moving
- Control + Arrow Keys for smooth resizing
- Select Object then draw a rectangle for speed moving or resizing
- Can save to Image
- Can print
To do :
- Control the Z-Order of the objects backward or forward
- Insert table
- Insert XLS Chart [If I can

Have fun
Code: Select all
#PFA_JUSTIFY = $4
#PFA_FULL_INTERWORD = $4
#PFA_FULL_INTERLETTER = $5
#PFA_FULL_SCALED = $6
#PFA_FULL_GLYPHS = $7
#PFA_SNAP_GRID = $8
#EC_LEFTMARGIN = $1
#EC_RIGHTMARGIN = $2
#EC_USEFONTINFO = $FFFF
#EM_SETMARGINS = $D3
#EM_GETMARGINS = $D4
#CAPTUREBLT = $40000000
UseJPEGImageEncoder()
UsePNGImageEncoder()
Global hhook,sel.RECT,oldCallback,hdc,drwflag,xt,yt,xb,yb,Ingad,Outgad,Lastgad,oldgad
Global Dim Gadinf(20,2)
Procedure SetAlignment(Gad, Align)
alg.PARAFORMAT2
alg\dwMask = #PFM_ALIGNMENT
alg\cbSize = SizeOf(alg)
alg\wAlignment = Align
SendMessage_(GadgetID(Gad), #EM_SETTYPOGRAPHYOPTIONS, #TO_ADVANCEDTYPOGRAPHY, #TO_ADVANCEDTYPOGRAPHY)
SendMessage_(GadgetID(Gad), #EM_SETPARAFORMAT, 0, alg)
EndProcedure
Procedure SetMargin(Gad, PageW,PageH, LeftM, TopM, RightM, BottomM)
r.RECT
r\left = LeftM
r\top = TopM
r\right = PageW - RightM
r\bottom = PageH - BottomM
;width = r\right - r\left
;height = r\bottom - r\top
;ResizeGadget(1,10,10,width+LeftM+RightM,height+TopM+BottomM)
;SendMessage_(GadgetID(Gad), #EM_SETRECTNP, 0, r)
SendMessage_(GadgetID(Gad), #EM_SETRECT, 0, r)
EndProcedure
Procedure MHookProc(nCode, wParam, lParam)
*ms.MOUSEHOOKSTRUCT = lParam
Select wParam
Case #WM_RBUTTONDOWN
DisplayPopupMenu(0, WindowID(0))
Case #WM_LBUTTONDOWN
If Ingad = 21
GetWindowRect_(GadgetID(21), r.RECT)
ClipCursor_(r)
GetCursorPos_(p.POINT)
ScreenToClient_(GadgetID(21), p)
SetRect_(sel,p\x,p\y,p\x,p\y)
hdc = GetDC_(GadgetID(21))
If Not pen
pen = CreatePen_(#PS_DASH , 1, #Cyan)
brush = GetStockObject_(#NULL_BRUSH)
EndIf
SelectObject_(hdc, pen)
SelectObject_(hdc, brush)
SetROP2_(hdc, #R2_XORPEN)
Rectangle_(hdc, sel\left,sel\top,sel\right,sel\bottom)
drwflag = 1
EndIf
If Ingad <> 0
Outgad = Ingad
EndIf
Case #WM_LBUTTONUP
ClipCursor_(0)
ReleaseDC_(GadgetID(21), hdc)
If drwflag = 1
xt = sel\left
yt = sel\top
xb = sel\right
yb = sel\bottom
drwflag = 0
EndIf
Case #WM_MOUSEMOVE
GetCursorPos_(p.POINT)
ScreenToClient_(GadgetID(21), p)
hGad = ChildWindowFromPoint_ (GadgetID(21), p\y<< 32+p\x)
Ingad = GetDlgCtrlID_(hGad)
Rectangle_(hdc, sel\left,sel\top,sel\right,sel\bottom)
sel\right = p\x
sel\bottom = p\y
Rectangle_(hdc, sel\left,sel\top,sel\right,sel\bottom)
If Ingad < 20 And Ingad> 0 And drwflag = 0
; hdc = GetDC_(GadgetID(21))
; If Not pen2
; pen2 = CreatePen_(#PS_DOT, 2, #Red)
; brush2 = GetStockObject_(#NULL_BRUSH)
; EndIf
; SelectObject_(hdc, pen2)
; SelectObject_(hdc, brush2)
; Rectangle_(hdc, GadgetX(Ingad)-2,GadgetY(Ingad)-2,GadgetWidth(Ingad)+GadgetX(Ingad)+4, GadgetHeight(Ingad)+GadgetY(Ingad)+4)
; ReleaseDC_(GadgetID(21), hdc)
Lastgad = Ingad
;rectflag = 1
EndIf
; If ingad <> oldgad And rectflag = 1
; InvalidateRect_(GadgetID(21),0,1)
; rectflag = 0
; EndIf
; If IsGadget(Ingad)
; oldgad = Ingad
; EndIf
EndSelect
ProcedureReturn result
EndProcedure
CreateImage(0, 250, 350)
StartDrawing(ImageOutput(0))
For x = 0 To 249
For y = 0 To 349
Plot(x,y, RGB(x,y,x*y))
Next
Next
StopDrawing()
If OpenWindow(0, 0, 0,600,400, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
If CreatePopupMenu(0)
MenuItem(1, "Undo")
MenuItem(2, "Redo")
MenuItem(3, "Cut")
MenuItem(4, "Copy")
MenuItem(5, "Paste")
MenuBar()
OpenSubMenu("Options")
MenuItem(6, "Window...")
MenuItem(7, "Gadget...")
CloseSubMenu()
MenuBar()
MenuItem( 8, "Quit")
EndIf
EditorGadget(21, 10, 10, 480, 320)
SendMessage_(GadgetID(21), #EM_CANUNDO, 0, 0)
SendMessage_(GadgetID(21), #EM_CANREDO, 0, 0)
SendMessage_(GadgetID(21), #EM_SETTARGETDEVICE, 0, 0)
;SetMargin(21,450,330,10,10,20,50)
; SetGadgetColor(1, #PB_Gadget_BackColor, $E8FEFE)
; SetGadgetColor(1, #PB_Gadget_FrontColor, #Blue)
LoadFont(0,"Tahoma",14,#PB_Font_HighQuality)
SetGadgetFont(21,FontID(0))
ContainerGadget(22,10,315,480,40)
ButtonGadget(23,0,30,60,22,"Left")
ButtonGadget(24,65,30,60,22,"Center")
ButtonGadget(25,130,30,60,22,"Right")
ButtonGadget(26,195,30,60,22,"Full")
ComboBoxGadget(27,275,30,70,22,#PB_ComboBox_Editable)
AddGadgetItem(27, -1, " Image")
AddGadgetItem(27, -1, " Text Box")
AddGadgetItem(27, -1, " Table")
AddGadgetItem(27, -1, " Chart")
ButtonGadget(28,350,30,40,22,"Insert")
ButtonGadget(29,395,30,40,22,"Resize")
ButtonGadget(30,440,30,40,22,"Move")
ButtonGadget(31,485,30,40,22,"Print")
ButtonGadget(32,530,30,50,22,"Refresh")
TextGadget(33,10,0,200,22,"No Selected Gadget !")
SetGadgetFont(33,FontID(0))
SetGadgetColor(33,#PB_Gadget_FrontColor,#Red)
HideGadget(33,1)
CloseGadgetList()
SetGadgetState(27, 0)
lpdwProcessId = GetWindowThreadProcessId_(GadgetID(21), 0)
hhook = SetWindowsHookEx_(#WH_MOUSE, @MHookProc(),GetModuleHandle_(0),lpdwProcessId)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 21
Case 23
SetAlignment(Outgad, #PFA_LEFT)
Case 24
SetAlignment(Outgad,#PFA_CENTER)
Case 25
SetAlignment(Outgad,#PFA_RIGHT)
Case 26
SetAlignment(Outgad,#PFA_JUSTIFY)
Case 27
Result = GetGadgetState(27)
Case 28
If xt <> xb
If xt > xb
Swap xt,xb
EndIf
If yt > yb
Swap yt,yb
EndIf
ImN + 1
If Result = 0
CopyImage(0,ImN)
ResizeImage(ImN,xb-xt,yb-yt)
ImageGadget(ImN,xt,yt,xb-xt,yb-yt,ImageID(ImN))
Imageflag = 1
ElseIf Result = 1
EditorGadget(ImN,xt,yt,xb-xt,yb-yt)
SendMessage_(GadgetID(ImN), #EM_SETTARGETDEVICE, 0, 0)
;SetClassLongPtr_(GadgetID(ImN),#GCL_HBRBACKGROUND,GetStockObject_(#NULL_BRUSH))
Textflag = 0
EndIf
SetWindowLongPtr_(GadgetID(ImN), #GWL_STYLE, GetWindowLongPtr_(GadgetID(ImN), #GWL_STYLE) |#WS_CLIPSIBLINGS)
SetWindowPos_(GadgetID(ImN), #HWND_TOPMOST, 0, 0, 0, 0,#SWP_NOSIZE|#SWP_NOMOVE| #SWP_SHOWWINDOW|#SWP_NOACTIVATE)
SetParent_(GadgetID(ImN),GadgetID(21))
GadInf(ImN,0) = GadgetX(ImN)
GadInf(ImN,1) = GadgetY(ImN)
GadInf(ImN,2) = Result
InvalidateRect_(GadgetID(21),0,1)
EndIf
Case 29
If IsGadget(Lastgad)
HideGadget(33,1)
ResizeImage(Lastgad,xb-xt,yb-yt)
ResizeGadget(Lastgad,xt,yt,xb-xt,yb-yt)
SetGadgetState(Lastgad,ImageID(Lastgad))
GadInf(Lastgad,0) = xt
GadInf(Lastgad,1) = yt
InvalidateRect_(GadgetID(21),0,1)
Else
HideGadget(33,0)
EndIf
Case 30
If IsGadget(Lastgad)
HideGadget(33,1)
ResizeGadget(Lastgad,xt,yt,GadgetWidth(Lastgad),GadgetHeight(Lastgad))
GadInf(Lastgad,0) = xt
GadInf(Lastgad,1) = yt
InvalidateRect_(GadgetID(21),0,1)
Else
HideGadget(33,0)
EndIf
Case 31
GetClientRect_(GadgetID(21),rc.RECT)
ClientToScreen_(GadgetID(21),rc)
;If width > 0 And height > 0
hBitmap = CreateImage(0,GadgetWidth(1),GadgetHeight(1))
hdc = StartDrawing(ImageOutput(0))
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, GadgetWidth(1),GadgetHeight(1), GetDC_(GetDesktopWindow_()), rc\left, rc\top, #SRCCOPY | #CAPTUREBLT)
;StretchBlt_(hdc, 0, 0, width*4, height*4, GetDC_(GetDesktopWindow_()), rc\left, rc\top,width,height,#SRCCOPY | #CAPTUREBLT)
StopDrawing()
;EndIf
DeleteDC_(hdc)
SaveImage(0,"F:\Print_Test.png",#PB_ImagePlugin_PNG)
; If PrintRequester()
; If StartPrinting("PureBasic Test")
; If StartDrawing(PrinterOutput())
; DrawImage(ImageID(0), 0, 0,width*4,height*4)
; StopDrawing()
; EndIf
; StopPrinting()
; EndIf
; EndIf
Case 32
InvalidateRect_(GadgetID(21),0,1)
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 1
SendMessage_(GadgetID(21),#EM_UNDO,0,0)
;SendMessage_(GetFocus_(),#WM_UNDO,0,0)
Case 2
SendMessage_(GadgetID(21),#EM_REDO,0,0)
Case 3
SendMessage_(GetFocus_(),#WM_CUT,0,0)
Case 4
SendMessage_(GetFocus_(),#WM_COPY,0,0)
Case 5
SendMessage_(GadgetID(1),#WM_PASTE,0,0)
Case 8
Quit = 1
EndSelect
Case #WM_SIZE,#WM_MOVE,#WM_PAINT
GetClientRect_(WindowID(0),r.RECT)
ResizeGadget(21,10,10,r\right-20,r\bottom-80)
ResizeGadget(22,10,r\bottom-60,r\right-20,r\bottom-80)
For i = 1 To 20
If IsGadget(i)
ResizeGadget(i,GadInf(i,0),GadInf(i,1),#PB_Ignore, #PB_Ignore)
Else
Break
EndIf
Next
Case #WM_MOUSEMOVE
SetCursor_(LoadCursor_(0,#IDC_ARROW))
Case #WM_CHAR
;Debug "#CHAR: " + Str(EventwParam())
Case #WM_KEYDOWN
If GetAsyncKeyState_(#VK_CONTROL) & $8000 = 32768 And IsGadget(Lastgad)
If EventwParam() = 37 And GadgetX(Lastgad) >= 0
ResizeGadget(Lastgad,GadgetX(Lastgad)+1,#PB_Ignore,GadgetWidth(Lastgad)-2, #PB_Ignore)
If GadInf(Lastgad,2) = 0
FreeImage(Lastgad)
CopyImage(0,Lastgad)
ResizeImage(Lastgad,GadgetWidth(Lastgad)-1,GadgetHeight(Lastgad))
SetGadgetState(Lastgad,ImageID(Lastgad))
EndIf
ElseIf EventwParam() =39
ResizeGadget(Lastgad,GadgetX(Lastgad)-1,GadgetY(Lastgad),GadgetWidth(Lastgad)+2, #PB_Ignore)
If GadInf(Lastgad,2) = 0
FreeImage(Lastgad)
CopyImage(0,Lastgad)
ResizeImage(Lastgad,GadgetWidth(Lastgad)+1,GadgetHeight(Lastgad))
SetGadgetState(Lastgad,ImageID(Lastgad))
EndIf
ElseIf EventwParam() =38 And GadgetY(Lastgad) >= 0
ResizeGadget(Lastgad,GadgetX(Lastgad),GadgetY(Lastgad)+1,GadgetWidth(Lastgad), GadgetHeight(Lastgad)-2)
If GadInf(Lastgad,2) = 0
FreeImage(Lastgad)
CopyImage(0,Lastgad)
ResizeImage(Lastgad,GadgetWidth(Lastgad),GadgetHeight(Lastgad)-1)
SetGadgetState(Lastgad,ImageID(Lastgad))
EndIf
ElseIf EventwParam() =40
ResizeGadget(Lastgad,GadgetX(Lastgad),GadgetY(Lastgad)-1,GadgetWidth(Lastgad), GadgetHeight(Lastgad)+2)
If GadInf(Lastgad,2) = 0
FreeImage(Lastgad)
CopyImage(0,Lastgad)
ResizeImage(Lastgad,GadgetWidth(Lastgad),GadgetHeight(Lastgad)+1)
SetGadgetState(Lastgad,ImageID(Lastgad))
EndIf
Else
HideGadget(33,0)
EndIf
EndIf
If IsGadget(Lastgad)
HideGadget(33,1)
GadInf(Lastgad,0) = GadgetX(Lastgad)
GadInf(Lastgad,1) = GadgetY(Lastgad)
EndIf
Case #WM_KEYUP
InvalidateRect_(GadgetID(21),0,1)
Case #WM_DEADCHAR
;Debug "#DEADCHAR: " + Str(EventwParam())
Case #WM_SYSCHAR ;Alt + Char
;Debug "#SYSCHAR: " + Str(EventwParam())
Case #WM_SYSKEYDOWN
If GetAsyncKeyState_(#VK_MENU) & $8000 = 32768 And IsGadget(Lastgad)
If EventwParam() = 37 And IsGadget(Lastgad) And GadgetX(Lastgad) >= 0
ResizeGadget(Lastgad,GadgetX(Lastgad)-1,GadgetY(Lastgad),#PB_Ignore, #PB_Ignore)
ElseIf EventwParam() =39
ResizeGadget(Lastgad,GadgetX(Lastgad)+1,GadgetY(Lastgad),#PB_Ignore, #PB_Ignore)
ElseIf EventwParam() =38 And GadgetY(Lastgad) >= 0
ResizeGadget(Lastgad,GadgetX(Lastgad),GadgetY(Lastgad)-1,#PB_Ignore, #PB_Ignore)
ElseIf EventwParam() =40 And IsGadget(Lastgad)
ResizeGadget(Lastgad,GadgetX(Lastgad),GadgetY(Lastgad)+1,#PB_Ignore, #PB_Ignore)
ElseIf Not IsGadget(Lastgad)
HideGadget(33,0)
EndIf
EndIf
If IsGadget(Lastgad)
HideGadget(33,1)
GadInf(Lastgad,0) = GadgetX(Lastgad)
GadInf(Lastgad,1) = GadgetY(Lastgad)
EndIf
;Debug "#SYSKEYDOWN: " + Str(EventwParam())
Case #WM_SYSKEYUP
;Debug "#SYSKEYUP: " + Str(EventwParam())
EndSelect
Until Quit = 1
UnhookWindowsHookEx_(hhook)
EndIf