Что нового

Способы создания собственного элемента GUICtrlCreateEdit

Arei

Скриптер
Сообщения
938
Репутация
115
Здравствуйте,скажите как создать новый вид для элемента.
Например
915368027782.jpg
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Можно посмотреть http://autoit-script.ru/index.php/topic,1267.0.html вся программа на картинках.
И глянуть в другой теме, начиная отсюда.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
В 2 теме,там обычный вывод картинок, а мне нужно элемент, с поддержкой вывода текста не 1 раз,а разного.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Arei
Готового индивидуального нету, но если оформишь в виде функции, любые формы, всё от тебя зависит:

Код:
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
GUIRegisterMsg(0x0115 , "WM_VSCROLL")
$Gui=GUICreate("",300, 300,-1,-1,$WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_CONTROLPARENT))
WinSetTrans($Gui, '', 220)
GUISetBkColor(0xf0d174)
$Button1 = GUICtrlCreateButton("", 55, 72, 75, 28)
$Button2 = GUICtrlCreateButton("", 170, 72, 75, 28, $BS_ICON)
GUICtrlSetImage (-1, "shell32.dll",-132)
$Button1 = GUICtrlCreateInput('', 95, 160, 110, 80)


$slider1 = GUICtrlCreateSlider(135, 80, 30, 70, 0x0002)
GUICtrlSetLimit(-1, 20, 1)
$hSlider_Handle1 = GUICtrlGetHandle(-1)
GUISetState()

; закруглить углы
$pos = WinGetPos($gui)
$rgn = _WinAPI_CreateRoundRectRgn(0, 0, $pos[2], $pos[3], $pos[2], $pos[3])
_WinAPI_SetWindowRgn($gui, $rgn)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $Button2
			 Exit
	EndSwitch
WEnd

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
	#forceref $Msg, $wParam, $lParam
	Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
	Local $value = BitShift($wParam, 16)
	
	Switch $lParam
		Case $hSlider_Handle1
		   ; If $nScrollCode = 5 Then
				$rgn = _WinAPI_CreateRoundRectRgn(0, 0, $pos[2], $pos[3], $pos[2]/GUICtrlRead($slider1), $pos[3]/GUICtrlRead($slider1))
				_WinAPI_SetWindowRgn($gui, $rgn)
			; EndIf
	EndSwitch
	Return 'GUI_RUNDEFMSG'
EndFunc

Код:
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
$Gui=GUICreate("",300, 300,-1,-1,$WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_CONTROLPARENT))
WinSetTrans($Gui, '', 220)
GUISetBkColor(0xf0d174)
$Button1 = GUICtrlCreateButton("", 55, 72, 75, 28)
$Button2 = GUICtrlCreateButton("", 170, 72, 75, 28, $BS_ICON)
GUICtrlSetImage (-1, "shell32.dll",-132)
$Button1 = GUICtrlCreateInput('', 95, 160, 110, 80)
GUISetState()

; закруглить углы
$pos = WinGetPos($gui)
$rgn = _WinAPI_CreateRoundRectRgn(80, 60, 230, 300, 0, 0) ; квадрат
$rgn1 = _WinAPI_CreateRoundRectRgn(0, 0, 111, 111, 111, 111) ; первый круг
_WinAPI_CombineRgn($rgn, $rgn, $rgn1, $RGN_XOR)
_WinAPI_DeleteObject($rgn1)
$rgn1 = _WinAPI_CreateRoundRectRgn(300, 0, 190, 111, 300, 300) ; второй круг
_WinAPI_CombineRgn($rgn, $rgn, $rgn1, $RGN_OR)
_WinAPI_DeleteObject($rgn1)
$rgn1 = _WinAPI_CreateRoundRectRgn(0, 191, 111, 300, 300, 300) ; третий круг
_WinAPI_CombineRgn($rgn, $rgn, $rgn1, $RGN_DIFF)
_WinAPI_DeleteObject($rgn1)
$rgn1 = _WinAPI_CreateRoundRectRgn(191, 191, 300, 300, 300, 300) ; третий круг
_WinAPI_CombineRgn($rgn, $rgn, $rgn1, $RGN_COPY)
_WinAPI_DeleteObject($rgn1)
_WinAPI_SetWindowRgn($gui, $rgn)
; RGN_AND - только пересекающаяся область

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $Button2
			 Exit
	EndSwitch
WEnd

Код:
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
GUIRegisterMsg(0x0115 , "WM_VSCROLL")
$Gui=GUICreate("",600, 600,-1,-1,$WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_CONTROLPARENT))
WinSetTrans($Gui, '', 220)
GUISetBkColor(0xf0d174)
$Button2 = GUICtrlCreateButton("", 300-22, 200-22, 20, 20, $BS_ICON)
GUICtrlSetImage (-1, "shell32.dll",-132)
Global $s1=0, $s2=0, $s3=600, $s4=600, $s5=300, $s6=300


$slider1 = GUICtrlCreateSlider(210, 200, 30, 200, 0x0002)
GUICtrlSetLimit(-1, 600, 1)
$hSlider_Handle1 = GUICtrlGetHandle(-1)

$slider2 = GUICtrlCreateSlider(240, 200, 30, 200, 0x0002)
GUICtrlSetLimit(-1, 600, 1)
$hSlider_Handle2 = GUICtrlGetHandle(-1)

$slider3 = GUICtrlCreateSlider(270, 200, 30, 200, 0x0002)
GUICtrlSetLimit(-1, 600, 1)
GUICtrlSetData(-1, 600)
$hSlider_Handle3 = GUICtrlGetHandle(-1)

$slider4 = GUICtrlCreateSlider(300, 200, 30, 200, 0x0002)
GUICtrlSetLimit(-1, 600, 1)
GUICtrlSetData(-1, 600)
$hSlider_Handle4 = GUICtrlGetHandle(-1)

$slider5 = GUICtrlCreateSlider(330, 200, 30, 200, 0x0002)
GUICtrlSetLimit(-1, 600, 1)
GUICtrlSetData(-1, 300)
$hSlider_Handle5 = GUICtrlGetHandle(-1)

$slider6 = GUICtrlCreateSlider(360, 200, 30, 200, 0x0002)
GUICtrlSetLimit(-1, 600, 1)
GUICtrlSetData(-1, 300)
$hSlider_Handle6 = GUICtrlGetHandle(-1)
GUISetState()

$rgn = _WinAPI_CreateRoundRectRgn(0, 0, 600, 600, 300, 300)
_WinAPI_SetWindowRgn($gui, $rgn)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $Button2
			 Exit
	EndSwitch
WEnd

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
	#forceref $Msg, $wParam, $lParam
	Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
	Local $value = BitShift($wParam, 16)
	
	Switch $lParam
		Case $hSlider_Handle1
			If $nScrollCode = 5 Then
				$s1=GUICtrlRead($slider1)
			EndIf
		Case $hSlider_Handle2
			If $nScrollCode = 5 Then
				$s2=GUICtrlRead($slider2)
			EndIf
		Case $hSlider_Handle3
			If $nScrollCode = 5 Then
				$s3=GUICtrlRead($slider3)
			EndIf
		Case $hSlider_Handle4
			If $nScrollCode = 5 Then
				$s4=GUICtrlRead($slider4)
			EndIf
		Case $hSlider_Handle5
			If $nScrollCode = 5 Then
				$s5=GUICtrlRead($slider5)
			EndIf
		Case $hSlider_Handle6
			If $nScrollCode = 5 Then
				$s6=GUICtrlRead($slider6)
			EndIf
	EndSwitch
	$rgn = _WinAPI_CreateRoundRectRgn($s1, $s2, $s3, $s4, $s5, $s6)
	_WinAPI_SetWindowRgn($gui, $rgn)
	Return 'GUI_RUNDEFMSG'
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Посмотрите здесь, но нужно использовать под конкретную задачу.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Если фон картинки однородный, то можно так попробовать:
Код:
#Region AutoIt3Wrapper
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_outfile=prog.exe
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, 1.png,  PNG, 100,
#AutoIt3Wrapper_Run_After=Upx.exe "%out%" --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=0 --strip-relocs=1
#EndRegion AutoIt3Wrapper

#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <WinAPIEx.au3>
#include <Icons.au3>

$hInstance = _WinAPI_GetModuleHandle(0)
_GDIPlus_Startup()
$hGUI = GUICreate('Title', 500, 400)
$hTop = GUICtrlCreatePic('', 50, 50, 400, 300)
GuiCtrlSetState(-1,$GUI_DISABLE)
_LoadResourceImage($hInstance, 'PNG', 100, $hTop)
$hEdit = GUICtrlCreateEdit('Привет, Arei!', 80, 80, 340, 240, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN), 0)
GUICtrlSetBkColor(-1, 0x398026)
GUICtrlSetFont(-1, 12, 800, 0, 'Verdana')

GUISetState()

While 1
    $hMsg = GUIGetMsg()
    Select
        Case $hMsg = $GUI_EVENT_CLOSE
            Exit
    EndSelect
WEnd


Func _LoadResourceImage($hInstance, $sResType, $sResName, $hHndl, $iResLanguage = 0)

    Local $hInfo, $hData, $pData, $iSize, $hMem, $pMem, $hStream, $hImage

    If $iResLanguage Then
        $hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
    $hData = _WinAPI_LoadResource($hInstance, $hInfo)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    $hMem = DllCall("kernel32.dll", "ptr", "GlobalAlloc", "uint", 2, "ulong_ptr", $iSize)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    $pMem = DllCall("kernel32.dll", "ptr", "GlobalLock", "ptr", $hMem[0])
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    DllCall("kernel32.dll", "none", "RtlMoveMemory", "ptr", $pMem[0], "ptr", $pData, "ulong_ptr", $iSize)
    DllCall("kernel32.dll", "int", "GlobalUnlock", "ptr", $hMem[0])
    $hStream = _WinAPI_CreateStreamOnHGlobal($hMem[0])
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    _GDIPlus_Startup()
    $hImage = DllCall("gdiplus.dll", "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "ptr*", 0)
    If (@error) Or ($hImage[0]) Or (Not $hImage[2]) Then
        $hImage = 0
    EndIf
    _GDIPlus_Shutdown()
    DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hMem[0])
    If Not IsArray($hImage) Then
        Return SetError(1, 0, 0)
    EndIf
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[2])
    _GDIPlus_ImageDispose($hImage[2])
    _SetHImage($hHndl, $hBitmap)
    _WinAPI_DeleteObject($hBitmap)
;~     Return $hImage[2]
    Return 0
EndFunc   ;==>_LoadResourceImage

_GDIPlus_Shutdown()
Картинку класть рядом со скриптом, а затем компилировать, иначе результат не увидеть.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо огромное всем, ваш Redline не работает на 7, когда скомпилирован.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Arei
А как тебе вариант встроенного браузера? Всмысле для миранды есть темы ieview окна беседы выполненные в виде html-странички и есть две темы именно с сообщениями в виде облака. Вот посмотри
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Идея отличная только понять бы, как сделать аватарки по больше.и создание новых облаков.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
AZJIO
Как я мог забыть про браузер :laugh:
Arei
Держи примерчик, сляпанный из рабочего проекта:
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <IE.au3>

$oIE = _IECreateEmbedded()

$html_path = 'about:blank'
;$html_path = @ScriptDir & '\resources\1.html'
$hGUI = GUICreate('11', 480, 640, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
$oIE_ctrl = GUICtrlCreateObj($oIE, 5, 5, 470, 600)
GUICtrlSetResizing($oIE_ctrl, $GUI_DOCKBORDERS)
$hButton1 = GUICtrlCreateButton('Post1', 100, 610, 80, 21)
$hButton2 = GUICtrlCreateButton('Post2', 300, 610, 80, 21)
$null = GUICtrlCreateDummy() ; элемент для отсылки в него блокирующих сочетаний клавиш браузера


Dim $AccelKeys[4][2] = [['{F5}', $null],['^{F5}', $null],['^n', $null],['^p', $null]] ; назначение сочетаний клавиш
GUISetAccelerators($AccelKeys, $hGUI) ; закрепить данные сочетания клавиш

_IENavigate($oIE, $html_path) ; старт браузера из локального файла
$oBody = _IETagNameGetCollection($oIE, 'body', 0) ; сбор body из HTML для дальнейшей вставки в него
_IEHeadInsertEventScript($oIE, 'document', 'oncontextmenu', 'return false') ; скрипт на запрет контекстного меню в браузере

GUISetState()

While 1
	$hMsg = GUIGetMsg()
	Select
		Case $hMsg = $GUI_EVENT_CLOSE
			Exit
		Case $hMsg = $hButton1
			_post(@ScriptDir & '\1.png')
		Case $hMsg = $hButton2
			_post(@ScriptDir & '\2.png')
	EndSelect
WEnd


Func _post($sImage)
	$s_string = '<div class="post"><div class="avatar"><img src="' & $sImage & '"></img></div><div class="msg">text text text</div></div>'

	_IEDocInsertHTML($oBody, $s_string) ; вставка блока в браузер
	_scrollToBottom($oIE) ; прокрутка
EndFunc

Func _scrollToBottom($oIE) ; прокрутка браузера в конец
	$sHeight = $oIE.document.body.scrollHeight ; высота скролинга в окне браузера
	$oIE.document.parentwindow.scrollTo(0, $sHeight) ; прокрутка
EndFunc   ;==>_scrollToBottom
К скрипту подкинь пару картинок под аватары 1.png и 2.png
Фон под сообщения можно добавлять любой через css примерно так:
Код:
.msg{
	background-image: url('back.png');
	background-repeat: no-repeat;
}
css можно вшить в стартовый html (вместо about:blank) или разместить отдельно, сам в стартовом html храню скрипты, а css отдельно, при этом можно через fileread/write менять настройки цветовых схем/шрифтов и пр. прямо из программы.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо, а облаков нет,т.к css не заполнено?и если да, то как сделать?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Arei [?]
Спасибо, а облаков нет,т.к css не заполнено?и если да, то как сделать?
Взял твое облако, сохранил его как back.png и кинул рядом со скриптом, создал файл 1.html:
Код:
$html_path = @ScriptDir & '\1.html'

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<meta http-equiv="Content-Language" content="ru,en">
</head>
<style type="text/css">
.msg{
   background-image: url('back.png');
   background-repeat: no-repeat;
   height: 166px;
   width: 551px;
   padding: 50px 150px;
}</style>
<body>
</body>
</html>
У меня IE 6, так что прозрачностью даже не пахнет :D (хаки использовать лень)
Про взаимное расположение блоков ,отступы и пр. читай на других форумах или ищи справочник Влад Мержевич. Справочник по CSS.
Если у тебя будут многострочные тексты, то скорее всего придется резать облако на три части - верх, низ и середину (середину повторять по вертикали), т.е. у блока с текстом появится деление по вертикали (у верхнего и нижнего только фон, а у среднего еще и текст).
В общем увлекательных тебе поисков! :sorcerer:
 
Верх