Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 12/02/2022 in all areas

  1. Here a first draft for creating barcodes using the Zint.dll (v2.15.09). Mor information about Zint can be found here: https://zint.org.uk Zint, libzint and Zint Barcode Studio are Copyright © 2022 Robin Stuart. All historical versions are distributed under the GNU General Public License version 3 or later. Version 2.5 (and later) is released under a dual license: the encoding library is released under the BSD license whereas the GUI, Zint Barcode Studio, is released under the GNU General Public License version 3 or later. The code became too long to post here! -> Download from my OneDrive: Zint Zint.au3 ;Coded by UEZ ;v0.60 build 2025-09-14 beta ;IMPORTANT: You are not allowed to sell this code or just parts of it in a commercial project or modify it and distribute it with a different name! ; Distributing copies of the program in compiled format (exe) must be free of any fee! #include-once #include "ZintDll.au3" Global $g__ZintDLL = @AutoItX64 ? (@ScriptDir & "\Zint64.dll") : (@ScriptDir & "\Zint.dll") #Region Constances ; === Barcode Symbologies === Global Const $BARCODE_CODE11 = 1 ; Code 11 Global Const $BARCODE_C25STANDARD = 2 ; 2 of 5 Standard (Matrix) Global Const $BARCODE_C25MATRIX = 2 ; Legacy Global Const $BARCODE_C25INTER = 3 ; 2 of 5 Interleaved Global Const $BARCODE_C25IATA = 4 ; 2 of 5 IATA Global Const $BARCODE_C25LOGIC = 6 ; 2 of 5 Data Logic Global Const $BARCODE_C25IND = 7 ; 2 of 5 Industrial Global Const $BARCODE_CODE39 = 8 ; Code 39 Global Const $BARCODE_EXCODE39 = 9 ; Extended Code 39 Global Const $BARCODE_EAN8 = 10 ; EAN-8 (GTIN-8) Global Const $BARCODE_EAN_2ADDON = 11 ; EAN/UPC 2-digit add-on Global Const $BARCODE_EAN_5ADDON = 12 ; EAN/UPC 5-digit add-on Global Const $BARCODE_EANX = 13 ; Legacy Global Const $BARCODE_EANX_CHK = 14 ; Legacy Global Const $BARCODE_EAN13 = 15 ; EAN-13 (GTIN-13) Global Const $BARCODE_GS1_128 = 16 ; GS1-128 Global Const $BARCODE_EAN128 = 16 ; Legacy Global Const $BARCODE_CODABAR = 18 ; Codabar Global Const $BARCODE_CODE128 = 20 ; Code 128 Global Const $BARCODE_DPLEIT = 21 ; Deutsche Post Leitcode Global Const $BARCODE_DPIDENT = 22 ; Deutsche Post Identcode Global Const $BARCODE_CODE16K = 23 ; Code 16k Global Const $BARCODE_CODE49 = 24 ; Code 49 Global Const $BARCODE_CODE93 = 25 ; Code 93 Global Const $BARCODE_FLAT = 28 ; Flattermarken Global Const $BARCODE_DBAR_OMN = 29 ; GS1 DataBar Omnidirectional Global Const $BARCODE_RSS14 = 29 ; Legacy Global Const $BARCODE_DBAR_LTD = 30 ; GS1 DataBar Limited Global Const $BARCODE_RSS_LTD = 30 ; Legacy Global Const $BARCODE_DBAR_EXP = 31 ; GS1 DataBar Expanded Global Const $BARCODE_RSS_EXP = 31 ; Legacy Global Const $BARCODE_TELEPEN = 32 ; Telepen Alpha Global Const $BARCODE_UPCA = 34 ; UPC-A Global Const $BARCODE_UPCA_CHK = 35 ; UPC-A including check digit Global Const $BARCODE_UPCE = 37 ; UPC-E Global Const $BARCODE_UPCE_CHK = 38 ; UPC-E including check digit Global Const $BARCODE_POSTNET = 40 ; USPS POSTNET Global Const $BARCODE_MSI_PLESSEY = 47 ; MSI Plessey Global Const $BARCODE_FIM = 49 ; Facing Identification Mark Global Const $BARCODE_LOGMARS = 50 ; LOGMARS Global Const $BARCODE_PHARMA = 51 ; Pharmacode One-Track Global Const $BARCODE_PZN = 52 ; Pharmazentralnummer Global Const $BARCODE_PHARMA_TWO = 53 ; Pharmacode Two-Track Global Const $BARCODE_CEPNET = 54 ; Brazilian CEPNet Postal Code Global Const $BARCODE_PDF417 = 55 ; PDF417 Global Const $BARCODE_PDF417COMP = 56 ; Compact PDF417 Global Const $BARCODE_PDF417TRUNC = 56 ; Legacy Global Const $BARCODE_MAXICODE = 57 ; MaxiCode Global Const $BARCODE_QRCODE = 58 ; QR Code Global Const $BARCODE_CODE128AB = 60 ; Code 128 (Suppress Code Set C) Global Const $BARCODE_CODE128B = 60 ; Legacy Global Const $BARCODE_AUSPOST = 63 ; Australia Post Standard Customer Global Const $BARCODE_AUSREPLY = 66 ; Australia Post Reply Paid Global Const $BARCODE_AUSROUTE = 67 ; Australia Post Routing Global Const $BARCODE_AUSREDIRECT = 68 ; Australia Post Redirection Global Const $BARCODE_ISBNX = 69 ; ISBN Global Const $BARCODE_RM4SCC = 70 ; Royal Mail 4-State Global Const $BARCODE_DATAMATRIX = 71 ; Data Matrix (ECC200) Global Const $BARCODE_EAN14 = 72 ; EAN-14 Global Const $BARCODE_VIN = 73 ; Vehicle Identification Number Global Const $BARCODE_CODABLOCKF = 74 ; Codablock-F Global Const $BARCODE_NVE18 = 75 ; NVE-18 (SSCC-18) Global Const $BARCODE_JAPANPOST = 76 ; Japanese Postal Code Global Const $BARCODE_KOREAPOST = 77 ; Korea Post Global Const $BARCODE_DBAR_STK = 79 ; GS1 DataBar Stacked Global Const $BARCODE_RSS14STACK = 79 ; Legacy Global Const $BARCODE_DBAR_OMNSTK = 80 ; GS1 DataBar Stacked Omnidirectional Global Const $BARCODE_RSS14STACK_OMNI = 80 ; Legacy Global Const $BARCODE_DBAR_EXPSTK = 81 ; GS1 DataBar Expanded Stacked Global Const $BARCODE_RSS_EXPSTACK = 81 ; Legacy Global Const $BARCODE_PLANET = 82 ; USPS PLANET Global Const $BARCODE_MICROPDF417 = 84 ; MicroPDF417 Global Const $BARCODE_USPS_IMAIL = 85 ; USPS Intelligent Mail Global Const $BARCODE_ONECODE = 85 ; Legacy Global Const $BARCODE_PLESSEY = 86 ; UK Plessey Global Const $BARCODE_TELEPEN_NUM = 87 ; Telepen Numeric Global Const $BARCODE_ITF14 = 89 ; ITF-14 Global Const $BARCODE_KIX = 90 ; Dutch Post KIX Global Const $BARCODE_AZTEC = 92 ; Aztec Global Const $BARCODE_DAFT = 93 ; DAFT Global Const $BARCODE_DPD = 96 ; DPD Global Const $BARCODE_MICROQR = 97 ; Micro QR Global Const $BARCODE_HIBC_128 = 98 ; HIBC Code 128 Global Const $BARCODE_HIBC_39 = 99 ; HIBC Code 39 Global Const $BARCODE_HIBC_DM = 102 ; HIBC Data Matrix Global Const $BARCODE_HIBC_QR = 104 ; HIBC QR Global Const $BARCODE_HIBC_PDF = 106 ; HIBC PDF417 Global Const $BARCODE_HIBC_MICPDF = 108 ; HIBC MicroPDF417 Global Const $BARCODE_HIBC_BLOCKF = 110 ; HIBC Codablock-F Global Const $BARCODE_HIBC_AZTEC = 112 ; HIBC Aztec Global Const $BARCODE_DOTCODE = 115 ; DotCode Global Const $BARCODE_HANXIN = 116 ; Han Xin Global Const $BARCODE_MAILMARK_2D = 119 ; Royal Mail 2D Mailmark Global Const $BARCODE_UPU_S10 = 120 ; UPU S10 Global Const $BARCODE_MAILMARK_4S = 121 ; Royal Mail 4-State Mailmark Global Const $BARCODE_MAILMARK = 121 ; Legacy Global Const $BARCODE_AZRUNE = 128 ; Aztec Runes Global Const $BARCODE_CODE32 = 129 ; Code 32 Global Const $BARCODE_EANX_CC = 130 ; Legacy Global Const $BARCODE_GS1_128_CC = 131 ; GS1-128 Composite Global Const $BARCODE_EAN128_CC = 131 ; Legacy Global Const $BARCODE_DBAR_OMN_CC = 132 ; DataBar Omnidirectional Composite Global Const $BARCODE_RSS14_CC = 132 ; Legacy Global Const $BARCODE_DBAR_LTD_CC = 133 ; DataBar Limited Composite Global Const $BARCODE_RSS_LTD_CC = 133 ; Legacy Global Const $BARCODE_DBAR_EXP_CC = 134 ; DataBar Expanded Composite Global Const $BARCODE_RSS_EXP_CC = 134 ; Legacy Global Const $BARCODE_UPCA_CC = 135 ; UPC-A Composite Global Const $BARCODE_UPCE_CC = 136 ; UPC-E Composite Global Const $BARCODE_DBAR_STK_CC = 137 ; DataBar Stacked Composite Global Const $BARCODE_RSS14STACK_CC = 137 ; Legacy Global Const $BARCODE_DBAR_OMNSTK_CC = 138 ; DataBar Stacked Omnidirectional Composite Global Const $BARCODE_RSS14_OMNI_CC = 138 ; Legacy Global Const $BARCODE_DBAR_EXPSTK_CC = 139 ; DataBar Expanded Stacked Composite Global Const $BARCODE_RSS_EXPSTACK_CC = 139 ; Legacy Global Const $BARCODE_CHANNEL = 140 ; Channel Code Global Const $BARCODE_CODEONE = 141 ; Code One Global Const $BARCODE_GRIDMATRIX = 142 ; Grid Matrix Global Const $BARCODE_UPNQR = 143 ; UPNQR Global Const $BARCODE_ULTRA = 144 ; Ultracode Global Const $BARCODE_RMQR = 145 ; Rectangular Micro QR Global Const $BARCODE_BC412 = 146 ; IBM BC412 Global Const $BARCODE_DXFILMEDGE = 147 ; DX Film Edge Global Const $BARCODE_EAN8_CC = 148 ; EAN-8 Composite Global Const $BARCODE_EAN13_CC = 149 ; EAN-13 Composite Global Const $BARCODE_LAST = 149 ; Max marker ; === Output options === Global Const $BARCODE_BIND_TOP = 0x00001 ; Bind top Global Const $BARCODE_BIND = 0x00002 ; Bind bottom Global Const $BARCODE_BOX = 0x00004 ; Box around symbol Global Const $BARCODE_STDOUT = 0x00008 ; Output to stdout Global Const $READER_INIT = 0x00010 ; Reader Initialisation Global Const $SMALL_TEXT = 0x00020 ; Small human readable text Global Const $BOLD_TEXT = 0x00040 ; Bold human readable text Global Const $CMYK_COLOUR = 0x00080 ; Use CMYK in EPS Global Const $BARCODE_DOTTY_MODE = 0x00100 ; Dotty mode Global Const $GS1_GS_SEPARATOR = 0x00200 ; Use GS as separator Global Const $OUT_BUFFER_INTERMEDIATE = 0x00400 ; Return intermediate data Global Const $BARCODE_QUIET_ZONES = 0x00800 ; Force quiet zones Global Const $BARCODE_NO_QUIET_ZONES = 0x01000 ; Suppress quiet zones Global Const $COMPLIANT_HEIGHT = 0x02000 ; Compliant height Global Const $EANUPC_GUARD_WHITESPACE = 0x04000 ; Guard whitespace Global Const $EMBED_VECTOR_FONT = 0x08000 ; Embed vector font Global Const $BARCODE_MEMORY_FILE = 0x10000 ; Output to memory Global Const $BARCODE_RAW_TEXT = 0x20000 ; Output raw text ; === Input modes === Global Const $DATA_MODE = 0 ; Binary input Global Const $UNICODE_MODE = 1 ; Unicode input Global Const $GS1_MODE = 2 ; GS1 input Global Const $ESCAPE_MODE = 0x0008 ; Escape sequences Global Const $GS1PARENS_MODE = 0x0010 ; GS1 parentheses Global Const $GS1NOCHECK_MODE = 0x0020 ; Skip GS1 checks Global Const $HEIGHTPERROW_MODE = 0x0040 ; Height per row Global Const $FAST_MODE = 0x0080 ; Fast mode Global Const $EXTRA_ESCAPE_MODE = 0x0100 ; Extra escape Global Const $GS1SYNTAXENGINE_MODE = 0x0200 ; GS1 syntax engine ; === Data Matrix options === Global Const $DM_SQUARE = 100 ; Square only Global Const $DM_DMRE = 101 ; DMRE only Global Const $DM_ISO_144 = 128 ; ISO 144 compliance ; === QR/Han Xin/Grid Matrix options === Global Const $ZINT_FULL_MULTIBYTE = 200 ; Full multibyte ; === Ultracode options === Global Const $ULTRA_COMPRESSION = 128 ; Compression mode ; === Warnings & Errors === Global Const $ZINT_WARN_HRT_TRUNCATED = 1 ; HRT truncated Global Const $ZINT_WARN_INVALID_OPTION = 2 ; Invalid option Global Const $ZINT_WARN_USES_ECI = 3 ; Uses ECI Global Const $ZINT_WARN_NONCOMPLIANT = 4 ; Noncompliant symbol Global Const $ZINT_ERROR = 5 ; General error Global Const $ZINT_ERROR_TOO_LONG = 5 ; Data too long Global Const $ZINT_ERROR_INVALID_DATA = 6 ; Invalid data Global Const $ZINT_ERROR_INVALID_CHECK = 7 ; Invalid check digit Global Const $ZINT_ERROR_INVALID_OPTION = 8 ; Invalid option Global Const $ZINT_ERROR_ENCODING_PROBLEM = 9 ; Encoding problem Global Const $ZINT_ERROR_FILE_ACCESS = 10 ; File access error Global Const $ZINT_ERROR_MEMORY = 11 ; Memory error Global Const $ZINT_ERROR_FILE_WRITE = 12 ; File write error Global Const $ZINT_ERROR_USES_ECI = 13 ; Uses ECI Global Const $ZINT_ERROR_NONCOMPLIANT = 14 ; Noncompliant Global Const $ZINT_ERROR_HRT_TRUNCATED = 15 ; HRT truncated ; === Warning levels === Global Const $WARN_DEFAULT = 0 ; Default warnings Global Const $WARN_FAIL_ALL = 2 ; Treat all warnings as errors ; === Capabilities === Global Const $ZINT_CAP_HRT = 0x0001 ; Has HRT Global Const $ZINT_CAP_STACKABLE = 0x0002 ; Stackable Global Const $ZINT_CAP_EANUPC = 0x0004 ; EAN/UPC Global Const $ZINT_CAP_EXTENDABLE = 0x0004 ; Extendable (legacy) Global Const $ZINT_CAP_COMPOSITE = 0x0008 ; Composite Global Const $ZINT_CAP_ECI = 0x0010 ; ECI capable Global Const $ZINT_CAP_GS1 = 0x0020 ; GS1 capable Global Const $ZINT_CAP_DOTTY = 0x0040 ; Dotty capable Global Const $ZINT_CAP_QUIET_ZONES = 0x0080 ; Quiet zones Global Const $ZINT_CAP_FIXED_RATIO = 0x0100 ; Fixed ratio Global Const $ZINT_CAP_READER_INIT = 0x0200 ; Reader Init Global Const $ZINT_CAP_FULL_MULTIBYTE = 0x0400 ; Full multibyte Global Const $ZINT_CAP_MASK = 0x0800 ; Masking Global Const $ZINT_CAP_STRUCTAPP = 0x1000 ; Structured Append Global Const $ZINT_CAP_COMPLIANT_HEIGHT = 0x2000 ; Compliant height Global Const $ZINT_CAP_BINDABLE = 0x4000 ; Bindable ; === Limits === Global Const $ZINT_MAX_DATA_LEN = 17400 ; Max data length Global Const $ZINT_MAX_SEG_COUNT = 256 ; Max segment count #EndRegion #Region Structs ; Vector elements Global Const $tag_zint_vector_rect = "struct;" & _ "float x;" & _ ; Top left "float y;" & _ "float height;" & _ "float width;" & _ "long colour;" & _ ; -1 foreground, 1-8 = Cyan, Blue, Magenta, Red, Yellow, Green, Black, White "ptr next;" & _ ; Pointer to next rectangle "endstruct" Global Const $tag_zint_vector_hexagon = "struct;" & _ "float x;" & _ ; Centre x "float y;" & _ ; Centre y "float diameter;" & _ ; Short diameter (inscribed circle) "long rotation;" & _ ; 0, 90, 180, 270 (0 = apex at top) "ptr next;" & _ ; Pointer to next hexagon "endstruct" Global Const $tag_zint_vector_string = "struct;" & _ "float x;" & _ ; Relative to halign "float y;" & _ ; Relative to baseline "float fsize;" & _ ; Font size "float width;" & _ ; Rendered width estimate "long length;" & _ ; Number of characters (bytes) "long rotation;" & _ ; 0, 90, 180, 270 "long halign;" & _ ; 0 = centre, 1 = left, 2 = right "ptr text;" & _ ; UTF-8, NUL-terminated "ptr next;" & _ ; Pointer to next string "endstruct" Global Const $tag_zint_vector_circle = "struct;" & _ "float x;" & _ ; Centre x "float y;" & _ ; Centre y "float diameter;" & _ ; Circle diameter (excludes width) "float width;" & _ ; Perimeter width, 0 = fill "long colour;" & _ ; 0 = foreground colour, else background "ptr next;" & _ ; Pointer to next circle "endstruct" Global Const $tag_zint_vector = "struct;" & _ "float width;" & _ ; Overall barcode width "float height;" & _ ; Overall barcode height "ptr rectangles;" & _ ; Pointer to first rectangle "ptr hexagons;" & _ ; Pointer to first hexagon "ptr strings;" & _ ; Pointer to first string "ptr circles;" & _ ; Pointer to first circle "endstruct" ; Structured Append info Global Const $tag_zint_structapp = "long index;" & _ ; Position in sequence (1-based) "long count;" & _ ; Number of symbols in sequence "char id[32];" ; Optional ID, ASCII, NUL-terminated ; Segment info Global Const $tag_zint_seg = "struct;" & _ "ptr source;" & _ ; Data pointer "long length;" & _ ; Data length (0 = NUL-terminated) "long eci;" & _ ; Extended Channel Interpretation "endstruct" ; Main symbol structure Global Const $tag_zint_symbol = "struct;" & _ "long symbology;" & _ ; Symbol type "float height;" & _ ; Barcode height "float scale;" & _ ; Scale factor "long whitespace_width;" & _ ; Horizontal whitespace "long whitespace_height;" & _ ; Vertical whitespace "long border_width;" & _ ; Border width "long output_options;" & _ ; Output options "char fgcolour[16];" & _ ; Foreground colour string "char bgcolour[16];" & _ ; Background colour string "ptr fgcolor;" & _ ; Pointer to fgcolour "ptr bgcolor;" & _ ; Pointer to bgcolour "char outfile[256];" & _ ; Output filename "char primary[128];" & _ ; Primary message data "long option_1;" & _ ; Symbol-specific option "long option_2;" & _ "long option_3;" & _ "long show_hrt;" & _ ; Show (1) / hide (0) human readable text "long input_mode;" & _ ; Input encoding "long eci;" & _ ; Extended Channel Interpretation "float dpmm;" & _ ; Resolution in dots/mm "float dot_size;" & _ ; Dot size (dotty mode) "float text_gap;" & _ ; Gap between barcode and text "float guard_descent;" & _ ; EAN/UPC guard bar descent $tag_zint_structapp & _ ; Structured append info "long warn_level;" & _ ; Warning behaviour "long debug;" & _ ; Debug flags "byte text[256];" & _ ; Human-readable text (output) "long text_length;" & _ ; Length of text (output) "long rows;" & _ ; Number of rows (output) "long width;" & _ ; Symbol width (output) "byte encoded_data[28800];" & _ ; Encoded data (flattened 200x144) "float row_height[200];" & _ ; Row heights "char errtxt[160];" & _ ; Error text (output) "ptr bitmap;" & _ ; Bitmap pointer (output) "long bitmap_width;" & _ ; Bitmap width "long bitmap_height;" & _ ; Bitmap height "ptr alphamap;" & _ ; Alpha channel pointer "ptr vector;" & _ ; Vector header pointer "ptr memfile;" & _ ; In-memory file buffer "long memfile_size;" & _ ; Buffer length "ptr raw_segs;" & _ ; Raw segments pointer "long raw_seg_count;" & _ ; Number of raw segs "endstruct" #EndRegion #Region Functions ; Create and initialize a symbol structure Func ZBarcode_Create() If Not FileExists($g__ZintDLL) Then If @AutoItX64 Then _zint64dll(True) Else _zintdll(True) EndIf EndIf Local $hPtr = DllCall($g__ZintDLL, "ptr:cdecl", "ZBarcode_Create")[0] If $hPtr = 0 Then Return SetError(2, 0, 0) Return $hPtr EndFunc ; Free any output buffers that may have been created and initialize output fields Func ZBarcode_Clear($pSymbol) If IsPtr($pSymbol) And $pSymbol <> 0 Then DllCall($g__ZintDLL, "none:cdecl", "ZBarcode_Clear", "ptr", $pSymbol) Return 1 EndIf Return SetError(1, 0, 0) EndFunc ; Free any output buffers that may have been created and reset all fields to defaults Func ZBarcode_Reset($pSymbol) If IsPtr($pSymbol) And $pSymbol <> 0 Then DllCall($g__ZintDLL, "none:cdecl", "ZBarcode_Reset", "ptr", $pSymbol) Return 1 EndIf Return SetError(1, 0, 0) EndFunc ; Free a symbol structure, including any output buffers Func ZBarcode_Delete($pSymbol) If IsPtr($pSymbol) And $pSymbol <> 0 Then DllCall($g__ZintDLL, "none:cdecl", "ZBarcode_Delete", "ptr", $pSymbol) Return 1 EndIf Return SetError(1, 0, 0) EndFunc ; =================================================================== ; Encoding ; =================================================================== ; Encode a barcode. If length is 0 or negative, source must be NUL-terminated Func ZBarcode_Encode($pSymbol, $sInput) Local $iLength = StringLen($sInput) Local $tInput = DllStructCreate("struct;ubyte text[" & $iLength + 1 & "];endstruct") $tInput.text = $sInput Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode", "ptr", $pSymbol, "struct*", $tInput, "long", $iLength + 1)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; Encode a barcode with multiple ECI segments Func ZBarcode_Encode_Segs($pSymbol, $pSegs, $iSegCount) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_Segs", "ptr", $pSymbol, "ptr", $pSegs, "long", $iSegCount)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; Encode a barcode using input data from file Func ZBarcode_Encode_File($pSymbol, $sFilename) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_File", "ptr", $pSymbol, "str", $sFilename)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; =================================================================== ; Output to file ; =================================================================== ; Output a previously encoded symbol to file Func ZBarcode_Print($pSymbol, $iAngle = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Print", "ptr", $pSymbol, "long", $iAngle)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; Encode and output a symbol to file Func ZBarcode_Encode_and_Print($pSymbol, $sInput, $iRotate = 0) Local $iLength = StringLen($sInput) Local $tInput = DllStructCreate("struct;ubyte text[" & $iLength + 1 & "];endstruct") $tInput.text = $sInput Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_and_Print", "ptr", $pSymbol, "struct*", $tInput, "long", $iLength + 1, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; Encode a symbol with multiple ECI segments and output to file Func ZBarcode_Encode_Segs_and_Print($pSymbol, $pSegs, $iSegCount, $iRotate = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_Segs_and_Print", "ptr", $pSymbol, "ptr", $pSegs, "long", $iSegCount, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; Encode a symbol using input data from file and output to file Func ZBarcode_Encode_File_and_Print($pSymbol, $sFilename, $iRotate = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_File_and_Print", "ptr", $pSymbol, "str", $sFilename, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; =================================================================== ; Output to memory (raster/vector) ; =================================================================== Func ZBarcode_Buffer($pSymbol, $iAngle = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Buffer", "ptr", $pSymbol, "long", $iAngle)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Encode_and_Buffer($pSymbol, $sInput, $iRotate = 0) Local $iLength = StringLen($sInput) Local $tInput = DllStructCreate("struct;ubyte text[" & $iLength + 1 & "];endstruct") $tInput.text = $sInput Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_and_Buffer", "ptr", $pSymbol, "struct*", $tInput, "long", $iLength + 1, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Encode_Segs_and_Buffer($pSymbol, $pSegs, $iSegCount, $iRotate = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_Segs_and_Buffer", "ptr", $pSymbol, "ptr", $pSegs, "long", $iSegCount, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Encode_File_and_Buffer($pSymbol, $sFilename, $iRotate = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_File_and_Buffer", "ptr", $pSymbol, "str", $sFilename, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Buffer_Vector($pSymbol, $iAngle = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Buffer_Vector", "ptr", $pSymbol, "long", $iAngle)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Encode_and_Buffer_Vector($pSymbol, $sInput, $iRotate = 0) Local $iLength = StringLen($sInput) Local $tInput = DllStructCreate("struct;ubyte text[" & $iLength + 1 & "];endstruct") $tInput.text = $sInput Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_and_Buffer_Vector", "ptr", $pSymbol, "struct*", $tInput, "long", $iLength + 1, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Encode_Segs_and_Buffer_Vector($pSymbol, $pSegs, $iSegCount, $iRotate = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_Segs_and_Buffer_Vector", "ptr", $pSymbol, "ptr", $pSegs, "long", $iSegCount, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc Func ZBarcode_Encode_File_and_Buffer_Vector($pSymbol, $sFilename, $iRotate = 0) Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Encode_File_and_Buffer_Vector", "ptr", $pSymbol, "str", $sFilename, "long", $iRotate)[0] If $iResult Then Return SetError($iResult, 0, 0) Return 1 EndFunc ; =================================================================== ; Info & Validation ; =================================================================== ; Is symbol_id a recognized symbology? Func ZBarcode_ValidID($iSymbolID) Return DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_ValidID", "long", $iSymbolID)[0] EndFunc ; Copy BARCODE_XXX name of symbol_id into name buffer Func ZBarcode_BarcodeName($iSymbolID) Local $tName = DllStructCreate("char[32]") Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_BarcodeName", "long", $iSymbolID, "struct*", $tName)[0] If $iResult Then Return SetError($iResult, 0, "") Return DllStructGetData($tName, 1) EndFunc ; Return the capability flags for symbology symbol_id that match cap_flag Func ZBarcode_Cap($iSymbolID, $iCapFlag) Return DllCall($g__ZintDLL, "uint:cdecl", "ZBarcode_Cap", "long", $iSymbolID, "uint", $iCapFlag)[0] EndFunc ; =================================================================== ; X-dimension & Scaling ; =================================================================== Func ZBarcode_Default_Xdim($iSymbolID) Return DllCall($g__ZintDLL, "float:cdecl", "ZBarcode_Default_Xdim", "long", $iSymbolID)[0] EndFunc Func ZBarcode_Scale_From_XdimDp($iSymbolID, $fXDimMM, $fDpmm, $sFiletype = "") Return DllCall($g__ZintDLL, "float:cdecl", "ZBarcode_Scale_From_XdimDp", _ "long", $iSymbolID, "float", $fXDimMM, "float", $fDpmm, "str", $sFiletype)[0] EndFunc Func ZBarcode_XdimDp_From_Scale($iSymbolID, $fScale, $fXDimOrDpmm, $sFiletype = "") Return DllCall($g__ZintDLL, "float:cdecl", "ZBarcode_XdimDp_From_Scale", _ "long", $iSymbolID, "float", $fScale, "float", $fXDimOrDpmm, "str", $sFiletype)[0] EndFunc ; =================================================================== ; UTF-8 & ECI helpers ; =================================================================== Func ZBarcode_UTF8_To_ECI($iEci, $sSource, ByRef $sDest) Local $iLength = StringLen($sSource) Local $tSrc = DllStructCreate("struct;ubyte text[" & $iLength + 1 & "];endstruct") $tSrc.text = $sSource Local $tDest = DllStructCreate("ubyte[1024]") ; allocate buffer Local $pDestLen = DllStructCreate("int") Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_UTF8_To_ECI", "long", $iEci, "struct*", $tSrc, "long", $iLength + 1, "struct*", $tDest, "struct*", $pDestLen)[0] If $iResult Then Return SetError($iResult, 0, "") $sDest = BinaryToString(DllStructGetData($tDest, 1)) Return 1 EndFunc Func ZBarcode_Dest_Len_ECI($iEci, $sSource) Local $iLength = StringLen($sSource) Local $tSrc = DllStructCreate("struct;ubyte text[" & $iLength + 1 & "];endstruct") $tSrc.text = $sSource Local $pDestLen = DllStructCreate("int") Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Dest_Len_ECI", "long", $iEci, "struct*", $tSrc, "long", $iLength + 1, "struct*", $pDestLen)[0] If $iResult Then Return SetError($iResult, 0, 0) Return DllStructGetData($pDestLen, 1) EndFunc ; =================================================================== ; Build info ; =================================================================== Func ZBarcode_NoPng() Return DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_NoPng")[0] EndFunc Func ZBarcode_HaveGS1SyntaxEngine() Return DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_HaveGS1SyntaxEngine")[0] EndFunc ; Return the version of Zint linked to Func ZBarcode_Version() Local $iResult = DllCall($g__ZintDLL, "long:cdecl", "ZBarcode_Version")[0] Local $a = StringRegExp((Mod(StringLen($iResult), 2) ? "0" : "") & $iResult, ".{2}", 3) If Not IsArray($a) Then Return SetError(1, 0, 0) Return StringFormat("%01i.%02i.%02i", $a[0], $a[1], $a[2]) EndFunc #EndRegion Example1.au3 #AutoIt3Wrapper_UseX64=y #include <GDIPlus.au3> #include "Zint.au3" Global Const $sTestFile = "out.png" ;default output name If FileExists($sTestFile) Then FileDelete($sTestFile) Global $pZB = ZBarcode_Create() If @error Then Exit MsgBox(16, "ERROR", "An error occured!" & @CRLF & "Error code = " & @error, 10) ConsoleWrite("Zint DLL version: " & ZBarcode_Version() & @CRLF) ConsoleWrite("PNG support: " & (ZBarcode_NoPng() ? "No" : "Yes") & @CRLF) Global $t_zint_symbol = DllStructCreate($tag_zint_symbol, $pZB) If @error Then MsgBox(16, "ERROR", "An error occured!" & @CRLF & "Error code = " & @error, 10) ZBarcode_Delete($pZB) Exit EndIf With $t_zint_symbol .symbology = $BARCODE_CODE128 .scale = 1 .option_1 = -1 .show_hrt = 1 .output_options = $SMALL_TEXT .outfile = $sTestFile EndWith ZBarcode_Encode_and_Print($pZB, "12340984576") Global $iError = @error ZBarcode_Delete($pZB) If FileExists($sTestFile) Then ShellExecute($sTestFile) Else MsgBox(16, "Error", "Code was not create. Error: " & $iError, 5) EndIf Example2.au3 #AutoIt3Wrapper_UseX64=n #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include "Zint.au3" Global Const $sTestFile = @ScriptDir & "\Barcode.png" Global $pZB = ZBarcode_Create() If @error Then Exit MsgBox(16, "ERROR", "An error occured!" & @CRLF & "Error code = " & @error, 10) Global $t_zint_symbol = DllStructCreate($tag_zint_symbol, $pZB) $t_zint_symbol.symbology = $BARCODE_QRCODE $t_zint_symbol.scale = 10 ZBarcode_Encode_and_Buffer($pZB, "Hello QR World ;-)") _GDIPlus_Startup() Global $stride = BitAND(($t_zint_symbol.bitmap_width * 3) + 3, BitNOT(3)) Global $iMemSize = $stride * $t_zint_symbol.bitmap_height Global $tPixel = DllStructCreate("ubyte rgb[" & $iMemSize & "];") Global $hBitmap = _GDIPlus_BitmapCreateFromScan0($t_zint_symbol.bitmap_width, $t_zint_symbol.bitmap_height, $GDIP_PXF24RGB, $stride, $tPixel) DllCall("msvcrt.dll", "ptr:cdecl", "memcpy", "struct*", $tPixel, "ptr", $t_zint_symbol.bitmap, "uint", $iMemSize) Global Const $hGUI = GUICreate("Test QR Code", $t_zint_symbol.bitmap_width, $t_zint_symbol.bitmap_height) GUISetState(@SW_SHOW) Global Const $hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI) _GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap, 0, 0, $t_zint_symbol.bitmap_width, $t_zint_symbol.bitmap_height) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_ImageDispose($hBitmap) _GDIPlus_Shutdown() ZBarcode_Delete($pZB) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE Example3.au3 #AutoIt3Wrapper_UseX64=n #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include "Zint.au3" Global $pZB = ZBarcode_Create() If @error Then Exit MsgBox(16, "ERROR", "An error occured!" & @CRLF & "Error code = " & @error, 10) Global $t_zint_symbol = DllStructCreate($tag_zint_symbol, $pZB), $sText = "12340984576 ;-)" With $t_zint_symbol .symbology = $BARCODE_CODE128 .scale = 1 EndWith If Not ZBarcode_Encode_and_Buffer_Vector($pZB, $sText) Then Exit MsgBox(16, "ERROR", "Unable to encode!" & @CRLF & "Error code = " & @error, 10) Global $tVector = DllStructCreate($tag_zint_vector, $t_zint_symbol.vector) Global $tVector_Rect = DllStructCreate($tag_zint_vector_rect, $tVector.rectangles) ConsoleWrite($tVector.width & " x " & $tVector.height & @CRLF) _GDIPlus_Startup() Global $hBitmap = _GDIPlus_BitmapCreateFromScan0($tVector.width, $tVector.height, $GDIP_PXF24RGB), $hCanvas = _GDIPlus_ImageGetGraphicsContext($hBitmap), $hBrush = _GDIPlus_BrushCreateSolid() _GDIPlus_GraphicsClear($hCanvas, 0xFFFFFFFF) While $tVector_Rect.next _GDIPlus_BrushSetSolidColor($hBrush, BitAND($tVector_Rect.colour, 0xFF000000)) _GDIPlus_GraphicsFillRect($hCanvas, $tVector_Rect.x, $tVector_Rect.y, $tVector_Rect.width, $tVector_Rect.height, $hBrush) $tVector_Rect = DllStructCreate($tag_zint_vector_rect, $tVector_Rect.next) WEnd Global $tVector_String = DllStructCreate($tag_zint_vector_string, $tVector.strings) _GDIPlus_GraphicsDrawString($hCanvas, $sText, ($tVector_String.width - $tVector_String.length * $tVector_String.fsize * 0.55) / 2, $tVector.height - $tVector_String.fsize * 1.33333, "Arial", $tVector_String.fsize * 0.75, Default, 0xFF000000) Global Const $hGUI = GUICreate("Test Bar Code 128", $tVector.width, $tVector.height) GUISetState(@SW_SHOW) Global Const $hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI) _GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap, 0, 0, $tVector.width, $tVector.height) _GDIPlus_GraphicsDispose($hCanvas) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_ImageDispose($hBitmap) _GDIPlus_BrushDispose($hBrush) _GDIPlus_Shutdown() ZBarcode_Delete($pZB) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE Example4.au3 #AutoIt3Wrapper_UseX64=y #include "Zint.au3" ; =================================================================== ; Zint AutoIt Demo Test ; =================================================================== ; ------------------------------------------------------------------- ; Step 1: Create a symbol ; ------------------------------------------------------------------- ConsoleWrite("Step 1: Create a symbol" & @CRLF) Global $pSymbol = ZBarcode_Create() If @error Then MsgBox(16, "Error", "Failed to create symbol") Exit EndIf ConsoleWrite("Symbol created: " & $pSymbol & @CRLF) ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 2: Encode a simple string ; ------------------------------------------------------------------- ConsoleWrite("Step 2: Encode a simple string" & @CRLF) Global $sData = "HELLO123" If ZBarcode_Encode($pSymbol, $sData) Then ConsoleWrite("Encoding succeeded" & @CRLF) Else ConsoleWrite("Encoding failed, error: " & @error & @CRLF) EndIf ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 3: Output to raster buffer ; ------------------------------------------------------------------- ConsoleWrite("Step 3: Output to raster buffer" & @CRLF) If ZBarcode_Buffer($pSymbol) Then ConsoleWrite("Raster buffer generated successfully" & @CRLF) Else ConsoleWrite("Raster buffer generation failed, error: " & @error & @CRLF) EndIf ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 4: Output to vector buffer ; ------------------------------------------------------------------- ConsoleWrite("Step 4: Output to vector buffer" & @CRLF) If ZBarcode_Buffer_Vector($pSymbol) Then ConsoleWrite("Vector buffer generated successfully" & @CRLF) Else ConsoleWrite("Vector buffer generation failed, error: " & @error & @CRLF) EndIf ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 5: Print to file (just test call, file may not exist) ; ------------------------------------------------------------------- ConsoleWrite("Step 5: Print to file" & @CRLF) Global $t_zint_symbol = DllStructCreate($tag_zint_symbol, $pSymbol) $t_zint_symbol.symbology = $BARCODE_CODE128 $t_zint_symbol.input_mode = $DATA_MODE $t_zint_symbol.height = 50 $t_zint_symbol.scale = 1 $t_zint_symbol.option_1 = 0 $t_zint_symbol.option_2 = 0 $t_zint_symbol.option_3 = 0 $t_zint_symbol.show_hrt = 1 If ZBarcode_Print(DllStructGetPtr($t_zint_symbol)) Then ConsoleWrite("Print function call succeeded" & @CRLF) Else ConsoleWrite("Print failed, error: " & @error & @CRLF) EndIf ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 6: Get barcode info ; ------------------------------------------------------------------- ConsoleWrite("Step 6: Get barcode info" & @CRLF) ConsoleWrite("Valid ID for CODE128: " & ZBarcode_ValidID(20) & @CRLF) ConsoleWrite("Barcode name for CODE128: " & ZBarcode_BarcodeName(20) & @CRLF) ConsoleWrite("Default X-dim for CODE128: " & ZBarcode_Default_Xdim(20) & " mm" & @CRLF) ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 7: UTF-8 to ECI conversion test ; ------------------------------------------------------------------- ConsoleWrite("Step 7: UTF-8 to ECI conversion test" & @CRLF) Global $sDest If ZBarcode_UTF8_To_ECI(3, "HELLO", $sDest) Then ConsoleWrite("UTF-8 to ECI conversion succeeded: " & $sDest & @CRLF) Else ConsoleWrite("UTF-8 to ECI conversion failed, error: " & @error & @CRLF) EndIf ConsoleWrite(@CRLF) ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 8: Check Zint build info ; ------------------------------------------------------------------- ConsoleWrite("Step 8: Check Zint build info" & @CRLF) ConsoleWrite("Zint No PNG support: " & ZBarcode_NoPng() & @CRLF) ConsoleWrite("Zint GS1 support: " & ZBarcode_HaveGS1SyntaxEngine() & @CRLF) ConsoleWrite("Zint Version: " & ZBarcode_Version() & @CRLF) ConsoleWrite(@CRLF) ; ------------------------------------------------------------------- ; Step 9: Clear, reset and delete symbol ; ------------------------------------------------------------------- ConsoleWrite("Step 9: Clear, reset and delete symbol" & @CRLF) ZBarcode_Clear($pSymbol) ConsoleWrite("Symbol cleared" & @CRLF) ZBarcode_Reset($pSymbol) ConsoleWrite("Symbol reset" & @CRLF) ZBarcode_Delete($pSymbol) ConsoleWrite("Symbol deleted" & @CRLF) ConsoleWrite(@CRLF) MsgBox(64, "Demo Complete", "Zint AutoIt demo test finished successfully.") Example5.au3 #AutoIt3Wrapper_UseX64=y #include "Zint.au3" ; Zint Symbol erstellen Global $pZB = ZBarcode_Create() If @error Then Exit MsgBox(16, "ERROR", "An error occured!" & @CRLF & "Error code = " & @error, 10) ; Configure Zint Symbol structure Global $t_zint_symbol = DllStructCreate($tag_zint_symbol, $pZB) With $t_zint_symbol .symbology = $BARCODE_AZTEC .input_mode = $UNICODE_MODE .scale = 10 .outfile = @ScriptDir & "\segtest.png" EndWith If FileExists($t_zint_symbol.outfile) Then FileDelete($t_zint_symbol.outfile) Global $tagSeg = "ptr source; int length; int eci" ; --- Create continuous array --- Global $iSize = (@AutoItX64 ? 16 : 12) ;size of $tagSeg Global $tContinuousArray = DllStructCreate("byte[" & $iSize * 3 & "]") ; --- Create individual zint_seg structures --- Global $tSeg1 = DllStructCreate($tagSeg, DllStructGetPtr($tContinuousArray)) Global $tSeg2 = DllStructCreate($tagSeg, DllStructGetPtr($tContinuousArray) + $iSize) Global $tSeg3 = DllStructCreate($tagSeg, DllStructGetPtr($tContinuousArray) + 2 * $iSize) ; --- Create the text data --- Global $sText1 = "Κείμενο" ; Greek Global $sText2 = "Текст" ; Cyrillic Global $sText3 = "文章" ; Chinese ; Convert to UTF-8 (or use direct string pointers if Zint.au3 supports it) Global $tText1 = DllStructCreate("char t[256]") Global $tText2 = DllStructCreate("char t[256]") Global $tText3 = DllStructCreate("char t[256]") $tText1.t = $sText1 $tText2.t = $sText2 $tText3.t = $sText3 ; --- Fill the segment structures --- $tSeg1.source = DllStructGetPtr($tText1) $tSeg1.length = 0 ; 0 = NUL-terminated $tSeg1.eci = 9 ; Greek ECI $tSeg2.source = DllStructGetPtr($tText2) $tSeg2.length = 0 $tSeg2.eci = 7 ; Cyrillic ECI $tSeg3.source = DllStructGetPtr($tText3) $tSeg3.length = 0 $tSeg3.eci = 20 ; Chinese ECI Global $iError = 0 ; --- Call ZBarcode_Encode_Segs --- If Not ZBarcode_Encode_Segs($pZB, DllStructGetPtr($tContinuousArray), 3) Then $iError = @error MsgBox(16, "ERROR", "ZBarcode_Encode_Segs returned error: " & $iError, 10) EndIf ZBarcode_Print($pZB, 0) If Not $iError Then ShellExecute($t_zint_symbol.outfile) ZBarcode_Delete($pZB) Please test and reply. Feel free to post examples here!
    1 point
  2. Not nonsense at all, thank you, I tried extracting probably updated functions but it didn't help. Only direct extraction of EXE code works, I mean partially works (no -s recursive mode) 😞.
    1 point
  3. One-liner ? Why do you need to read the current value in the first place ? Juste update the time with IniWrite...there goes your one-liner
    1 point
  4. Dotaznik

    Windows Services UDF

    Ah, it is script breaking change in v v3.3.16.0, SecurityConstants.au3 has been addapted to avoid naming confict. So $RIGHTS_DELETE, $SYNCHRONIZE, have been renamed to $STANDARD_*.
    1 point
  5. @pixelsearch I like It! I did make a couple more little tweaks, however. In the _BrowseForFolder function I added another Global variable, for the hWnd of the dialog so it could be used in the _TimeProc function. And then I stored the hWnd of the dialog in the _BrowserProc function. Func _BrowseForFolder($sInitDir, $sTitle = 'Browse For Folder', $sPrompt = 'Select a folder from the list below.', $hParent_hWnd = 0) Global $g_hBrowseDlg = 0, $g_hEdit = 0 ... Func _BrowseProc($hWnd, $iMsg, $wParam, $lParam) $g_hBrowseDlg = $hWnd Then I changed the If conditional in the _TimerProc function from this: If ($aMPos[0] > $aEditPos[0]) And ($aMPos[0] < $aEditPos[0] + $aEditPos[2]) _ And ($aMPos[1] > $aEditPos[1]) And ($aMPos[1] < $aEditPos[1] + $aEditPos[3]) Then ToolTip(_WinAPI_GetWindowText($g_hEdit), $aEditPos[0], $aEditPos[1] - 25) $bToolTip = True Else If $bToolTip Then ToolTip("") $bToolTip = False EndIf EndIf To this: If WinActive($g_hBrowseDlg) _ And ($aMPos[0] > $aEditPos[0]) And ($aMPos[0] < $aEditPos[0] + $aEditPos[2]) _ And ($aMPos[1] > $aEditPos[1]) And ($aMPos[1] < $aEditPos[1] + $aEditPos[3]) Then If Not $bToolTip Then ToolTip(_WinAPI_GetWindowText($g_hEdit), $aEditPos[0], $aEditPos[1]) $bToolTip = True Else If $bToolTip Then ToolTip("") $bToolTip = False EndIf EndIf These little tweaks accomplish 3 things: 1) The tooltip gets dismissed if the dialog stops being the active window. Otherwise the tooltip bleeds through to other windows if you happen to have the mouse positioned where the Edit control is, even if the dialog is hidden below the other windows. 2) If the tooltip is already displayed it doesn't try to display it again. It just leaves it alone. That eliminates flickering. 3) Instead of positioning the tooltip higher than the Edit control, I positioned it directly covering the Edit control. This is more consistent with Microsoft UI design guidelines. The article here states: In fact, if you happen to have (or create) a folder name that's too long to display fully in the TreeView portion of the dialog, the dialog already displays an in-place tooltip for it within the TreeView control. So doing the same for the Edit control is more consistent with the over dialog design. So here's the complete listing with my tweaks added: #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WinAPIDlg.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> Opt('MustDeclareVars', 1) ConsoleWrite('Returned Path = ' & _BrowseForFolder(@ScriptDir, 'Custom Title', 'Custom Prompt') & @TAB & '@extended = ' & @extended & @CRLF) ;=================================================================================================================================== Func _BrowseForFolder($sInitDir, $sTitle = 'Browse For Folder', $sPrompt = 'Select a folder from the list below.', $hParent_hWnd = 0) Global $g_hBrowseDlg = 0, $g_hEdit = 0 Local $hTimerProc = DllCallbackRegister('_TimerProc', 'none', 'hwnd;uint;uint_ptr;dword') Local $iTimerID = _WinAPI_SetTimer(0, 0, 200, DllCallbackGetPtr($hTimerProc)) ; 200ms Global $s_BFF_Dialog_Title = $sTitle Local $hBrowseProc = DllCallbackRegister('_BrowseProc', 'int', 'hwnd;uint;lparam;ptr') Local $pBrowseProc = DllCallbackGetPtr($hBrowseProc) Local $pText = _WinAPI_CreateString($sInitDir) Local $sPath = _WinAPI_BrowseForFolderDlg('', $sPrompt, BitOR($BIF_RETURNONLYFSDIRS, $BIF_EDITBOX, $BIF_VALIDATE), $pBrowseProc, $pText, $hParent_hWnd) _WinAPI_FreeMemory($pText) DllCallbackFree($hBrowseProc) _WinAPI_KillTimer(0, $iTimerID) DllCallbackFree($hTimerProc) If $sPath = '' Then Return SetExtended(-1, '') Else Return $sPath EndIf EndFunc ;==>_BrowseForFolder ;=============================================== Func _BrowseProc($hWnd, $iMsg, $wParam, $lParam) $g_hBrowseDlg = $hWnd Local $sPath Switch $iMsg Case $BFFM_INITIALIZED _WinAPI_SetWindowText($hWnd, $s_BFF_Dialog_Title) ; set the title _SendMessage($hWnd, $BFFM_SETSELECTIONW, 1, $lParam) ; preselect specified folder $g_hEdit = ControlGetHandle($hWnd, '', 'Edit1') _SendMessage($g_hEdit, $EM_SETREADONLY, 1, 0) ; make edit control readonly ; turn off tab-stop for edit control and give focus to treeview at startup Local $Style = _WinAPI_GetWindowLong($g_hEdit, $GWL_STYLE) _WinAPI_SetWindowLong($g_hEdit, $GWL_STYLE, BitAND($Style, BitNOT($WS_TABSTOP))) Case $BFFM_SELCHANGED $sPath = _WinAPI_ShellGetPathFromIDList($wParam) ; get the selected path as a string If @error Or ($sPath = '') Then _SendMessage($hWnd, $BFFM_ENABLEOK, 0, 0) ; disable OK button for non-folder selections Else ControlSetText($hWnd, '', 'Edit1', $sPath) ; update edit control to show full path ; make sure end of path is visible in edit control _SendMessage(ControlGetHandle($hWnd, '', 'Edit1'), $EM_SETSEL, StringLen($sPath), StringLen($sPath)) _SendMessage($hWnd, $BFFM_ENABLEOK, 0, 1) ; enable OK button EndIf EndSwitch Return 0 EndFunc ;==>_BrowseProc ;=============================================== Func _TimerProc($hWnd, $iMsg, $iTimerID, $iTime) #forceref $hWnd, $iMsg, $iTimerID, $iTime Local Static $bToolTip = False Local $aEditPos = WinGetPos($g_hEdit) If @error Then Return ; Edit window not found Local $aMPos = MouseGetPos() If WinActive($g_hBrowseDlg) _ And ($aMPos[0] > $aEditPos[0]) And ($aMPos[0] < $aEditPos[0] + $aEditPos[2]) _ And ($aMPos[1] > $aEditPos[1]) And ($aMPos[1] < $aEditPos[1] + $aEditPos[3]) Then If Not $bToolTip Then ToolTip(_WinAPI_GetWindowText($g_hEdit), $aEditPos[0], $aEditPos[1]) $bToolTip = True Else If $bToolTip Then ToolTip("") $bToolTip = False EndIf EndIf EndFunc ;==>_TimerProc Thanks again for your invaluable assistance with this. It's ended up being a pretty slick little include, and works exactly as I'd hoped.
    1 point
  6. Debating hammer efficacy is a lot less fun than building shit. Explain that they are supposed to use the tools not be the tools. These threads make me think of this meme, and i giggle every time.
    1 point
×
×
  • Create New...