It never occurred to me that an Xbase++ program would eventually rule the world, until now.

Do you have enough information now to continue with this or do you need a special function?
What do you want the function to return?
Xbase++ is not a graphics programming language. It is a business language.These functions should be included in the basic features of graphics programming language.
Code: Select all
#INCLUDE "dll.CH"
#INCLUDE "dcdialog.CH"
STATIC snHdll
FUNCTION Main()
LOCAL GetList[0], GetOptions, oSay, hDC1, hDC2, oStatic1, oStatic2, ;
aPixel[224,224]
@ 0,0 DCSTATIC TYPE XBPSTATIC_TYPE_BITMAP ;
CAPTION "colors.jpg" ;
OBJECT oStatic1 ;
PREEVAL {|o|o:autoSize := .t.} ;
EVAL {|o|hDC1 := GetWindowDC(o:getHWnd()), ;
o:motion := {|a,b,o|ShowColor( hDC1, a, oSay, o )}}
@ 0,250 DCSTATIC TYPE XBPSTATIC_TYPE_BITMAP;
CAPTION "colors.jpg" ;
PREEVAL {|o|o:autoSize := .t.} ;
OBJECT oStatic2 ;
EVAL {|o|hDC2 := GetWindowDC(o:getHWnd())}
@ 50,0 DCSAY '' SAYSIZE 350,20 FONT '10.Lucida Console' OBJECT oSay
@ 100,0 DCPUSHBUTTON CAPTION 'Clear Image' SIZE 100,20 ACTION {||ClearImage(hDC2)}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'Transfer Image' ;
SIZE 80,20 ACTION {||TransferImage(hDC1,hDC2,aPixel)}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'Flip Image' ;
SIZE 80,20 ACTION {||FlipImage(hDC1,hDC2,aPixel)}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'Rotate Image' ;
SIZE 80,20 ACTION {||RotateImage(hDC1,hDC2,aPixel)}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'Load Array' ;
SIZE 80,20 ACTION {||LoadArray(hDC1,aPixel)}
DCGETOPTIONS PIXEL
DCREAD GUI FIT TITLE 'Pixel Test' OPTIONS GetOptions ;
EVAL {||ClearImage(hDC2)}
RETURN nil
* ---------
FUNCTION LoadArray( hDC1, aPixel )
LOCAL i,j,oScrn
IF !aPixel[1,1] == nil
DCMSGBOX 'Array is already loaded!'
RETURN nil
ENDIF
oScrn := DC_WaitOn()
FOR i := 1 TO 224
FOR j := 1 TO 224
aPixel[i,j] := GetPixel(hDC1,i-1,j-1)
NEXT
NEXT
DC_Impl(oScrn)
RETURN nil
* ---------
FUNCTION ClearImage( hDC2 )
LOCAL i,j
LOCAL nColor := AutomationTranslateColor(GraMakeRGBColor({255,255,255}),.f.)
FOR i := 0 TO 224
FOR j := 0 TO 224
SetPixel(hDC2,i,j,nColor)
NEXT
NEXT
RETURN nil
* ----------
FUNCTION TransferImage( hDC1, hDC2, aPixel )
LOCAL i,j, nColor, lEmptyArray := aPixel[1,1] == nil
FOR i := 0 TO 223
FOR j := 0 TO 223
IF lEmptyArray
SetPixel(hDC2,i,j,GetPixel(hDC1,i,j))
ELSE
SetPixel(hDC2,i,j,aPixel[i+1,j+1])
ENDIF
NEXT
NEXT
RETURN nil
* ----------
FUNCTION FlipImage( hDC1, hDC2, aPixel )
LOCAL i,j, lEmptyArray := aPixel[1,1] == nil
FOR i := 0 TO 223
FOR j := 0 TO 223
IF lEmptyArray
SetPixel(hDC2,j,i,GetPixel(hDC1,j,224-i))
ELSE
SetPixel(hDC2,j,i,aPixel[i+1,j+1])
ENDIF
NEXT
NEXT
RETURN nil
* ----------
FUNCTION RotateImage( hDC1, hDC2, aPixel )
LOCAL i,j, lEmptyArray := aPixel[1,1] == nil
FOR i := 0 TO 223
FOR j := 0 TO 223
IF lEmptyArray
SetPixel(hDC2,i,j,GetPixel(hDC1,j,224-i))
ELSE
SetPixel(hDC2,i,j,aPixel[j+1,224-i])
ENDIF
NEXT
NEXT
RETURN nil
* ---------
PROC appsys ; RETURN
* ---------
STATIC FUNCTION ShowColor( hDC, aCoords, oSay, oStatic )
LOCAL nColor
aCoords[2] := oStatic:currentSize()[2] - aCoords[2]
nColor := GetPixel(hDC,aCoords[1],aCoords[2])
oSay:setCaption('Color: ' + DC_Array2String(GraGetRGBIntensity(AutomationTranslateColor(nColor,.T.))) + ;
' Coords: ' + DC_Array2String(aCoords))
RETURN nil
#command GDIFUNCTION <Func>([<x,...>]) ;
=> ;
FUNCTION <Func>([<x>]);;
STATIC scHCall := nil ;;
IF scHCall == nil ;;
IF snHdll == nil ;;
snHDll := DllLoad('GDI32.DLL') ;;
ENDIF ;;
scHCall := DllPrepareCall(snHDll,DLL_STDCALL,<(Func)>) ;;
ENDIF ;;
RETURN DllExecuteCall(scHCall,<x>)
GDIFUNCTION GetPixel( nHDC, x, y)
GDIFUNCTION SetPixel( nHDC, x, y, n )
DLLFUNCTION GetWindowDC( hwnd ) USING STDCALL FROM USER32.DLL
I started my programming career in about 1979. I wrote assembly language code for computer terminals in 8080 and Z80. From there I went to dBase 2, dBase 3, Clipper and Xbase++. eXpress++ is now 15 years old.From 1981 to 1983 I worked on PDP-11 assembly language (under UNIX), 1983 to 1988 on Wang-2200C, and then everything relocate to CLIPPER. And in 2012 began to use Alaska and eXpress++.
Yes, there is something to remember and something to say, there were many achievements of its time ... I have a master's thesis was to calculations on computers (1977), and then I worked all my life to computers and programmed. And now I continue programming. By the way, I have the technical sciences doctoral degree in management information systems, and in economic - mathematical modeling and software for the economy (business) and I federal professor in computer technologies. I have a bunch of acts introducing my development with economic effect of about 5 million dollars. For his work, which I spent, chiefs gave the order.rdonnay wrote:I started my programming career in about 1979. I wrote assembly language code for computer terminals in 8080 and Z80. From there I went to dBase 2, dBase 3, Clipper and Xbase++. eXpress++ is now 15 years old.From 1981 to 1983 I worked on PDP-11 assembly language (under UNIX), 1983 to 1988 on Wang-2200C, and then everything relocate to CLIPPER. And in 2012 began to use Alaska and eXpress++.
Code: Select all
FUNCTION RotateImage( hDC1, hDC2, aPixel )
LOCAL i,j, lEmptyArray := aPixel[1,1] == nil
FOR i := 0 TO 223
FOR j := 0 TO 223
IF lEmptyArray
SetPixel(hDC2,i,j,GetPixel(hDC1,j,224-i))
ELSE
SetPixel(hDC2,i,j,aPixel[j+1,224-i])
ENDIF
NEXT
NEXT
RETURN nil