_WinAPI_CreateBitmap
Создает bitmap заданной ширины, высоты и цветового формата
#include <WinAPI.au3>
_WinAPI_CreateBitmap($iWidth, $iHeight [, $iPlanes = 1 [, $iBitsPerPel = 1 [, $pBits = 0]]])
Параметры
$iWidth | Ширина bitmap в пикселях |
$iHeight |
Высота bitmap в пикселях |
$iPlanes |
[необязательный] Количество цветовых плоскостей используемых устройством |
$iBitsPerPel |
[необязательный] Количество битов, необходимых для задания цвета одного пикселя |
$pBits |
[необязательный] Pointer to an array of color data used to set the colors in a rectangle of pixels. Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros). If this parameter is 0, the contents of the new bitmap is undefined. |
Возвращаемое значение
Успех: | Возвращает дескриптор bitmap |
Ошибка: | Возвращает 0 |
См. также
Искать CreateBitmap в библиотеке MSDNПример
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
Global $hGui, $btnOpen, $iPic, $hBMP, $OpenFile
$hGui = GUICreate("Просмотрщик рисунков", 360, 400)
GUICtrlCreateGroup("Предпросмотр", 10, 5, 342, 351)
$iPic = GUICtrlCreatePic("", 16, 20, 330, 330)
$btnOpen = GUICtrlCreateButton("Открыть", 270, 363, 80, 30)
GUISetState()
While 1
Switch GUIGetMsg()
Case $btnOpen
$OpenFile = FileOpenDialog('Открыть', @WorkingDir, 'Рисунок (*.bmp;*.gif;*.jpeg;*.jpg;*.png;*.tif;*.tiff)', '', '', $hGui)
If @error Then ContinueLoop
$hBMP = _GetImage($OpenFile, 330, BitOR(0xFF000000, _GetGuiBkColor(_WinAPI_GetForegroundWindow())))
_hBmpToPicControl($iPic, $hBMP, 1)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _GetImage($sFile, $iWH, $iBkClr = 0xFFFFFF)
Local $hBmp1, $hBitmap, $hGraphic, $hImage, $iW, $iH, $aGS, $hBmp2
_GDIPlus_Startup()
$hBmp1 = _WinAPI_CreateBitmap($iWH, $iWH, 1, 32)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_WinAPI_DeleteObject($hBmp1)
_GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
$hImage = _GDIPlus_ImageLoadFromFile($sFile)
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)
$aGS = _GetScale($iW, $iH, $iWH)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3])
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphic)
$hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
Return $hBmp2
EndFunc ;==>_GetImage
; Подстраивает размеры для вмещения в Pic
Func _GetScale($iW, $iH, $iWH)
Local $aRet[4]
If $iW <= $iWH And $iH <= $iWH Then
$aRet[2] = $iW
$aRet[3] = $iH
$aRet[0] = ($iWH - $aRet[2]) / 2
$aRet[1] = ($iWH - $aRet[3]) / 2
ElseIf $iW > $iH Then
$aRet[2] = $iWH
$aRet[3] = $iH / ($iW / $iWH)
$aRet[0] = 0
$aRet[1] = ($iWH - $aRet[3]) / 2
ElseIf $iW < $iH Then
$aRet[2] = $iW / ($iH / $iWH)
$aRet[3] = $iWH
$aRet[0] = ($iWH - $aRet[2]) / 2
$aRet[1] = 0
ElseIf $iW = $iH Then
$aRet[2] = $iWH
$aRet[3] = $iWH
$aRet[0] = 0
$aRet[1] = 0
EndIf
Return $aRet
EndFunc ;==>_GetScale
; Устанавливает рисунок в элемент Pic
Func _hBmpToPicControl($iCtrlID, ByRef $hBMP, $iFlag = 0)
Local Const $STM_SETIMAGE = 0x0172
Local Const $IMAGE_BITMAP = 0
Local $hOldBmp = GUICtrlSendMsg($iCtrlID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
If $hOldBmp Then _WinAPI_DeleteObject($hOldBmp)
If $iFlag Then _WinAPI_DeleteObject($hBMP)
EndFunc ;==>_hBmpToPicControl
Func _GetGuiBkColor($hWnd)
Local $hDC, $aBGR
$hDC = _WinAPI_GetDC($hWnd)
$aBGR = DllCall('gdi32.dll', 'int', 'GetBkColor', 'hwnd', $hDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
Return BitOR(BitAND($aBGR[0], 0x00FF00), BitShift(BitAND($aBGR[0], 0x0000FF), -16), BitShift(BitAND($aBGR[0], 0xFF0000), 16))
EndFunc ;==>_GetGuiBkColor