******************************************************************** FUNCTION PR_IsDuplex LPARAMETERS m.tcPrinter ******************************************************************** #DEFINE DC_DUPLEX 7 *!* * https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-devicecapabilitiesa *!* int DeviceCapabilitiesA( *!* [in] LPCSTR pDevice, *!* [in] LPCSTR pPort, *!* [in] WORD fwCapability, *!* [out] LPSTR pOutput, *!* [in] const DEVMODEA *pDevMode *!* ) * DC_DUPLEX * If the printer supports duplex printing, the return value is 1; otherwise, the return value is zero. * The pOutput parameter is not used. LOCAL lnDuplex, llIsDuplex DECLARE Long DeviceCapabilities IN winspool.drv as xfcDeviceCapabilities ; String pDevice, String pPort, Long fwCapability, ; String @pOutput, Long pDevMode TRY m.lnDuplex = xfcDeviceCapabilities(m.tcPrinter, "", DC_DUPLEX, "", 0) m.llIsDuplex = IIF(lnDuplex = 1, .T., .F.) CATCH TO m.loExc m.llIsDuplex = .F. ENDTRY RETURN m.llIsDuplex ENDFUNC
VfpImaging VFP tips and tricks blog
VFP Visual FoxPro and Images, graphics, GdiPlus, GdiPlusX, FoxCharts, FoxPaint, charting, tips and tricks, code samples, VFPX, FoxyPreviewer etc...
2024-02-06
2023-04-16
Capture Form portions - FoxyCapture
Recently Tom Knauf from Germany asked for a feature in FoxyPreviewer3 to allow users to pick specific parts of their reports and export them to the clipboard or save as image in an easy way.
Nothing new on this, I even published about 10 years ago a solution for that, but it was not working anymore.
So, I took the opportunity to create it from scratch, but this time thinking of a good way to make it work safely with FoxyPreviewer3.
FOXYCAPTURE is a custom VFP class that you can toss in any VFP form.
To activate it, just call the method "StartCapture", and select the rectangle portion of your form you's like to capture. After dragging, a shortcut menu will allow you to either save as PNG or send the image to the clipboard.
Source code and a sample form included, please let me know if you find any issues or make any improvements.
Below some animated images showing how it works.
Picture1 - Capture to image file
Picture2 - Capture image to the clipboard, and paste it to WhatsApp web:
Files to include in your project:
- FoxyCapture.vcx
- FoxyCapture.vct
- fc_Save.Bmp
- fc_Clipboard.bmp
Related Methods / Properties
Method:
StartCapture - Starts capturing the mouse events to capture the form surface
Properties:
BorderColor - Numeric, the RGB value of the border color to drawn to determine the rectangle to be captured
ShowBorder - Logical, determines if the dotted shape borders will appear in the captured image or not
Download link:
This brought the advantage of allowing to select any part of the form, Grids, PageFrames, Textboxes, etc, without the need of Disabling objects. Forms with grids are working fine as well.
2022-10-13
FoxyPreviewer3 and its files
FoxyPreviewer3 - Getting support
_Screen.oFoxyPreviewer.GetFoxyScript()
2022-10-06
FoxyPreviewer3 and localization strings
FoxyPreviewer's default language is English.
Right now there is suport to 22 languages: English, Portuguese, Spanish, French, German, Greek, Turkish, Czech, Persian, Arabic, Italian, Indonesian, Polish, Swahili, Russian , Simplified Chinese , Traditional Chinese , Dutch, Bulgarian, Hungarian, Kazakh and Serbian.
Special tweaks were applied to allow double-byte languages, such as Chinese and Japanese.
To change the default language there are 2 options:
1 - Setting the _Screen.oFoxyPreviewer object, by passing pass the English language name or the local language name - for instance, to change the language to French or spanish:
_Screen.oFoxyPreviewer.cLanguage = "SPANISH" && or _Screen.oFoxyPreviewer.cLanguage = "ESPANIOL" _Screen.oFoxyPreviewer.cLanguage = "FRENCH" && or _Screen.oFoxyPreviewer.cLanguage = "FRANÇAIS"
2 - Users can change by themselves to their desired language in the Settings form:
Some of the languages are not updated. FP3 brings new facilities and dialogs that still need to be updated..
I'll be happy to update the localizations table in the future updates.
2022-09-25
FoxyPreviewer3 and embedded images in your EXE
For security reasons a file embedded in your EXE can't be accessed by an external library, such as FoxyPreviewer3. That means that FP3 can't deal with the images in your reports when you run the reports from your EXE. We still save some options to deal with that:
OPTION #1 - Store the image files outside your EXE, in a drive location, that can be passed with the full address, so that FoxyPreviewer.App can "see" these files and include them in your desired output.
OPTION #2 - To make these images appear automatically, without the need of removing the image files from your project.
- Include the program "FOXYGETIMAGE.PRG" in your EXE project. This file is found at the main folder of FoxyPreviewer. This file will provide access to FoxyPreviewer (and any other VFP program) to get the needed images from the executable. Please note that this may bring some security issues to your EXE, because this program will allow FoxyPreviewer and other programs to access the embedded images of your EXE. I recommend you to open this file, and analyze it. You can make any changes you find necessary to it, for example to make it allow only some specific files to be accessed. Right now, FOXYGETIMAGE.PRG allows accessing only image files, with the extensions: "BMP", "GIF", "PNG", "JPG", "JPEG", "TIFF", "TIF", "EMF".
- Set the new property: _Screen.oFoxyPreviewer.nSearchImgMode = 2 or 3 - That's an additional setting to tell FP3 to turn on or off this setting. That is to avoid an unnecessary process, forcing VFP to search in the disk for a file that is already available. This can slow down a little the report run. Behind the scenes, FP3 will store the image files at the FP_IMAGES\TEMP folder during the report run. These files will be deleted immediately after the report is rendered.
Below is the file FOXYGETIMAGE.PRG contents:
* PROCEDURE FoxyGetImage.prg * To be used with FP3 if you use embedded images in your EXE * Retrieves image files embedded in the main EXE * To be included in the main VFP EXE project. This may bring security issues - use at our own risk LPARAMETERS tcImageFile, tlTempFile LOCAL lcPictVal, lcReturn m.lcPictVal = "" IF INLIST(UPPER(JUSTEXT(m.tcImageFile)), "BMP", "GIF", "PNG", "JPG", "JPEG", "TIFF", "TIF", "EMF") TRY m.lcPictVal = FILETOSTR(m.tcImageFile) CATCH ENDTRY ENDIF IF m.tlTempFile AND NOT EMPTY(m.lcPictVal) && Store in a TempFile in disk LOCAL lcTempFile, lcTempPath IF PEMSTATUS(_Screen, "_FoxyTempImagesPath", 5) lcFolder = _Screen._FoxyTempImagesPath ELSE lcFolder = SYS(2023) ENDIF m.lcTempFile = ADDBS(lcFolder) + JUSTFNAME(m.tcImageFile) STRTOFILE(m.lcPictVal, m.lcTempFile) m.lcReturn = m.lcTempFile ELSE m.lcReturn = m.lcPictVal ENDIF RETURN m.lcReturn