Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Есть маленькая проблемка, я вывожу картинку на форму через GDIPlus и рисую текст на этой картинке, но при попытке изменить размер картинки с помощью функции _WinAPI_ResizeBitmap() картинка получается не корректной, то есть когда я рисую текст, то беру оригинальные размеры картинки, после того как текст напечатан на картинке, пытаюсь изменить её размер, но получается так что картинка на форме обрезана с правой стороны и с низу, то есть, изменить размер картинки нужно до того как будет печататься текст на ней, но как зделать?
Добавлено:
Всё, разобрался.
Код:
Func ___SetBitmap($iPic, $hText, $hSize, $hColor, $hFonts, $hAttrib, $sPNGFile)
Local $Width, $Hight, $hArea, $hGraphic, $hFamily, $hFont, $tLayout, $hFormat, $hBrush, $aData, $hBitmap
If Not IsHWnd($iPic) Then $iPic = GUICtrlGetHandle($iPic)
_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile($sPNGFile)
$Width = _GDIPlus_ImageGetWidth($hImage)
$Hight = _GDIPlus_ImageGetHeight($hImage)
$hArea = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $Width, $Hight, $GDIP_PXF32ARGB)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hArea)
$hFamily = _GDIPlus_FontFamilyCreate($hFonts)
$hFont = _GDIPlus_FontCreate($hFamily, $hSize, $hAttrib, 2)
$tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
$hFormat = _GDIPlus_StringFormatCreate()
$hBrush = _GDIPlus_BrushCreateSolid($hColor)
DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "ptr", $hGraphic, "int", 3)
$aData = _GDIPlus_GraphicsMeasureString($hGraphic, $hText, $hFont, $tLayout, $hFormat)
$tLayout = $aData[0]
DllStructSetData($tLayout, 1, ($Width - DllStructGetData($tLayout, 3)) / 2)
DllStructSetData($tLayout, 2, ($Hight - DllStructGetData($tLayout, 4)) / 2)
_GDIPlus_GraphicsDrawStringEx($hGraphic, $hText, $hFont, $aData[0], $hFormat, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hArea)
_SendMessage($iPic, 0x172, 0, "")
_WinAPI_DeleteObject(_SendMessage($iPic, 0x172, 0, $hBitmap))
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_FontDispose($hFont)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_ImageDispose($hArea)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
EndFunc
Добавлено:
Сообщение автоматически объединено:
Всё, разобрался.
Код:
Func ___SetBitmap($iPic, $hText, $hSize, $hColor, $hFonts, $hAttrib, $Width, $Height, $sPNGFile)
Local $hArea, $hGraphic, $hFamily, $hFont, $tLayout, $hFormat, $hBrush, $aData, $hBitmap
If Not IsHWnd($iPic) Then $iPic = GUICtrlGetHandle($iPic)
_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile($sPNGFile)
$hThumb = _GDIPlus_GetImageThumbnail($hImage, $Width, $Height)
$hArea = _GDIPlus_BitmapCloneArea($hThumb, 0, 0, $Width, $Height, $GDIP_PXF32ARGB)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hArea)
$hFamily = _GDIPlus_FontFamilyCreate($hFonts)
$hFont = _GDIPlus_FontCreate($hFamily, $hSize, $hAttrib, 2)
$tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
$hFormat = _GDIPlus_StringFormatCreate()
$hBrush = _GDIPlus_BrushCreateSolid($hColor)
DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "ptr", $hGraphic, "int", 3)
$aData = _GDIPlus_GraphicsMeasureString($hGraphic, $hText, $hFont, $tLayout, $hFormat)
$tLayout = $aData[0]
DllStructSetData($tLayout, 1, ($Width - DllStructGetData($tLayout, 3)) / 2)
DllStructSetData($tLayout, 2, ($Height - DllStructGetData($tLayout, 4)) / 2)
_GDIPlus_GraphicsDrawStringEx($hGraphic, $hText, $hFont, $aData[0], $hFormat, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hArea)
_SendMessage($iPic, 0x172, 0, "")
_WinAPI_DeleteObject(_SendMessage($iPic, 0x172, 0, $hBitmap))
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_FontDispose($hFont)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_ImageDispose($hArea)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
EndFunc
Func _GDIPlus_GetImageThumbnail($hImage, $iWidth, $iHeight)
Local $Ret = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)
If (@error) Or ($Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[4]
EndFunc ;==>_GDIPlus_GetImageThumbnail