Here's a simple GDI example that clears a window, and draws a line and text, with no flickering when the window is resized.
Strict
Extern "win32"
Function ReleaseDC( hwnd:Int, hdc:Int )
Function GetCurrentObject( hdc:Int, objectType:Int )
Function MoveToEx( hdc:Int, x:Int, y:Int, point:Int )
Function LineTo( hdc:Int, x:Int, y:Int )
Function CreatePen:Int(fnPenStyle:Int,nWidth:Int,crColor:Int)
Function FillRect(hdc:Int,rect:Byte Ptr,hbr:Int)
Function GetDeviceCaps(hdc%,index%)
Function DrawTextA(hdc%,txt$z,nCount%,tRECT:Byte Ptr,format%)
Function MulDiv(nNumber%,nNumerator%,nDenominator%)
Function SetBkMode(hdc%,mode%)
Function SetTextColor(hdc%,color%)
Function CreateFontA(nHeight%,nWidth%,nEscapement%,nOrientation%,fnWeight%,fdwItalic%,fdwUnderline%,fdwStrikeOut%,fdwCharSet%,fdwOutputPrecision%,fdwClipPrecision%,fdwQuality%,fdwPitchAndFamily%,lpszFace$z)
EndExtern
Global win:TGadget = CreateWindow("LineTest", 0,0, 400,400 )
Global canvas:TGadget = CreateCanvas( 0,0,400,400, win )
SetGadgetLayout canvas,1,1,1,1
SetGraphics CanvasGraphics(canvas)
Local g:TGadget=CreateComboBox(200,200,100,26,canvas)
SetGadgetLayout g,1,0,1,0
AddGadgetItem g,"Test"
SelectGadgetItem g,0
AddHook EmitEventHook,hook
While WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE
End
EndSelect
Wend
Function Hook:Object(id:Int,data:Object,context:Object)
Local event:TEvent=TEvent(data)
If Not event Return data
Select event.id
Case EVENT_GADGETPAINT,EVENT_WINDOWSIZE
SetGraphics CanvasGraphics(canvas)
GDICls()
gdiDrawLine(10,10,200,100)
Return
EndSelect
Return data
EndFunction
Function gdiCls()
Local pen:Int=CreatePen(0,10,$00FF0000)
Local hwnd:Int=QueryGadget( canvas, QUERY_HWND )
Local hdc:Int=GetDC( hwnd )
SelectObject(hdc,pen)
fillrect hdc,[0,0,GraphicsWidth(),GraphicsHeight()],pen
ReleaseDC(hwnd, hdc)
DeleteObject( pen )
EndFunction
Function gdiDrawLine(x#,y#,x2#,y2#,draw_last_pixel=True)
Local pen:Int=CreatePen(0,1,$0000FF00)
Local hwnd:Int=QueryGadget( canvas, QUERY_HWND )
Local hdc:Int=GetDC( hwnd )
SelectObject(hdc,pen)
MoveToEx(hdc,x,y,0)
LineTo(hdc,x2,y2)
gdiDrawText "Hello",0,0
ReleaseDC(hwnd, hdc)
DeleteObject( pen )
EndFunction
Function gdiDrawText(text$,x,y)
Local hwnd:Int=QueryGadget(canvas,QUERY_HWND)
Local hdc:Int=GetDC( hwnd )
Local size=12
Const LOGPIXELSYS = 90
Const DEFAULT_CHARSET = 1
Const OUT_DEFAULT_PRECIS = 0
Const CLIP_DEFAULT_PRECIS = 0
Const PROOF_QUALITY = 2
Const DEFAULT_PITCH = 0
Local weight%=FW_NORMAL , italics%=False , underline%=False
Local textformat=0
Const DT_NOCLIP=$100
Local width,height
Local fontobject%=CreateFontA(-MulDiv(size,GetDeviceCaps(hdc,LOGPIXELSYS),72), 0, 0, 0, weight, italics, underline, False, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "Arial")
SelectObject hdc,fontobject
SetTextColor hdc, 255 | 0 Shl 8 | 0 Shl 16
Local tf%=TextFormat|DT_NOCLIP
If width>0 And height>0 tf=TextFormat
SetBkMode hdc,$1
DrawTextA hdc,text$,text.Length,[x,y,x+width,y+height],tf
EndFunction
|