'=========================================================================== ' Subject: GDI TEST CODE Date: 06-27-98 (00:00) ' Author: Dave Navarro, Jr. Code: PBCC ' Origin: dave@powerbasic.com Packet: PBCC.ABC '=========================================================================== ' ' GDI.BAS test code for PB/CC 1.0 ' by Dave Navarro, Jr. (dave@powerbasic.com) ' %CCWIN = 1 $INCLUDE "WIN32API.INC" 'you must remove the $IF %DEF() lines from WIN32API.INC DEFSNG A-Z FUNCTION FF(x AS SINGLE, y AS SINGLE) GLOBAL W AS SINGLE FUNCTION = 14 * EXP(-.04*W)*COS(.15*W) END FUNCTION SUB PLOT(BYVAL hWnd AS LONG) LOCAL LpPaint AS PaintStruct LOCAL hDC AS LONG LOCAL hMemDC AS LONG LOCAL hBmp AS LONG LOCAL hBrush AS LONG LOCAL hPen AS LONG LOCAL WinX AS LONG LOCAL WinY AS LONG LOCAL r AS RECT LOCAL i AS LONG LOCAL FL AS LONG LOCAL yOfs AS LONG STATIC PHI AS SINGLE GetClientRect hWnd, r WinX = r.nRight - r.nLeft WinY = r.nBottom - r.nTop hDC = BeginPaint(hWnd, LpPaint) hMemDC = CreateCompatibleDC(hDC) hBmp = CreateCompatibleBitmap(hDC, WinX, WinY) SelectObject hMemDC, hBmp hBrush = CreateSolidBrush(%BLACK) FillRect hMemDC, r, hBrush DeleteObject hBrush yOfs = WinY * .3 hPen = CreatePen(%PS_SOLID, 2, %GREEN) SelectObject hMemDC, hPen RHO = 300 - ((WinX / 800) * 300) D = 2000 THETA = .1 S1 = SIN(THETA) C1 = COS(THETA) IF PHI THEN PHI = PHI+0.1 ELSE PHI = 1.3 END IF S2 = SIN(PHI) C2 = COS(PHI) DIM YMIN(0 to WinX), YMAX(0 to WinX) FOR I = 0 TO WinX : YMIN(I) = WinY \ 2 : NEXT I FOR X = 12 TO -12 STEP -.5 FL = 0 FOR Y = -12 TO 12 STEP .2 W = X*X + Y*Y Z = FF(X, Y) XE = -X*S1 + Y*C1 YE = -X*C1*C2 - Y*S1*C2 + Z*S2 ZE = -X*S2*C1 - Y*S1*S2 - Z*S2 + RHO SX = D*XE/ZE + (WinX \ 2) SY = (-5*D*YE/ZE/12) + 120 IF SX < 0 OR SX > WinX THEN OutOfRange IF FL = 0 THEN FL = 1 : F = 0 : GOTO OutOfRange DX = OLDX - SX : IF DX = 0 THEN DX = 1 SL = (OLDY - SY) / DX YP = OLDY FOR XP = INT(OLDX) + 1 TO SX YP = YP + SL IF YP <= YMIN(XP) THEN YMIN(XP) = YP IF F = 0 THEN XX = XP: YY = YP : F = 1 MoveToEx hMemDC, XX, YY+yOfs, BYVAL %NULL LineTo hMemDC, XP, YP+yOfs XX = XP YY = YP END IF IF YP >= YMAX(XP) THEN YMAX(XP) = YP IF F = 0 THEN XX = XP: YY = YP : F = 1 MoveToEx hMemDC, XX, YY+yOfs, BYVAL %NULL LineTo hMemDC, XP, YP+yOfs XX = XP YY = YP END IF F = 0 NEXT XP OutOfRange: OLDX = SX : OLDY = SY NEXT Y NEXT X BitBlt hDC, r.nLeft, r.nTop, Winx, WinY, hMemDC, 0, 0, %SRCCOPY EndPaint hWndShow, LpPaint DeleteObject hPen END SUB FUNCTION WinMain (BYVAL hInstance AS LONG, _ BYVAL hPrevInstance AS LONG, _ lpCmdLine AS ASCIIZ PTR, _ BYVAL iCmdShow AS LONG) AS LONG LOCAL Msg AS tagMsg LOCAL wndclass AS WndClassEx LOCAL szAppName AS ASCIIZ * 80 LOCAL hWnd AS LONG szAppName = "GDIWINDOW" wndclass.cbSize = SIZEOF(WndClass) wndclass.style = %CS_HREDRAW OR %CS_VREDRAW wndclass.lpfnWndProc = CODEPTR( WndProc ) wndclass.cbClsExtra = 0 wndclass.cbWndExtra = 0 wndclass.hInstance = hInstance wndclass.hIcon = %NULL wndclass.hCursor = LoadCursor( %NULL, BYVAL %IDC_ARROW ) wndclass.hbrBackground = GetStockObject( %BLACK_BRUSH ) wndclass.lpszMenuName = %NULL wndclass.lpszClassName = VARPTR( szAppName ) wndclass.hIconSm = LoadIcon( hInstance, BYVAL %IDI_APPLICATION ) RegisterClassEx wndclass ' Create a window using the registered class hWnd = CreateWindow("GDIWINDOW", _ ' window class name "PowerBASIC GDI Test", _ ' window caption %WS_OVERLAPPEDWINDOW, _ ' window style %CW_USEDEFAULT, _ ' initial x position %CW_USEDEFAULT, _ ' initial y position %CW_USEDEFAULT, _ ' initial x size %CW_USEDEFAULT, _ ' initial y size %NULL, _ ' parent window handle %NULL, _ ' window menu handle hInstance, _ ' program instance handle BYVAL %NULL) ' creation parameters ShowWindow hWnd, iCmdShow UpdateWindow hWnd WHILE GetMessage(Msg, %NULL, 0, 0) TranslateMessage Msg DispatchMessage Msg WEND FUNCTION = msg.wParam END FUNCTION ' WinMain '------------------------------------------------------------------------------ FUNCTION WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG LOCAL hDC AS LONG LOCAL LpPaint AS PaintStruct LOCAL tRect AS Rect STATIC First AS LONG SELECT CASE wMsg CASE %WM_CREATE CASE %WM_LBUTTONDOWN InvalidateRect hWnd, BYVAL %NULL, %TRUE CASE %WM_ERASEBKGND IF First = 0 THEN First = 1 ELSE FUNCTION = 1 EXIT FUNCTION END IF CASE %WM_KEYDOWN InvalidateRect hWnd, BYVAL %NULL, %TRUE CASE %WM_PAINT PRINT "Plotting....."; Plot hWnd PRINT "Press a key" FUNCTION = 0 EXIT FUNCTION CASE %WM_DESTROY PostQuitMessage 0 FUNCTION = 0 EXIT FUNCTION END SELECT FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam) END FUNCTION