- Offizieller Beitrag
Hi,
im EN-Forum habe ich einen schönen Beitrag zum Erstellen von QR-Code gefunden.
Das Bsp. war mir nur viel zu aufgebläht und nicht zur direkten Texteingabe vorgesehen.
Somit habe ich eine GUI dafür erstellt mit folgenden Optionen:
- Auswahl: Kopiere in Zwischenablage
- Auswahl: Speichere Code als BMP und/oder PNG (oder gar nicht)
- Auswahl: Dateiname, Präfix ist immer "QR_", Vorgabe: "JJJJMMTT_hhmmss"
- Auswahl: Speicherordner, Vorgabe: Skriptordner
- Texteingabe im Edit, verbleibende Zeichenzahl wird angezeigt (max. 3049 Zeichen; normalerweise erlaubt QR bis 4296 Zeichen, die verwendete Dll hat hier jedoch limitiert - vermutlich Qualitätslevel)
- bei Restzeichenzahl unter 11 wird das Zählereld gelb hinterlegt, beim Überschreiten der zulässigen Anzahl erfolgt Rotfärbung
- Bei Erstellen des QR-Codes wird die GUI auf die jeweils erforderliche Größe angepasst
So schauts aus:
autoit.de/wcf/attachment/16727/
Die notwendige Dll habe ich als Binärstring gleich in die au3 mit eingebaut. Sie wird temporär erstellt im Skriptordner und beim Beenden wieder gelöscht.
Hier im Thread-Code habe ich den Binärstring gekürzt.
Edit 21.12.2012:
Ich glaube der Fehler ist gefunden: #AutoIt3Wrapper_UseX64=N ist erforderlich. Gleich noch einen kleinen Fehler gefixed: Es wurde immer im @ScriptDir gespeichert (hatte vergessen die Variable dafür zu setzen ;)).
QR_Creator.au3
#AutoIt3Wrapper_UseX64=N
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <GDIPlus.au3>
#include <Clipboard.au3>
Opt('GuiOnEventMode', 1)
OnAutoItExitRegister("_DelBinaryTempFiles")
Global Const $__QR_MAX_LEN = 3049 ; == may be that in your system another, low value is possible
[/autoit] [autoit][/autoit] [autoit]Global $sDllQR = @ScriptDir & "\quricol32.dll"
_CreateDll()
Func _CreateDll()
Local $bData
; String mit den Binärdaten von: quricol32.dll
$bData &= "0x4D5A90000300000004000000FFFF0000B8000000000000004000000000000000000000000000000000000000000000000000000000000000000...." ; gekürzt
$bData &= "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
Local $hFileOut = FileOpen($sDllQR, 2+8+16)
FileWrite($hFileOut, Binary($bData))
FileClose($hFileOut)
EndFunc
Func _DelBinaryTempFiles()
FileDelete($sDllQR)
EndFunc
Global $hWnd, $cbClip, $cbBMP, $cbPNG, $cbName, $lbName, $inName, $inPath, $btPath, $editQR, $btRun, $btDel
Global $iState, $fClip = False, $fBMP = False, $fPNG = True, $sFile, $iH
$hWnd = GUICreate("QR Creator", 500, 395)
$a = WinGetPos($hWnd)
$iH = $a[3]
GUICtrlCreateGroup(' Optionen ', 10, 10, 480, 120)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$cbClip = GUICtrlCreateCheckbox(' Kopie in Zwischenablage', 30, 35, 150, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateLabel('Speichern als:', 260, 38, 80, 17)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$cbBMP = GUICtrlCreateCheckbox(' *.BMP', 350, 35, 50, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$cbPNG = GUICtrlCreateCheckbox(' *.PNG', 420, 35, 50, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetState(-1, $GUI_CHECKED)
$cbName = GUICtrlCreateCheckbox(' Name Datei', 30, 65, 80, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$lbName = GUICtrlCreateLabel('QR_', 120, 66, 30, 18, BitOR(0x0002, 0x0200)) ; SS_RIGHT,SS_CENTER
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetBkColor(-1, 0xFEFEFE)
GUICtrlSetState(-1, $GUI_DISABLE)
$inName = GUICtrlCreateInput('JJJJMMDD_hhmmss', 152, 65, 318, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetBkColor(-1, 0xFEFEFE)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateLabel('Ordner', 50, 98, 60, 17)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$inPath = GUICtrlCreateInput('', 120, 95, 325, 20, $ES_READONLY)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetBkColor(-1, 0xFEFEFE)
GUICtrlSetData(-1, @ScriptDir)
$btPath = GUICtrlCreateButton('...', 450, 95, 20, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlCreateLabel('Zu codierender Text', 10, 143, 120, 17)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateLabel('Eingabelänge [ max. ' & $__QR_MAX_LEN & ' Zeichen ]:', 240, 143, 185, 17)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$inCounter = GUICtrlCreateInput($__QR_MAX_LEN, 430, 140, 40, 20, BitOR($ES_READONLY, $ES_CENTER))
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlSetBkColor(-1, 0xFEFEFE)
$editQR = GUICtrlCreateEdit('', 10, 165, 480, 150, BitOR($ES_WANTRETURN, $ES_MULTILINE, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$btRun = GUICtrlCreateButton('Start', 420, 325, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
$btDel = GUICtrlCreateButton('Löschen', 420, 365, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUISetOnEvent(-3, '_exit')
GUICtrlSetOnEvent($cbClip, '_event')
GUICtrlSetOnEvent($cbBMP, '_event')
GUICtrlSetOnEvent($cbPNG, '_event')
GUICtrlSetOnEvent($cbName, '_event')
GUICtrlSetOnEvent($btPath, '_event')
GUICtrlSetOnEvent($btRun, '_event')
GUICtrlSetOnEvent($btDel, '_event')
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While True
Sleep(50)
WEnd
Func _event()
Switch @GUI_CtrlId
Case $cbClip
$fClip = Not $fClip
Case $cbBMP
$fBMP = Not $fBMP
Case $cbPNG
$fPNG = Not $fPNG
Case $cbName
Local $iState = $GUI_DISABLE
If BitAND(GUICtrlRead($cbName), $GUI_CHECKED) Then
$iState = $GUI_ENABLE
If (Not $fBMP And Not $fPNG) Then
GUICtrlSetState($cbName, $GUI_UNCHECKED)
Return MsgBox(262160, 'Fehler', 'Bitte erst Dateityp zum Speichern auswählen!')
EndIf
EndIf
GUICtrlSetState($lbName, $iState)
GUICtrlSetState($inName, $iState)
Case $btPath
Local $sPath = FileSelectFolder('Speicherpfad für QR-Image wählen', '', 7)
If $sPath = '' Then Return
GUICtrlSetData($inPath, $sPath)
Case $btRun
$sFile = GUICtrlRead($inName)
If $sFile = "JJJJMMDD_hhmmss" Then $sFile = -1
Local $iFormat = 0
If $fBMP Then $iFormat += 1
If $fPNG Then $iFormat += 2
Local $sContent = GUICtrlRead($editQR)
If StringLen($sContent) > $__QR_MAX_LEN Then Return MsgBox(262160, 'Fehler', 'Der Inhalt überschreitet die maximal zulässige Anzahl an Zeichen!')
_Reset()
createQR($sContent, $fClip, $sFile, $iFormat)
Case $btDel
GUICtrlSetData($editQR, '')
_Reset()
_WinMove()
EndSwitch
If (Not $fBMP) And (Not $fPNG) Then
GUICtrlSetState($btPath, $GUI_DISABLE)
GUICtrlSetState($inPath, $GUI_DISABLE)
Else
GUICtrlSetState($btPath, $GUI_ENABLE)
GUICtrlSetState($inPath, $GUI_ENABLE)
EndIf
EndFunc ;==>_event
Func _Reset()
_WinAPI_RedrawWindow($hWnd)
GUICtrlSetData($inCounter, $__QR_MAX_LEN)
GUICtrlSetColor($inCounter, 0x000000)
GUICtrlSetBkColor($inCounter, 0xFEFEFE)
EndFunc ;==>_Reset
Func _exit()
Exit
EndFunc ;==>_exit
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit, $iCount, $iShow, $sFormat = '%04d'
$hWndEdit = GUICtrlGetHandle($editQR)
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $hWndFrom
Case $hWndEdit
Switch $iCode
Case $EN_CHANGE
$iCount = StringLen(GUICtrlRead($editQR))
$iShow = $__QR_MAX_LEN - $iCount
If $iShow < 0 Then
$sFormat = '%+05d'
GUICtrlSetColor($inCounter, 0xFFFFFF)
GUICtrlSetBkColor($inCounter, 0xFF0000)
ElseIf $iShow < 11 Then
GUICtrlSetColor($inCounter, 0x000000)
GUICtrlSetBkColor($inCounter, 0xFFFF00)
Else
GUICtrlSetColor($inCounter, 0x000000)
GUICtrlSetBkColor($inCounter, 0xFEFEFE)
EndIf
GUICtrlSetData($inCounter, StringFormat($sFormat, $iShow))
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
; =======================================================================================
; Title .........: QR Creator basierend auf Skript von Giovanni Rossati (El Condor) - http://www.autoitscript.com/forum/topic/14…de/#entry994116
; Description ...: Erstellen von QR-Code, wahlweise Speichern als bmp und/oder png, optional Speichern in Zwischenablage
; Parameters.....: $_sText zu codierender Text
; ......optional.: $_fClipboard Übergabe Image an Zwischenablage, Standard: "True"
; ......optional.: $_sImageName Dateiname, erhält autom. Präfix 'QR_', Standard: "-1" = "QR_JJJJMMDD_hhmmss"
; ......optional.: $_iFormat Speicheroption: 0=nicht Speichern, 1=BMP, 2=PNG (Standard), 3=BMP und PNG
; Author(s) .....: Giovanni Rossati (El Condor)
; ..modified.by..: BugFix
; =======================================================================================
Func createQR($_sText, $_fClipboard = False, $_sImageName = -1, $_iFormat = 2)
Local $return, $hBitmap, $hGraphic, $hBitmap2, $iWidth, $sPath = GUICtrlRead($inPath)
If (Not FileExists($sPath)) And $_iFormat > 0 Then Return MsgBox(262160, 'Fehler', 'Speicherordner existiert nicht!')
Local $iErr = 0, $hDll = DllOpen($sDllQR)
If $_sImageName = -1 Then
$_sImageName = '\QR_' & @YEAR & @MON & @MDAY & '_' & @HOUR & @MIN & @SEC
Else
$_sImageName = '\QR_' & $_sImageName
EndIf
If BitAND($_iFormat, 1) Then DllCall($hDll, "none", "GenerateBMP", "str", $sPath & $_sImageName & ".bmp", "str", $_sText, "int", 4, "int", 2)
If BitAND($_iFormat, 2) Then DllCall($hDll, "none", "GeneratePNG", "str", $sPath & $_sImageName & ".png", "str", $_sText, "int", 4, "int", 2)
_GDIPlus_Startup()
$return = DllCall($hDll, "HANDLE", "GetHBitmap", "str", $_sText, "int", 4, "int", 2)
$iErr = @error
DllClose($hDll)
If Not IsArray($return) Or $iErr <> 0 Then Return MsgBox(262160, 'Fehler', "Der Dll-Aufruf endete mit dem Fehler-Nr: " & $iErr & "!")
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($return[0])
$iWidth = _GDIPlus_ImageGetWidth($hBitmap)
If $iWidth > 60 Then _WinMove($iWidth)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 10, 325)
If $_fClipboard Then
If Not _ClipBoard_Open($hWnd) Then _WinAPI_ShowError("_ClipBoard_Open failed")
If Not _ClipBoard_Empty() Then _WinAPI_ShowError("_ClipBoard_Empty failed")
$hBitmap2 = _WinAPI_CopyImage(_GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap), 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG)
_ClipBoard_SetDataEx($hBitmap2, $CF_BITMAP)
_ClipBoard_Close()
EndIf
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_BitmapDispose($hBitmap)
_WinAPI_DeleteObject($return[0])
_GDIPlus_Shutdown() ; Shut down GDI+ library
Return
EndFunc ;==>createQR
Func _WinAPI_CopyImage($hImage, $iType = 0, $xDesired = 0, $yDesired = 0, $iFlags = 0); from _WinAPIEx by Yashied
Local $Ret = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hImage, 'int', $iType, 'int', $xDesired, 'int', $yDesired, 'int', $iFlags)
If (@error) Or (Not $Ret[0]) Then Return SetError(1, 0, 0)
Return $Ret[0]
EndFunc ;==>_WinAPI_CopyImage
Func _WinMove($_iDiff = -1)
Local $iHeight, $aWin = WinGetPos($hWnd)
If $_iDiff = -1 Then
$iHeight = $iH
Else
$iHeight = 305 + $_iDiff + 60
EndIf
WinMove($hWnd, '', $aWin[0], $aWin[1], $aWin[2], $iHeight)
EndFunc ;==>_WinMove
DL bisher: 63