Что нового

Помогите изменить размеры BITMAP в Skin_UDF

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Версия Autoit:3.

Описание:Здравствуйте,сделал скиновый UDF,все картинки встроены в скрипт в виде бинарного кода,обычные кнопки ещё не успел добавить,скин называется BlackLite срисовал с темы Windows,и как сделать так чтоб в скрипте создать например кнопку
Код:
GUICtrlCreateButton("",20,30,80,20)


а в UDF'ке сделать чтоб она её заменика скином , и чтоб в скрипте выглядело так

Код:
$close = GUICtrlCreateButton("",20,30,80,20)

GUISetState()

While 1
    $Msg = GUIGetMsg()
	Switch $Msg	
		Case $GUI_EVENT_CLOSE,$close
			Exit		
    EndSwitch
WEnd


Чтоб сдесь выполнялось действие при нажатии на кнопку,вот пример:

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <AutoIt_Skin_UDF.au3>

$hForm = GUICreate("", 400, 300, -1, -1, $WS_POPUP)
_Create_Skin_Form($hForm)
_Create_button_toolbar($hForm)
_Skin_Gradient($hForm, 0x303030, 0xC0C0C0)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg    
        Case $GUI_EVENT_CLOSE
            Exit        
    EndSwitch
WEnd


И фото моего скина:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Re: Помогите или посоветуйте,что ещё добавить в UDF

Sergey2210
Посмотрите здесь.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Я это уже смотрел,здесь просто картинки вместе со скриптом лежат в одной папке,а у меня ни одной картинки нет,я их все встрою в UDF можно сделать как с кнопкой close и minimize,но как мне добится чтоб она выглядела так
Код:
$button_ok = _Skin_button(20,30,80,20)


и при нажатии на неё вот здесь срабатывала функция

Код:
While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $button_ok
            MsgBox(0, '', 'Button has ben pressed!')
    EndSwitch
WEnd


Всё дело в этом
Код:
$button_ok =
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Всё,на счёт кнопки я разобрался,только проблема есть,функция создаёт кнопку по размерам оригинальной картинки,как можно сделать чтоб размеры указывал пользователь,для примера откройте скрипт и сверните окно,далее разверните и будет ужас....

Вся проблема в UDF в функции:

Код:
Func _SetMemoryImageToCtrl($CtrlId, $Pointer, $nSize)
    Local $hData, $pData, $pStream, $pBitmap, $hBitmap
        ; use GDI+ for converting to bitmap first
    $hData = _MemGlobalAlloc($nSize,2)
    $pData = _MemGlobalLock($hData)
    _MemMoveMemory($Pointer,$pData,$nSize)
    _MemGlobalUnlock($hData)
    $pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "int",$hData, "long",1, "Int*",0)
    $pStream = $pStream[3]
    _GDIPlus_Startup()
    $pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "int*",0)
    $pBitmap = $pBitmap[2]
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
    _SetBitmapToCtrl($CtrlId, $hBitmap)
    If @error Then SetError(3, 0, 0)
    _GDIPlus_BitmapDispose($pBitmap)
    _GDIPlus_Shutdown()
    _WinAPI_DeleteObject($pStream)
    _MemGlobalFree($hData)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Помогите или посоветуйте,что ещё добавить в UDF

Размер картинки должен быть равен размеру элемента Pic.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Да,но при создании PIC,функция -
Код:
_GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)

берёт стандартные размеры картинки,при сворачивании и разворачивании окна картинка обратает размкры указанные в PIC,но как только наводим мышкой на картинку то она обретает оригинальные размеры картинки...
По этому изменять размер картинки нужно не в -
Код:
GUICtrlCreatePIC

а изменять размер самой картинки,только потом добавлять её бинарный код в скрипт,можно ли это исправить,если не,то есть ли другой вариатн создания картинки в форме из её бинарного кода?
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Как изменять размер картинки?
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

А если попробывать убрать
Код:
_GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)

и заменить чем нибудь,где есть возможность менять размеры....
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Вообщем тогда наверное придётся создавать очень много функций,где кнопки будут разного размера:

Пример:
Код:
GUICreate_Skin_Button_50x20($left,$top)
GUICreate_Skin_Button_80x20($left,$top)
GUICreate_Skin_Button_100x20($left,$top)
GUICreate_Skin_Button_120x20($left,$top)
GUICreate_Skin_Button_50x30($left,$top)
GUICreate_Skin_Button_80x30($left,$top)
GUICreate_Skin_Button_100x30($left,$top)
GUICreate_Skin_Button_120x30($left,$top)


Ну а пользователь пусть сам выбирает нужную кнопку.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Re: Помогите или посоветуйте,что ещё добавить в UDF

Ну почему все так затрудняются придумать название теме :mad:...

«Помогите или посоветуйте,что ещё добавить в UDF»
И теперь тут будем обсуждать все вопросы вокруг этой UDF... а это ведь может затронуть множество других тем!


[?]
Как изменять размер картинки?
ControlMove/GUICtrlSetPos.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Хорошо,разберусь только с изменением размеров кнопки и закрою тему,с помощью ControlMove/GUICtrlSetPos не получается,как было,так и остаётся
Просто тут картинка создаётся в форме с помощью её бинарного кода,в папке со скриптом нет никаких картинок,всё создаётся через
Код:
_GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
что затрудняет изменение размера картинки пользователем...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: Помогите или посоветуйте,что ещё добавить в UDF

Изменение размера картинки очень простая задача. С помощью GDI+ делается одной строчкой, с помощью GDI - 5 строчек. Поищи на форуме _GDIPlus_ImageGetThumbnail()...
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Всё это хорошо(_GDIPlus_ImageGetThumbnail()),ток я не пойму куда ставить функцию,сразу после GUICtrlCreatePic(),или туда где изображение создаётся из его бинарного кода,после $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Всё,понял,огромное спасибо,тему закрываю!!! :smile:
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Re: Помогите или посоветуйте,что ещё добавить в UDF

Блин,что-то не то, я поставил функцию сюда:

Код:
Func _SetMemoryImageToCtrl($CtrlId, $Pointer, $nSize)
    Local $hData, $pData, $pStream, $pBitmap, $hBitmap
        ; use GDI+ for converting to bitmap first
    $hData = _MemGlobalAlloc($nSize,2)
    $pData = _MemGlobalLock($hData)
    _MemMoveMemory($Pointer,$pData,$nSize)
    _MemGlobalUnlock($hData)
    $pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "int",$hData, "long",1, "Int*",0)
    $pStream = $pStream[3]
    _GDIPlus_Startup()
    $pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "int*",0)
    $pBitmap = $pBitmap[2]
    [b]Здесь[/b]$hThumb = _GDIPlus_ImageGetThumbnail($pBitmap,$bX,$bY)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hThumb)
    _SetBitmapToCtrl($CtrlId,$hBitmap)
    If @error Then SetError(3, 0, 0)
    [b]И здесь[/b] _GDIPlus_ImageDispose($hThumb)
    _GDIPlus_BitmapDispose($pBitmap)
    _GDIPlus_Shutdown()
    _WinAPI_DeleteObject($pStream)
    _MemGlobalFree($hData)
EndFunc


И вот что получается:


Правильно ли я всё сделал,прилогаю пример...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Re: Помогите или посоветуйте,что ещё добавить в UDF

Sergey2210
Или добавь в название темы имя обсуждаемой UDF, или мне придётся её закрыть.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Я понял в чём причина,я ставлю размеры картинки после того как она создаётся в форме,по этому когда создаётся картинка из бинарного кода,функция не видит тех размеров которые я указал и создаёт свои,как обогнать,как сделать чтоб в скрипте я писал вот здесь

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <AutoIt_Skin_UDF.au3>

$hForm = GUICreate("", 400, 300, -1, -1, $WS_POPUP)
_Create_Skin_Form($hForm)
_Create_button_close_toolbar(50,1,20,20) <-- Два последних размера

GUISetState()

While 1
    $Msg = GUIGetMsg()
	Switch $Msg	
		Case $GUI_EVENT_CLOSE
			Exit		
    EndSwitch
WEnd


и в функции они считывались перед тем как создастся картинка

Код:
Func _SetMemoryImageToCtrl($CtrlId, $Pointer, $nSize)
    Local $hData, $pData, $pStream, $pBitmap, $hBitmap
        ; use GDI+ for converting to bitmap first
    $hData = _MemGlobalAlloc($nSize,2)
    $pData = _MemGlobalLock($hData)
    _MemMoveMemory($Pointer,$pData,$nSize)
    _MemGlobalUnlock($hData)
    $pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "int",$hData, "long",1, "Int*",0)
    $pStream = $pStream[3]
    _GDIPlus_Startup()
    $pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "int*",0)
    $pBitmap = $pBitmap[2]
	$hThumb = _GDIPlus_ImageGetThumbnail($pBitmap,$bX,$bY) <-- Вот здесь
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hThumb)
    _SetBitmapToCtrl($CtrlId,$hBitmap)
    If @error Then SetError(3, 0, 0)
	_GDIPlus_ImageDispose($hThumb)
    _GDIPlus_BitmapDispose($pBitmap)
    _GDIPlus_Shutdown()
    _WinAPI_DeleteObject($pStream)
    _MemGlobalFree($hData)
EndFunc
 
Верх