Update for Chris's post #2
Modified by Jim Fritts
Great work Chris and thank you for sharing!
Create and modify image in memory and BitBlt the changes to the screen control
Fills the Memory DC with green and then draws a new black line
~60 frames/second draw rate
Code:
' *************************************************************** ' This code can be used Royalty Free and Freely Distributed ! ' *************************************************************** #COMPILE EXE #REGISTER NONE #DIM ALL ' This is helpful to prevent errors in coding 'Update for Chris's post #2 'Modified by Jim Fritts 'Great work Chris and thank you for sharing! 'https://forum.powerbasic.com/forum/third-party-forums/cw/cwdf/744463-win32-and-ddt-code-examples?p=744464#post744464 'Create and modify image in memory and BitBlt the changes to the screen control 'Fills the Memory DC with green and then draws a new black line '~60 frames/second draw rate '#INCLUDE "win32api.inc" ' Must come first before other include files ! ' ************************************************************* ' Constants and Declares (#1) ' ************************************************************* DECLARE SUB LIB_InitColors() DECLARE SUB LIB_DeleteBrushes() ' %FORM1_LABEL2 = 100 %FORM1_THREADLABEL = 105 %FORM1_BUTTON1 = 110 ' // Size = 28 bytes TYPE tagMSG DWORD hwnd AS DWORD ' HWND message AS DWORD ' UINT wParam AS DWORD ' WPARAM lParam AS LONG ' LPARAM time AS DWORD ' DWORD pt AS POINT ' POINT END TYPE ' // Size = 16 bytes TYPE OLD_RECT_STRUCT DWORD ' Old PB definition nLeft AS LONG ' LONG left nTop AS LONG ' LONG top nRight AS LONG ' LONG right nBottom AS LONG ' LONG bottom END TYPE ' // Size = 16 bytes TYPE tagRECT DWORD left AS LONG ' LONG left top AS LONG ' LONG top right AS LONG ' LONG right bottom AS LONG ' LONG bottom END TYPE ' // GDI+ uses x, y, Width and Height as members instead of Left, Right, Top and Bottom TYPE GDIP_RECT_STRUCT DWORD x AS LONG ' LONG x y AS LONG ' LONG y Width AS LONG ' LONG Width Height AS LONG ' LONG Height END TYPE ' // To allow the use of both nLeft, etc, and Left, etc. ' // Size = 16 bytes UNION RECT OLD_RECT_STRUCT tagRECT GDIP_RECT_STRUCT END UNION ' // Size = 48 bytes TYPE WNDCLASSEXA BYTE cbSize AS DWORD ' UINT ' /* Win 3.x */ style AS DWORD ' UINT lpfnWndProc AS DWORD ' WNDPROC cbClsExtra AS LONG ' int cbWndExtra AS LONG ' int hInstance AS DWORD ' HINSTANCE hIcon AS DWORD ' HICON hCursor AS DWORD ' HCURSOR hbrBackground AS DWORD ' HBRUSH lpszMenuName AS ASCIIZ PTR ' LPCSTR lpszClassName AS ASCIIZ PTR ' LPCSTR ' /* Win 4.0 */ hIconSm AS DWORD ' HICON END TYPE %NULL = 0 %IDI_APPLICATION = 32512& %IDC_ARROW = 32512& %WHITE_BRUSH = 0 %WM_SETTEXT = &HC %WM_ERASEBKGND = &H14 %SRCCOPY = &H00CC0020 ' (DWORD) dest = source %SRCPAINT = &H00EE0086 ' (DWORD) dest = source OR dest %SRCAND = &H008800C6 ' (DWORD) dest = source AND dest %SRCINVERT = &H00660046 ' (DWORD) dest = source XOR dest %SRCERASE = &H00440328 ' (DWORD) dest = source AND (NOT dest ) %NOTSRCCOPY = &H00330008 ' (DWORD) dest = (NOT source) %NOTSRCERASE = &H001100A6 ' (DWORD) dest = (NOT src) AND (NOT dest) %MERGECOPY = &H00C000CA ' (DWORD) dest = (source AND pattern) %MERGEPAINT = &H00BB0226 ' (DWORD) dest = (NOT source) OR dest %PATCOPY = &H00F00021 ' (DWORD) dest = pattern %PATPAINT = &H00FB0A09 ' (DWORD) dest = DPSnoo %PATINVERT = &H005A0049 ' (DWORD) dest = pattern XOR dest %DSTINVERT = &H00550009 ' (DWORD) dest = (NOT dest) %BLACKNESS = &H00000042 ' (DWORD) dest = BLACK %WHITENESS = &H00FF0062 ' (DWORD) dest = WHITE %WM_COPYDATA = &H4A %WM_CANCELJOURNAL = &H4B %WM_INPUTLANGUAGECHANGEREQUEST = &H50 %WM_INPUTLANGCHANGEREQUEST = &H50 %WM_INPUTLANGUAGECHANGE = &H51 %WM_INPUTLANGCHANGE = &H51 %WM_TCARD = &H52 %WM_USERCHANGED = &H54 %WM_NOTIFYFORMAT = &H55 %WM_CONTEXTMENU = &H7B %WM_STYLECHANGING = &H7C %WM_STYLECHANGED = &H7D %WM_DISPLAYCHANGE = &H7E %WM_GETICON = &H7F %WM_SETICON = &H80 %WM_GETDLGCODE = &H87 %WM_SYNCPAINT = &H88 %WM_INPUT_DEVICE_CHANGE = &H00FE %WM_INPUT = &HFF %WM_KEYFIRST = &H100 %WM_DEADCHAR = &H103 %WM_SYSCHAR = &H106 %WM_SYSDEADCHAR = &H107 %WM_IME_STARTCOMPOSITION = &H010D %WM_IME_ENDCOMPOSITION = &H010E %WM_IME_COMPOSITION = &H010F %WM_IME_KEYLAST = &H010F %WM_UNICHAR = &H0109 %WM_KEYLAST = &H0109 %UNICODE_NOCHAR = &H0FFFF %WM_SYSCOMMAND = &H112 %WM_INITMENU = &H116 %WM_INITMENUPOPUP = &H117 %WM_MENUSELECT = &H11F %WM_MENUCHAR = &H120 %WM_ENTERIDLE = &H121 %WM_MENURBUTTONUP = &H0122 %WM_MENUDRAG = &H0123 %WM_MENUGETOBJECT = &H0124 %WM_UNINITMENUPOPUP = &H0125 %WM_MENUCOMMAND = &H0126 %WM_CHANGEUISTATE = &H0127 %WM_UPDATEUISTATE = &H0128 %WM_QUERYUISTATE = &H0129 %WM_CTLCOLORMSGBOX = &H132 %WM_CTLCOLOREDIT = &H133 %WM_CTLCOLORLISTBOX = &H134 %WM_CTLCOLORBTN = &H135 %WM_CTLCOLORDLG = &H136 %WM_CTLCOLORSCROLLBAR = &H137 %WM_CTLCOLORSTATIC = &H138 %WM_XBUTTONDOWN = &H20B %WM_XBUTTONUP = &H20C %WM_XBUTTONDBLCLK = &H20D %WM_PARENTNOTIFY = &H210 %WM_ENTERMENULOOP = &H211 %WM_EXITMENULOOP = &H212 %WM_SIZING = &H214 %WM_MOVING = &H216 %WM_POWERBROADCAST = &H218 %WM_DEVICECHANGE = &H219 %WM_MDICREATE = &H220 %WM_MDIDESTROY = &H221 %WM_MDIACTIVATE = &H222 %WM_MDIRESTORE = &H223 %WM_MDINEXT = &H224 %WM_MDIMAXIMIZE = &H225 %WM_MDITILE = &H226 %WM_MDICASCADE = &H227 %WM_MDIICONARRANGE = &H228 %WM_MDIGETACTIVE = &H229 %WM_MDISETMENU = &H230 %WM_DROPFILES = &H233 %WM_MDIREFRESHMENU = &H234 %WM_WTSSESSION_CHANGE = &H02B1 %WM_TABLET_FIRST = &H02c0 %WM_TABLET_LAST = &H02df %WM_CUT = &H300 %WM_COPY = &H301 %WM_PASTE = &H302 %WM_CLEAR = &H303 %WM_UNDO = &H304 %WM_RENDERFORMAT = &H305 %WM_RENDERALLFORMATS = &H306 %WM_DESTROYCLIPBOARD = &H307 %WM_DRAWCLIPBOARD = &H308 %WM_PAINTCLIPBOARD = &H309 %WM_VSCROLLCLIPBOARD = &H30A %WM_SIZECLIPBOARD = &H30B %WM_ASKCBFORMATNAME = &H30C %WM_CHANGECBCHAIN = &H30D %WM_HSCROLLCLIPBOARD = &H30E %WM_QUERYNEWPALETTE = &H30F %WM_PALETTEISCHANGING = &H310 %WM_PALETTECHANGED = &H311 %WM_HOTKEY = &H312 %WM_PRINT = &H317 %WM_PRINTCLIENT = &H318 %WM_APPCOMMAND = &H319 %WM_THEMECHANGED = &H31A %WM_HANDHELDFIRST = &H0358 %WM_HANDHELDLAST = &H035F %WM_AFXFIRST = &H0360 %WM_AFXLAST = &H037F %WM_PENWINFIRST = &H380 %WM_PENWINLAST = &H38F %WM_APP = &H08000 %PM_NOREMOVE = &H0 %PM_REMOVE = &H1 ' -------------------------------------------------- DECLARE SUB ShowDialog_Form1(BYVAL hParent AS LONG) DECLARE CALLBACK FUNCTION Form1_DLGPROC DECLARE SUB Open_Form1_Thread1() DECLARE SUB Close_Form1_Thread1() DECLARE SUB RegisterControl () DECLARE FUNCTION CreateControl (BYVAL hParent AS LONG, BYVAL nID AS LONG, _ BYVAL AX AS LONG, BYVAL AY AS LONG, _ BYVAL AW AS LONG, BYVAL AH AS LONG) AS LONG ' -------------------------------------------------- ' ------------------------------------------------ DECLARE CALLBACK FUNCTION CBF_FORM1_BUTTON1() ' ************************************************************* ' Application Globals Variables (#2) ' ************************************************************* ' GLOBAL App_Brush() AS LONG GLOBAL App_Color() AS LONG ' GLOBAL hForm1 AS LONG '???? Dialog handle GLOBAL App_X, App_Y, App_W, App_H AS LONG ' GLOBAL hForm1_Thread1 AS LONG GLOBAL End_Form1_Thread1 AS LONG GLOBAL App_hCtrl AS LONG ' GLOBAL giRunningEraseBG AS LONG GLOBAL ghBgBrush AS DWORD ' ************************************************************* ' Application Entrance ' ************************************************************* FUNCTION PBMAIN LOCAL iCount AS LONG LOCAL MVal AS LONG LOCAL Msg AS tagMsg ghBgBrush = CreateSolidBrush(RGB(0,255,0)) End_Form1_Thread1 = 0 ' no thread RegisterControl LIB_InitColors ShowDialog_Form1 0 DO MVal = GetMessageA(Msg, %NULL, 0, 0) IF MVal = -1 THEN EXIT DO ' error was returned must exit IF MVal = 0 THEN EXIT DO TranslateMessage Msg DispatchMessageA Msg LOOP ' can not use DDT message loop since it processes all available messages ' DO ' DIALOG DOEVENTS TO iCount ' LOOP UNTIL iCount=0 DeleteObject ghBgBrush LIB_DeleteBrushes END FUNCTION ' ************************************************************* ' Application Dialogs (#3) ' ************************************************************* SUB ShowDialog_Form1(BYVAL hParent AS LONG) LOCAL dwStyle, ExStyle, hCtrl AS LONG LOCAL N, CT AS LONG ' Variables used for Reading Data in Arrays for Listbox and Combobox ' hParent = 0 if no parent Dialog dwStyle = %WS_POPUP OR %DS_MODALFRAME OR %WS_CAPTION OR %WS_MINIMIZEBOX OR %WS_SYSMENU OR %DS_CENTER ExStyle = 0 DIALOG NEW PIXELS, hParent, "Your Dialog", 0, 0, 267, 177, dwStyle, ExStyle TO hForm1 ' ------------------------------------------------------------ ' define location of custom control in pixels App_X = 88 App_Y = 22 App_W = 155 App_H = 116 ' ------------------------------------------------------------ CONTROL ADD LABEL, hForm1, %FORM1_LABEL2, "", 21, 150, 221, 16, _ %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER OR %WS_BORDER CONTROL ADD "Button", hForm1, %FORM1_BUTTON1, "Start", 21, 22, 53, 20, _ %WS_CHILD OR %WS_VISIBLE OR %BS_PUSHBUTTON OR %WS_TABSTOP CALL CBF_FORM1_BUTTON1 DIALOG SHOW MODELESS hForm1 , CALL Form1_DLGPROC END SUB ' ' ************************************************************* ' Dialog Callback Procedure ' for Form Form1 ' uses Global Handle - hForm1 ' ************************************************************* ' CALLBACK FUNCTION Form1_DLGPROC SELECT CASE CBMSG CASE %WM_CTLCOLORMSGBOX, %WM_CTLCOLORBTN, %WM_CTLCOLOREDIT,_ %WM_CTLCOLORSTATIC, %WM_CTLCOLORSCROLLBAR, %WM_CTLCOLORLISTBOX ' Control colors SELECT CASE GetDlgCtrlID(CBLPARAM) CASE %FORM1_LABEL2 SetTextColor CBWPARAM, App_Color( 0) SetBkColor CBWPARAM, App_Color( 26) FUNCTION = App_Brush( 26) CASE %FORM1_THREADLABEL SetTextColor CBWPARAM, App_Color( 0) SetBkColor CBWPARAM, App_Color( 30) FUNCTION = App_Brush( 30) CASE ELSE FUNCTION = 0 END SELECT CASE %WM_SYSCOMMAND IF (CBWPARAM AND &HFFF0) = %SC_CLOSE THEN IF End_Form1_Thread1 = -1 THEN Close_Form1_Thread1 END IF END IF CASE %WM_DESTROY PostQuitMessage 0 CASE ELSE END SELECT END FUNCTION ' ' ******************************************************************* ' * Library Code * ' ******************************************************************** ' SUB LIB_InitColors() DATA 0, 8388608, 32768, 8421376, 196, 8388736, 16512, 12895428 DATA 8421504, 16711680, 65280, 16776960, 255, 16711935, 65535, 16777215 DATA 10790052, 16752768, 10551200, 16777120, 10526975, 16752895, 10551295, 13948116 DATA 11842740, 16768188, 14483420, 16777180, 14474495, 16768255, 14483455, 15000804 LOCAL T, RGBVal AS LONG REDIM App_Brush(0 TO 31) REDIM App_Color(0 TO 31) FOR T = 0 TO 31 RGBVal = VAL(READ$(T +1)) App_Brush(T) = CreateSolidBrush(RGBVal) App_Color(T) = RGBVal NEXT T END SUB ' ------------------------------------------------------------- SUB LIB_DeleteBrushes() LOCAL T AS LONG FOR T = 0 TO 31 DeleteObject App_Brush(T) NEXT T END SUB ' ------------------------------------------------------------- ' ************************************************************* ' Application Callback Functions (or Subs) for Controls (#4) ' ************************************************************* ' ' ' ------------------------------------------------ CALLBACK FUNCTION CBF_FORM1_BUTTON1 STATIC Flag AS LONG IF CBCTLMSG = %BN_CLICKED THEN IF Flag = 0 THEN Flag = 1 Open_Form1_Thread1 CONTROL SET TEXT hForm1, %FORM1_BUTTON1, "Stop" ELSE Flag = 0 Close_Form1_Thread1 CONTROL SET TEXT hForm1, %FORM1_BUTTON1, "Start" UpdateWindow hForm1 END IF END IF END FUNCTION ' ------------------------------------------------ ' %WM_MYTIMER = %WM_USER + 400 ' THREAD FUNCTION Form1_Thread1(BYVAL hDlg AS LONG) AS LONG LOCAL MVal AS LONG LOCAL Msg AS tagMsg LOCAL hCtrl AS LONG LOCAL TimesThrough AS LONG End_Form1_Thread1 = -1 ' thread active hCtrl = CreateControl(hDlg, %FORM1_THREADLABEL , App_X, App_Y, App_W, App_H) ' Message Loop App_hCtrl = hCtrl DO IF IsWindow(hCtrl) THEN MVal = PeekMessageA(Msg, %NULL, 0, 0, %PM_REMOVE) IF MVal <> 0 THEN TranslateMessage Msg DispatchMessageA Msg END IF 'Control how fast the screen is refreshed INCR TimesThrough IF TimesThrough >= 300000 AND _ 'TimesThrough at 10,000,000 = 2 frames/second giRunningEraseBG = 0 THEN 'TimesThrough at 300,000 = 63 frames/second TimesThrough = 0 PostMessageA hCtrl, %WM_MYTIMER, 0, 0 END IF END IF IF End_Form1_Thread1 = 1 THEN EXIT DO END IF LOOP FUNCTION=1 END FUNCTION ' ' ------------------------------- SUB Open_Form1_Thread1 LOCAL idThreadForm1 AS LONG THREAD CREATE Form1_Thread1(hForm1) TO idThreadForm1 THREAD CLOSE idThreadForm1 TO idThreadForm1 END SUB ' ' SUB Close_Form1_Thread1() LOCAL EFlag, N AS LONG ' ---------------------------------------------- ' DestroyWindow does not work for some reason ' when used from either the primary thread or ' the actual thread that created the control. ' WM_CLOSE is the only thing that works !!! ' ---------------------------------------------- SendMessageA App_hCtrl, %WM_CLOSE, 0, 0 End_Form1_Thread1 = 1 N = 0 DO EFlag = 0 THREAD STATUS hForm1_Thread1 TO EFlag N = N + 1 IF N > 10000000 THEN EXIT DO IF EFlag <> &H103 THEN EXIT DO LOOP THREAD CLOSE hForm1_Thread1 TO N End_Form1_Thread1 = 0 END SUB ' ' -------------------------------------------------------------------------------------- SUB RegisterControl () LOCAL winclass AS wndclassExA LOCAL szClassName AS ASCIIZ * 32 szClassName = "MYCONTROL32" winclass.cbSize = SIZEOF(winclass) winclass.style = %CS_OWNDC OR %CS_HREDRAW OR %CS_VREDRAW winclass.lpfnWndProc = CODEPTR(ControlWindowProc) winclass.cbClsExtra = 0 winclass.cbWndExtra = 0 winclass.hInstance = GetModuleHandleA(BYVAL %NULL) winclass.hIcon = LoadIconA(%NULL, BYVAL %IDI_APPLICATION) winclass.hCursor = LoadCursorA( %NULL, BYVAL %IDC_ARROW ) winclass.hbrBackground = GetStockObject(%WHITE_BRUSH) winclass.lpszMenuName = %NULL winclass.lpszClassName = VARPTR( szClassName ) winclass.hIconSm = LoadIconA(%NULL, BYVAL %IDI_APPLICATION) RegisterClassExA winclass END SUB ' ' -------------------------------------------------------------------------------------- ' FUNCTION CreateControl (BYVAL hParent AS LONG, BYVAL nID AS LONG, _ BYVAL AX AS LONG, BYVAL AY AS LONG, _ BYVAL AW AS LONG, BYVAL AH AS LONG) AS LONG LOCAL szTemp AS ASCIIZ * 80 LOCAL hCtrl, dwStyle, ExStyle AS LONG szTemp = "Move Mouse over me !" dwStyle = %WS_CHILD OR %WS_VISIBLE OR %WS_BORDER ExStyle = 0 szTemp = "Move Mouse over me !!!" hCtrl = CreateWindowEXA(ExStyle, _ ' Extended Window Style "MYCONTROL32", _ ' window class name szTemp, _ ' window caption dwStyle, _ ' window style AX, _ ' initial x position AY, _ ' initial y position AW, _ ' initial width AH, _ ' initial height hParent, _ ' parent window handle nID, _ ' window ID GetModuleHandleA(BYVAL %NULL), _ ' program instance handle BYVAL %NULL) ' creation parameters FUNCTION = hCtrl END FUNCTION ' ' -------------------------------------------------------------------------------------- ' FUNCTION ControlWindowProc(BYVAL hWnd AS LONG, BYVAL Msg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG STATIC X1, Y1, X2, Y2, X3, Y3, Flip AS LONG STATIC StartFrame!, EndFrame!, Frames! STATIC MemDC, hBmp, OldBmp AS LONG SELECT CASE Msg CASE %WM_CREATE DIM R AS RECT X1 = 0 Y1 = 0 GetClientRect hWnd, R X2 = R.nRight - 1 Y2 = R.nBottom - 1 CASE %WM_MYTIMER IF X1 = 0 AND X3 = 0 THEN StartFrame! = TIMER Frames! = 0 END IF InvalidateRect hWnd, BYVAL %NULL, 1 UpdateWindow hWnd INCR Frames! INCR X3 IF X3 > X2 THEN X3 = X2 INCR X1 IF X1 > X2 THEN X1 = 0 X3 = 0 EndFrame! = TIMER - StartFrame! DIM zText2 AS ASCIIZ *80 zText2 = STR$(Frames!/EndFrame!) + " frames/sec." CONTROL SEND hForm1, %FORM1_LABEL2, %WM_SETTEXT, 0, VARPTR(zText2) END IF END IF EXIT FUNCTION CASE %WM_ERASEBKGND DIM hDC AS LONG DIM RR AS RECT LOCAL MyX AS LONG LOCAL MyY AS LONG LOCAL PointColor AS DWORD IF giRunningEraseBG = 0 THEN giRunningEraseBG = 1 hDC = wParam GetClientRect hWnd, RR IF MemDC = 0 THEN MemDC = CreateCompatibleDC(hDC) hBmp = CreateCompatibleBitmap(hDC, RR.nRight, RR.nBottom) OldBmp = SelectObject(MemDC, hBmp) PatBlt MemDC, 0, 0, RR.nRight, RR.nBottom, %WHITENESS END IF 'IF X3 = 0 THEN ' PatBlt MemDC, 0, 0, RR.nRight, RR.nBottom, %WHITENESS 'END IF FillRect MemDC, RR, ghBgBrush ' FOR MyY = 0 TO RR.nBottom ' FOR MyX = 0 TO RR.nRight ' 'PointColor = GetPixel(MemDC, MyX, MyY) ' 'if PointColor <> RGB(0,255,0) then ' ' SetPixel MemDC, MyX, MyY, RGB(0,255,0) ' 'end if ' NEXT MyX ' NEXT MyY MoveToEx MemDC, X1, Y1, BYVAL %NULL LineTo MemDC, X3 , Y2 + 1 BitBlt hDC, 0, 0, RR.nRight, RR.nBottom, MemDC, 0, 0, %SRCCOPY giRunningEraseBG = 0 END IF EXIT FUNCTION CASE %WM_MOUSEMOVE DIM zText AS ASCIIZ *80 zText = STR$(LO(WORD,lParam)) + "," + STR$(HI(WORD, lParam)) CONTROL SEND hForm1, %FORM1_LABEL2, %WM_SETTEXT,0, VARPTR(zText) CASE %WM_DESTROY IF MemDC <> 0 THEN SelectObject MemDC, OldBmp DeleteObject hBmp DeleteDC MemDC MemDC = 0 'Reset the drawing location X3 = 0 X1 = 0 X2 = 0 END IF ' Indicate whether control is successfully destroyed BEEP CASE ELSE END SELECT FUNCTION = DefWindowProcA(hWnd, Msg, wParam, lParam) END FUNCTION '//////////////////////////////////////////// DECLARE FUNCTION GetMessageA IMPORT "USER32.DLL" ALIAS "GetMessageA" ( _ BYREF lpMsg AS tagMSG _ ' __out LPMSG lpMsg , BYVAL hWnd AS DWORD _ ' __in_opt HWND hWnd , BYVAL wMsgFilterMin AS DWORD _ ' __in UINT wMsgFilterMin , BYVAL wMsgFilterMax AS DWORD _ ' __in UINT wMsgFilterMax ) AS LONG ' BOOL DECLARE FUNCTION TranslateMessage IMPORT "USER32.DLL" ALIAS "TranslateMessage" ( _ BYREF lpMsg AS tagMSG _ ' __in CONST MSG *lpMsg ) AS LONG ' BOOL DECLARE FUNCTION DispatchMessageA IMPORT "USER32.DLL" ALIAS "DispatchMessageA" ( _ BYREF lpMsg AS tagMSG _ ' __in CONST MSG *lpMsg ) AS LONG ' LRESULT DECLARE FUNCTION GetDlgCtrlID IMPORT "USER32.DLL" ALIAS "GetDlgCtrlID" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd ) AS LONG ' int DECLARE FUNCTION SetTextColor IMPORT "GDI32.DLL" ALIAS "SetTextColor" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL color AS DWORD _ ' __in COLORREF color ) AS DWORD ' COLORREF DECLARE FUNCTION SetBkColor IMPORT "GDI32.DLL" ALIAS "SetBkColor" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL color AS DWORD _ ' __in COLORREF color ) AS DWORD ' COLORREF DECLARE SUB PostQuitMessage IMPORT "USER32.DLL" ALIAS "PostQuitMessage" ( _ BYVAL nExitCode AS LONG _ ' __in int nExitCode ) ' VOID DECLARE FUNCTION CreateSolidBrush IMPORT "GDI32.DLL" ALIAS "CreateSolidBrush" ( _ BYVAL color AS DWORD _ ' __in COLORREF color ) AS DWORD ' HBRUSH DECLARE FUNCTION DeleteObject IMPORT "GDI32.DLL" ALIAS "DeleteObject" ( _ BYVAL ho AS DWORD _ ' __in HGDIOBJ ho ) AS LONG ' BOOL DECLARE FUNCTION UpdateWindow IMPORT "USER32.DLL" ALIAS "UpdateWindow" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd ) AS LONG ' BOOL DECLARE FUNCTION IsWindow IMPORT "USER32.DLL" ALIAS "IsWindow" ( _ BYVAL hWnd AS DWORD _ ' __in_opt HWND hWnd ) AS LONG ' BOOL DECLARE FUNCTION PeekMessageA IMPORT "USER32.DLL" ALIAS "PeekMessageA" ( _ BYREF lpMsg AS tagMSG _ ' __out LPMSG lpMsg , BYVAL hWnd AS DWORD _ ' __in_opt HWND hWnd , BYVAL wMsgFilterMin AS DWORD _ ' __in UINT wMsgFilterMin , BYVAL wMsgFilterMax AS DWORD _ ' __in UINT wMsgFilterMax , BYVAL wRemoveMsg AS DWORD _ ' __in UINT wRemoveMsg ) AS LONG ' BOOL DECLARE FUNCTION PostMessageA IMPORT "USER32.DLL" ALIAS "PostMessageA" ( _ BYVAL hWnd AS DWORD _ ' __in_opt HWND hWnd , BYVAL Msg AS DWORD _ ' __in UINT Msg , BYVAL wParam AS DWORD _ ' __in WPARAM wParam , BYVAL lParam AS LONG _ ' __in LPARAM lParam ) AS LONG ' BOOL DECLARE FUNCTION SendMessageA IMPORT "USER32.DLL" ALIAS "SendMessageA" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd , BYVAL Msg AS DWORD _ ' __in UINT Msg , BYVAL wParam AS DWORD _ ' __in WPARAM wParam , BYVAL lParam AS LONG _ ' __in LPARAM lParam ) AS LONG ' LRESULT DECLARE FUNCTION GetModuleHandleA IMPORT "KERNEL32.DLL" ALIAS "GetModuleHandleA" ( _ BYREF lpModuleName AS ASCIIZ _ ' __in LPCSTR lpModuleName ) AS DWORD ' HMODULE DECLARE FUNCTION LoadIconA IMPORT "USER32.DLL" ALIAS "LoadIconA" ( _ BYVAL hInstance AS DWORD _ ' __in_opt HINSTANCE hInstance , BYREF lpIconName AS ASCIIZ _ ' __in LPCSTR lpIconName ) AS DWORD ' HICON DECLARE FUNCTION LoadCursorA IMPORT "USER32.DLL" ALIAS "LoadCursorA" ( _ BYVAL hInstance AS DWORD _ ' __in_opt HINSTANCE hInstance , BYREF lpCursorName AS ASCIIZ _ ' __in LPCSTR lpCursorName ) AS DWORD ' HCURSOR DECLARE FUNCTION GetStockObject IMPORT "GDI32.DLL" ALIAS "GetStockObject" ( _ BYVAL i AS LONG _ ' __in int i ) AS DWORD ' HGDIOBJ DECLARE FUNCTION RegisterClassExA IMPORT "USER32.DLL" ALIAS "RegisterClassExA" ( _ BYREF lpwcx AS WNDCLASSEXA _ ' __in CONST WNDCLASSEXA *lpwcx ) AS WORD ' ATOM DECLARE FUNCTION CreateWindowExA IMPORT "USER32.DLL" ALIAS "CreateWindowExA" ( _ BYVAL dwExStyle AS DWORD _ ' __in DWORD dwExStyle , BYREF lpClassName AS ASCIIZ _ ' __in_opt LPCSTR lpClassName , BYREF lpWindowName AS ASCIIZ _ ' __in_opt LPCSTR lpWindowName , BYVAL dwStyle AS DWORD _ ' __in DWORD dwStyle , BYVAL X AS LONG _ ' __in int X , BYVAL Y AS LONG _ ' __in int Y , BYVAL nWidth AS LONG _ ' __in int nWidth , BYVAL nHeight AS LONG _ ' __in int nHeight , OPTIONAL BYVAL hwndParent AS DWORD _ ' __in_opt HWND hwndParent , OPTIONAL BYVAL hMenu AS DWORD _ ' __in_opt HMENU hMenu , OPTIONAL BYVAL hInstance AS DWORD _ ' __in_opt HINSTANCE hInstance , OPTIONAL BYREF lpParam AS ANY _ ' __in_opt LPVOID lpParam ) AS DWORD ' HWND DECLARE FUNCTION ShowWindow IMPORT "USER32.DLL" ALIAS "ShowWindow" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd , BYVAL nCmdShow AS LONG _ ' __in int nCmdShow ) AS LONG ' BOOL DECLARE FUNCTION UpdateWindow IMPORT "USER32.DLL" ALIAS "UpdateWindow" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd ) AS LONG ' BOOL DECLARE FUNCTION GetClientRect IMPORT "USER32.DLL" ALIAS "GetClientRect" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd , BYREF lpRect AS RECT _ ' __out LPRECT lpRect ) AS LONG ' BOOL DECLARE FUNCTION InvalidateRect IMPORT "USER32.DLL" ALIAS "InvalidateRect" ( _ BYVAL hWnd AS DWORD _ ' __in_opt HWND hWnd , BYREF lpRect AS RECT _ ' __in_opt CONST RECT *lpRect , BYVAL bErase AS LONG _ ' __in BOOL bErase ) AS LONG ' BOOL DECLARE FUNCTION CreateCompatibleDC IMPORT "GDI32.DLL" ALIAS "CreateCompatibleDC" ( _ OPTIONAL BYVAL hdc AS DWORD _ ' __in_opt HDC hdc ) AS DWORD ' HDC DECLARE FUNCTION CreateCompatibleBitmap IMPORT "GDI32.DLL" ALIAS "CreateCompatibleBitmap" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL cx AS LONG _ ' __in int cx , BYVAL cy AS LONG _ ' __in int cy ) AS DWORD ' HBITMAP DECLARE FUNCTION SelectObject IMPORT "GDI32.DLL" ALIAS "SelectObject" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL h AS DWORD _ ' __in HGDIOBJ h ) AS DWORD ' HGDIOBJ DECLARE FUNCTION PatBlt IMPORT "GDI32.DLL" ALIAS "PatBlt" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL x AS LONG _ ' __in int x , BYVAL y AS LONG _ ' __in int y , BYVAL w AS LONG _ ' __in int w , BYVAL h AS LONG _ ' __in int h , BYVAL rop AS DWORD _ ' __in DWORD rop ) AS LONG ' BOOL DECLARE FUNCTION MoveToEx IMPORT "GDI32.DLL" ALIAS "MoveToEx" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL x AS LONG _ ' __in int x , BYVAL y AS LONG _ ' __in int y , OPTIONAL BYREF lppt AS POINT _ ' __out_opt LPPOINT lppt ) AS LONG ' BOOL DECLARE FUNCTION LineTo IMPORT "GDI32.DLL" ALIAS "LineTo" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL x AS LONG _ ' __in int x , BYVAL y AS LONG _ ' __in int y ) AS LONG ' BOOL DECLARE FUNCTION BitBlt IMPORT "GDI32.DLL" ALIAS "BitBlt" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc , BYVAL x AS LONG _ ' __in int x , BYVAL y AS LONG _ ' __in int y , BYVAL cx AS LONG _ ' __in int cx , BYVAL cy AS LONG _ ' __in int cy , BYVAL hdcSrc AS DWORD _ ' __in_opt HDC hdcSrc , BYVAL x1 AS LONG _ ' __in int x1 , BYVAL y1 AS LONG _ ' __in int y1 , BYVAL rop AS DWORD _ ' __in DWORD rop ) AS LONG ' BOOL DECLARE FUNCTION CreateSolidBrush IMPORT "GDI32.DLL" ALIAS "CreateSolidBrush" ( _ BYVAL color AS DWORD _ ' __in COLORREF color ) AS DWORD ' HBRUSH DECLARE FUNCTION DeleteDC IMPORT "GDI32.DLL" ALIAS "DeleteDC" ( _ BYVAL hdc AS DWORD _ ' __in HDC hdc ) AS LONG ' BOOL DECLARE FUNCTION DefWindowProcA IMPORT "USER32.DLL" ALIAS "DefWindowProcA" ( _ BYVAL hWnd AS DWORD _ ' __in HWND hWnd , BYVAL Msg AS DWORD _ ' __in UINT Msg , BYVAL wParam AS DWORD _ ' __in WPARAM wParam , BYVAL lParam AS LONG _ ' __in LPARAM lParam ) AS LONG ' LRESULT DECLARE FUNCTION FillRect IMPORT "USER32.DLL" ALIAS "FillRect" ( _ BYVAL hDC AS DWORD _ ' __in HDC hDC , BYREF lprc AS RECT _ ' __in CONST RECT *lprc , BYVAL hbr AS DWORD _ ' __in HBRUSH hbr ) AS LONG ' int
Leave a comment: