Что нового

GUICtrlCreateInput с исчесзающим текстом при нажатии

Centrinar

Новичок
Сообщения
100
Репутация
1
Во многих программах используется GUICtrlCreateInput (особенно при заполнении различных анкет) в котором поле заполнено сероватым текстом и при нажатии на GUICtrlCreateInput этот текст исчезает. Как реализовать? :IL_AutoIt_1:
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Можно и проще наверное, но я пока сделал так

Код:
#include <GUIConstantsEx.au3>

$hGUI= GUICreate("Тест", 350, 180)
$Input = GUICtrlCreateInput ("Example text", 10,10,150,20)
GUICtrlSetColor($Input, 0xA0A0A0)
GUICtrlSetState($Input, $GUI_DISABLE)
GUISetState()

AdlibRegister('_Cursor', 100)

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

Func _Cursor()
       Local $aCursor = GUIGetCursorInfo()
    If IsArray($aCursor) Then
        Switch $aCursor[4]
			Case $Input
				GUICtrlSetData($Input, "")
				GUICtrlSetColor($Input, 0x000000)
				GUICtrlSetState($Input, $GUI_ENABLE)
				AdlibUnRegister('_Cursor')
		EndSwitch
    EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Centrinar,
Можно так попробовать.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput = GUICtrlCreateInput('Example text text text text text', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nLabel = GUICtrlCreateLabel('', 0, 0, 1, 1)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	$aCursor = GUIGetCursorInfo()
	If Not @error Then
		If $aCursor[4] = $nInput And $aCursor[2] Then
			GUICtrlSetState($nLabel, $GUI_FOCUS)
			For $i = 0x505050 To 0xFFFFFF Step 0x010101
				GUICtrlSetColor($nInput, $i)
				Sleep(10)
			Next
			GUICtrlSetData($nInput, '')
			GUICtrlSetColor($nInput, 0x505050)
		EndIf
	EndIf
WEnd
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Можно так попробовать
Забыл вернуть тексту черный цвет, а-то как то белым по белому писать не очень ;)
Возможно еще стоит это действие с очисткой Inputа выполнять один раз а не каждый раз когда кликаеш по Inputу
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
С возвращением первоначального текста если в INPUT ничего не ввели

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput = GUICtrlCreateInput('Example text text text text text', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nLabel = GUICtrlCreateLabel('', 0, 0, 1, 1)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    $aCursor = GUIGetCursorInfo()
    If Not @error Then
        If $aCursor[4] = $nInput And $aCursor[2] Then
            GUICtrlSetState($nLabel, $GUI_FOCUS)
            For $i = 0x505050 To 0xFFFFFF Step 0x010101
                GUICtrlSetColor($nInput, $i)
                Sleep(10)
            Next
			GUICtrlSetColor($nInput, 0x000000)
            GUICtrlSetData($nInput, '')
        EndIf
    EndIf

	If Not @error Then
		If Not $aCursor[4] = $nInput  And $aCursor[2] Then
			$Read = GUICtrlRead($nInput)
			If $Read = "" Then
                GUICtrlSetColor($nInput, 0x505050)
                GUICtrlSetData($nInput, 'Example text text text text text')
            EndIf				
        EndIf	
	EndIf

WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
Почему Вы не проверяете свой код прежде чем его публиковать?
С возвратом текста можно попробовать так.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$fShow = True

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput = GUICtrlCreateInput('Example text text text text text', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nLabel = GUICtrlCreateLabel('', 0, 0, 1, 1)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	$aCursor = GUIGetCursorInfo()
	If Not @error Then
		If $aCursor[4] = $nInput And $aCursor[2] Then
			If $fShow Then
				GUICtrlSetState($nLabel, $GUI_FOCUS)
				For $i = 0x505050 To 0xFFFFFF Step 0x010101
					GUICtrlSetColor($nInput, $i)
					Sleep(10)
				Next
				GUICtrlSetData($nInput, '')
				GUICtrlSetColor($nInput, 0x505050)
				$fShow = False
			Else
				If GUICtrlRead($nInput) == '' Then
					GUICtrlSetState($nLabel, $GUI_FOCUS)
					GUICtrlSetData($nInput, 'Example text text text text text')
					GUICtrlSetColor($nInput, 0xFFFFFF)
					For $i = 0xFFFFFF To 0x505050 Step -1 * 0x010101
						GUICtrlSetColor($nInput, $i)
						Sleep(10)
					Next
				EndIf
				$fShow = True
			EndIf
		EndIf
	EndIf
WEnd
 
Автор
C

Centrinar

Новичок
Сообщения
100
Репутация
1
А почему скрипт так медленно убирает исходный текст? Ставил Sleep 1 , вообще глючит
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
madmasles, в таком виде он у меня почему то не работал, эффект с якобы исчезновением текста конечно красив, но врядли пользователям захочется ждать пока он изчезнет, а так получилось супер! ;)

Centrinar, вот без задержки

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput = GUICtrlCreateInput('Ваш E-mail', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nLabel = GUICtrlCreateLabel('', 0, 0, 1, 1)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    $aCursor = GUIGetCursorInfo()
    If Not @error Then
        If $aCursor[4] = $nInput And $aCursor[2] Then
            GUICtrlSetData($nInput, '')
            GUICtrlSetColor($nInput, 0x000000)
        EndIf
	EndIf
	If Not @error Then
	    If Not $aCursor[4] = $nInput And $aCursor[2] Then
            If GUICtrlRead($nInput) = "" Then
                GUICtrlSetColor($nInput, 0x505050)
                GUICtrlSetData($nInput, 'Ваш E-mail')
            EndIf               
        EndIf
    EndIf	
WEnd
 
Автор
C

Centrinar

Новичок
Сообщения
100
Репутация
1
А как сделать что бы не было ожидания? :IL_AutoIt_1:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

GUICreate("_GUICtrlEdit_SetDefault")

Global $EDIT_DEF_ITEMS[1][2] = [[0, 0]]

$nEdit1 = GUICtrlCreateInput("", 5, 5, 100, 20)
_GUICtrlEdit_SetDefault($nEdit1, "This is the test", 0xFFC1C1, 0x0000FF)

$nEdit2 = GUICtrlCreateInput("", 5, 30, 100, 20)
_GUICtrlEdit_SetDefault($nEdit2, "Take 2.", 0x989898)

GUICtrlCreateInput("Just a standard input", 5, 55, 200, 20)
GUICtrlSetState(-1, $GUI_FOCUS)

GUISetState()

While GUIGetMsg() <> -3
WEnd

Func _GUICtrlEdit_SetDefault($hEdit, $sDefText, $nDefColor = 0x989898, $nTextColor = 0x000000)
	If $hEdit = 0 Then
		Return SetError(1, 0, 0)
	EndIf
	
	If $EDIT_DEF_ITEMS[0][0] = 0 Then
		GUIRegisterMsg($WM_COMMAND, "__EDIT_DEF_WM_COMMAND")
	EndIf
	
	If GUICtrlRead($hEdit) = "" Then
		GUICtrlSetColor($hEdit, $nDefColor)
		GUICtrlSetData($hEdit, $sDefText)
	EndIf
	
	$EDIT_DEF_ITEMS[0][0] += 1
	ReDim $EDIT_DEF_ITEMS[$EDIT_DEF_ITEMS[0][0] + 1][4]
	
	$EDIT_DEF_ITEMS[$EDIT_DEF_ITEMS[0][0]][0] = $hEdit
	$EDIT_DEF_ITEMS[$EDIT_DEF_ITEMS[0][0]][1] = $sDefText
	$EDIT_DEF_ITEMS[$EDIT_DEF_ITEMS[0][0]][2] = $nDefColor
	$EDIT_DEF_ITEMS[$EDIT_DEF_ITEMS[0][0]][3] = $nTextColor
	
	Return 1
EndFunc   ;==>_GUICtrlEdit_SetDefault

Func __EDIT_DEF_WM_COMMAND($hWnd, $msgID, $wParam, $lParam)
	Local $n = __EDIT_DEF_GETINDEX(BitAND($wParam, 0xFFFF))
	
	If $n = -1 Then
		Return $GUI_RUNDEFMSG
	EndIf
	
	Local $nMsg = BitShift($wParam, 16)
	
	If $nMsg = $EN_SETFOCUS Then ; Gained focus (EN_SETFOCUS)
		If (GUICtrlRead($EDIT_DEF_ITEMS[$n][0]) == $EDIT_DEF_ITEMS[$n][1]) Then
			GUICtrlSetColor($EDIT_DEF_ITEMS[$n][0], $EDIT_DEF_ITEMS[$n][3])
			GUICtrlSetData($EDIT_DEF_ITEMS[$n][0], "")
		EndIf
	ElseIf $nMsg = $EN_KILLFOCUS Then ; Lost Focus (EN_KILLFOCUS)
		If GUICtrlRead($EDIT_DEF_ITEMS[$n][0]) = "" Then
			GUICtrlSetColor($EDIT_DEF_ITEMS[$n][0], $EDIT_DEF_ITEMS[$n][2])
			GUICtrlSetData($EDIT_DEF_ITEMS[$n][0], $EDIT_DEF_ITEMS[$n][1])
		EndIf
	EndIf
EndFunc   ;==>__EDIT_DEF_WM_COMMAND

Func __EDIT_DEF_GETINDEX($hEdit)
	For $i = 1 To UBound($EDIT_DEF_ITEMS) - 1
		If $EDIT_DEF_ITEMS[$i][0] = $hEdit Then
			Return $i
		EndIf
	Next
	
	Return -1
EndFunc   ;==>__EDIT_DEF_GETINDEX
 
Верх