PBWIn 9 - see thread http://www.powerbasic.com/support/pb...292#post309292
Code:
' To demonstrate "dirty regions" - invalidating then redrawing regions
' rather than the whole client area
' It's a faster way of refreshing the display if only a small part needs
' to be redrawn.
'
' Thanks to Chris Boss for pointing this technique out to me.
'
' Chris Holbrook Feb 2009
'
' Place the cursor on the dialog's client area, and hold the left button
' down then drag the mouse a little way. Release the left button, and the
' area defined will be overwritten by a region of corresponding size from the
' top left of the dialog's client area.
'
#compile exe
#dim all
#debug display on

#include "win32api.inc"
global ghD              as dword ' window handle for dialog
global ghStatic         as dword ' window handle for label control
global gHCDC            as dword ' memory DC
global ghMemBMP         as dword ' compatible bitmap
global gOriginalProc    as dword ' original WndProc for label control
'-----------------------------------------------------------------
function LBCB ( byval hWnd as dword, byval wMsg as dword, byval wParam as dword, byval lParam as long) as long
    local hdc, hbrush, holdbrush as dword
    local i, W, H as long
    local r as rect
    local PS as PAINTSTRUCT
    local s as string
    static paintcount as long
    static OrgX, OrgY, DestX, DestY as long
    
    select case wMsg
        case %wm_user + 400                     ' initialisation
            's = "starting..."
            'sendmessage ghD, %wm_settext, 0, byval strptr(s)
            'sleep 1000
            hdc = getdc(ghStatic)               ' set up the comaptible memory DC and bitmap
            gHCDC = createcompatibleDC(hDC)
            getclientrect ghStatic, byval varptr(r)
            W = r.nright - r.nleft
            H = r.nbottom - r.ntop
            ghMemBMP = CreateCompatibleBitmap(hdc, W, H)
            selectobject(gHCDC, ghMemBMP)
            setbkmode gHCDC, %transparent
            patblt gHCDC, 0, 0, W, H, %WHITENESS
            '
            s = "@@@@@@@@ABCDEFGHIJKLMNOPQRSYUVWXYZabcdefghijklmnopqrstuvwxyz" ' draw text on memory DC
            for i = 0 to 21
                'movetoEx ghCDC, i * 25, 2, byval 0
                TextOut ghCDC, 2, i * 18, byval strptr(s), len(s)
            next
            invalidaterect ghStatic, byval 0, 0
        '
        case %wm_lbuttondown
            DestX = 0: DestY = 0
            's = "drawing"
            'sendmessage ghD, %wm_settext, 0, byval strptr(s)
            OrgX = lo(word,lparam)
            OrgY = hi(word,lparam)
        '
        case %wm_lbuttonup
            DestX = lo(word,lparam)
            DestY = hi(word,lparam)
            setrect r, min(OrgX, DestX), min(OrgY, DestY), max(DestX, OrgX), max(DestY,OrgY)
            invalidatergn (ghStatic, CreateRectRgnIndirect(byval varptr(r)), 0)
        '
        case %wm_paint
            hDC = BeginPaint(ghStatic, PS)
            local lBGColor as long
            lBGColor = rnd(0, &HFFFFFF)
            bitblt HDC, PS.rcPaint.nleft, PS.rcPaint.ntop, _
                        PS.rcPaint.nright - PS.rcPaint.nleft, _
                        PS.rcPaint.nbottom - PS.rcPaint.ntop, gHCDC, _
                        0, 0, %SRCCOPY
            endpaint ghStatic, ps
            function = 1
            exit function
    end select
    function = CallWindowProc(gOriginalProc, hWnd, wMsg, wParam, lParam)
   
end function
'-----------------------------------------------------------------
function pbmain () as long
    dialog new pixels, 0, "dirty rectangles                                                Chris Holbrook Feb 2009", 100, 100, 500, 400, %ws_sysmenu to ghD
    control add label, ghD, 101, "", 0, 0, 500, 400, %ss_notify
    ghStatic = getDlgItem(ghD, 101)
    gOriginalProc  = SetWindowLong(ghStatic, %GWL_WNDPROC, codeptr(LBCB)) ' Subclasses Graphic control
    sendmessage ghStatic, %wm_user + 400, 0, 0 ' initialise WndProc

    dialog show modal ghD

end function