Что нового

Как задать EM_SETCUEBANNER для Edit?

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пытаюсь задать EM_SETCUEBANNER для элемента Edit, как видно в примере, ничего не получается, хотя для Input оно работает.

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

$hGUI = GUICreate('')

$iEdit = GUICtrlCreateEdit('', 10, 20, 300, 50)
GUICtrlSendMsg($iEdit, $EM_SETCUEBANNER, 0, 'Edit')

$iInput = GUICtrlCreateInput('', 10, 100, 300, 20)
GUICtrlSendMsg($iInput, $EM_SETCUEBANNER, 0, 'Input')

GUISetState()

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


:scratch:
 
A

Alofa

Гость
Я так как-то обходился (по старинке):
Код:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

Local $iInput, $iEdit
$hGUI = GUICreate('')

$iEdit = GUICtrlCreateEdit('', 10, 20, 300, 50)
;GUICtrlSendMsg($iEdit, $EM_SETCUEBANNER, 0, 'Edit')
_GuiElementSetFont($iEdit)

$iInput = GUICtrlCreateInput('', 10, 100, 300, 20)
;GUICtrlSendMsg($iInput, $EM_SETCUEBANNER, 0, 'Input')
_GuiElementSetFont($iInput)

GUICtrlCreateButton('Кнопка', 50, 150)
GUICtrlSetState(-1, $GUI_FOCUS)

GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND') ; Сообщение выполняется при клике на элементах окна
GUISetState()


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

; Изменяем параметры шрифта и надписи в $iEdit и $iInput в зависимости от их состояния.
; Функция работает в паре с _WM_COMMAND().
Func _GuiElementSetFont($iElement, $iIndex = 0)
	Local $aParam[4][2] = [['Edit Edit Edit', 'Input Input Input'], [0xA8A8A8, 0x2B2B2B], [9, 'Arial'], [$GUI_FONTITALIC, Default]]
	Local $sText = ($iElement = $iInput) ? $aParam[0][1] : $aParam[0][0]
	Local $sCtrlRead = GUICtrlRead($iElement)
	If $iIndex Then
		If $sCtrlRead And $sCtrlRead == $sText Then GUICtrlSetData($iElement, '')
	Else
		If StringRegExpReplace($sCtrlRead, '\s', '') Then Return 1
		GUICtrlSetData($iElement, $sText)
	EndIf
	GUICtrlSetColor($iElement, $aParam[1][$iIndex])
	GUICtrlSetFont($iElement, $aParam[2][0], Default, $aParam[3][$iIndex], $aParam[2][1])
EndFunc   ;==>_GuiElementSetFont

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $iID = BitAND($wParam, 0x0000FFFF)
	Switch BitShift($wParam, 16)
		Case $EN_SETFOCUS ; Получает Фокус ввода
			If $iID = $iEdit Or $iID = $iInput Then _GuiElementSetFont($iID, 1)
		Case $EN_KILLFOCUS ; Теряет Фокус ввода
			_GuiElementSetFont($iEdit)
			_GuiElementSetFont($iInput)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alofa [?]
Я так как-то так обходился (по старинке):
По старинке и у меня есть решение:

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

GUICreate('_GUICtrlEdit_SetDefault', 300, 200)

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)

$nEdit3 = GUICtrlCreateEdit('', 5, 60, 200, 100)
_GUICtrlEdit_SetDefault($nEdit3, 'Multiline Edit', 0xA5D1D1)

GUICtrlCreateInput('Just a standard input', 5, 170, 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

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

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


но хотелось бы по элегантнее, без заморочек...
 
Верх