CLEAR ALL LOCAL oForm DO DeclareApiFunction PRIVATE hWindow, cPrinter, cDriver, cPort, hPrinter, nBufsize, cDevmode hWindow = GetActiveWindow() STORE "" TO cPrinter, cDriver, cPort , cDevmode STORE 0 TO hPrinter, nBufsize oForm = CREATEOBJECT("form1") oForm.SHOW() ************************************************** *-- Class: form1 (c:\cdbk70\amline\libs\atest.vcx) *-- ParentClass: form *-- BaseClass: form *-- Time Stamp: 03/16/04 12:48:13 PM * DEFINE CLASS form1 AS FORM DOCREATE = .T. CAPTION = "Form1" WINDOWTYPE = 1 NAME = "Form1" ADD OBJECT command1 AS COMMANDBUTTON WITH ; TOP = 12, ; LEFT = 264, ; HEIGHT = 27, ; WIDTH = 84, ; CAPTION = "PROPERTY", ; NAME = "CMDSETUP" ADD OBJECT listprinter AS LISTBOX WITH ; HEIGHT = 170, ; LEFT = 24, ; TOP = 12, ; WIDTH = 216, ; NAME = "ListPrinter" ADD OBJECT cmdok AS COMMANDBUTTON WITH ; TOP = 204, ; LEFT = 276, ; HEIGHT = 27, ; WIDTH = 84, ; CAPTION = "OK", ; NAME = "CMDOK" PROCEDURE INIT *--Create an array with all windows printers LOCAL m.numOfPrinters,; printerName,; m.i,; cNameDefaultPrinter,; nPrintDefault m.numOfPrinters = APRINTERS(printerList) cNameDefaultPrinter = LOWER( SET("Printer" , 2 ) ) IF m.numOfPrinters > 0 THISFORM.ADDPROPERTY('alist(1)') DIMENSION THISFORM.alist[ m.numOfPrinters ] THIS.listprinter.ROWSOURCETYPE = 5 THIS.listprinter.ROWSOURCE ='Thisform.alist' nPrintDefault = 0 FOR m.i = 1 TO m.numOfPrinters && ALEN( printerList , 1 )* m.printerName = " " + printerList[m.i, 1] IF cNameDefaultPrinter $ LOWER( m.printerName ) nPrintDefault = m.i ENDIF THIS.alist[m.i] = m.printerName NEXT ENDIF *-- Printer defaut IF nPrintDefault > 0 THIS.listprinter.LISTINDEX = nPrintDefault ENDIF ENDPROC PROCEDURE CMDSETUP.CLICK LOCAL lnretval cPrinter = THISFORM.cprintername() IF THISFORM.oPenPrinter() lnretval =DocumentProperties(hWindow, hPrinter, cPrinter,; @cDevmode, 0, DM_IN_BUFFER+DM_OUT_BUFFER+DM_IN_PROMPT ) ENDIF ENDPROC PROCEDURE cmdok.CLICK *-- All settings are lost ! *-- WHY ? DO OpenDialog ENDPROC *-- Return the name of the printer. PROCEDURE cprintername RETURN ALLTRIM( Thisform.alist[ Thisform.listprinter.ListIndex ] ) ENDPROC PROCEDURE oPenPrinter hPrinter = 0 = oPenPrinter( cPrinter , @hPrinter , 0 ) IF hPrinter = 0 = MESSAGEB("Impossible d''initier l'imprimante . ", 48, "Error" ) RETURN .F. ENDIF nBufsize = DocumentProperties(hWindow, hPrinter, cPrinter,0,0,0) cDevmode = REPLI(CHR(0), nBufsize) ENDPROC ENDDEFINE * *-- EndDefine: form1 ************************************************** *-- API FUNCTION PROCEDURE OpenDialog * showing printer settings dialog LOCAL lnretval lnretval = DocumentProperties(hWindow, hPrinter, cPrinter,; @cDevmode, @cDevmode, DM_IN_PROMPT+DM_IN_BUFFER+DM_OUT_BUFFER) RETURN lnretval ENDPROC PROCEDURE GetPrnName * retrieves default printer name from the Registry LOCAL lcBuffer, lcPrinter, lcDriver, lcPort lcBuffer = REPLI(CHR(0), 120) = GetProfileString("Windows", "Device", ",,,",; @lcBuffer, LEN(lcBuffer)) lcBuffer = STRTRAN(lcBuffer, CHR(0), "") DIMEN arrPos[3] arrPos[1] = AT(",", lcBuffer, 1) arrPos[2] = AT(",", lcBuffer, 2) arrPos[3] = LEN(lcBuffer) cPrinter = SUBSTR(lcBuffer, 1, arrPos[1]-1) cDriver = SUBSTR(lcBuffer, arrPos[1]+1, arrPos[2]-arrPos[1]-1) cPort = SUBSTR(lcBuffer, arrPos[2]+1, arrPos[3]-arrPos[2]) RELEASE arrPos ENDPROC FUNCTION buf2dword (lcBuffer) RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ; BITLSHIFT(ASC(SUBSTR(lcBuffer, 2,1)), 8) +; BITLSHIFT(ASC(SUBSTR(lcBuffer, 3,1)), 16) +; BITLSHIFT(ASC(SUBSTR(lcBuffer, 4,1)), 24) ENDFUNC FUNCTION buf2word (lcBuffer) RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ; ASC(SUBSTR(lcBuffer, 2,1)) * 256 ENDFUNC FUNCTION num2dword (lnValue) #DEFINE m0 256 #DEFINE m1 65536 #DEFINE m2 16777216 LOCAL b0, b1, b2, b3 b3 = INT(lnValue/m2) b2 = INT((lnValue - b3*m2)/m1) b1 = INT((lnValue - b3*m2 - b2*m1)/m0) b0 = MOD(lnValue, m0) RETURN CHR(b0)+CHR(b1)+CHR(b2)+CHR(b3) ENDFUNC FUNCTION num2word(lnValue) RETURN CHR(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256)) ENDFUN PROCEDURE DeclareApiFunction *-- UT : The SetDefaultPrinter Win API function is only available in WIn2K and later. *-- The SetDefaultPrinter WSH method is supported under Win98 and later. *-- Besides that there shouldn't be any difference between them. DECLARE INTEGER OpenPrinter IN winspool.drv; STRING pPrinterName, INTEGER @phPrinter, INTEGER pDefault DECLARE INTEGER GetProfileString IN kernel32; STRING lpApp, STRING lpKey, STRING lpDefault,; STRING @lpReturnedString, INTEGER nSize DECLARE INTEGER ClosePrinter IN winspool.drv INTEGER hPrinter DECLARE INTEGER GetActiveWindow IN user32 DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc DECLARE INTEGER DocumentProperties IN winspool.drv; INTEGER HWND, INTEGER hPrinter, STRING pDeviceName,; STRING @pDevModeOutput, STRING @pDevModeInput, INTEGER fMode ENDPROC