Фантомный заголовок по умолчанию в текстовом поле VB6

#vb6

#vb6

Вопрос:

Как я могу это сделать в VB6.0…

В текстовом поле есть заголовок по умолчанию, когда он пуст, скажем «Введите имя здесь». но когда пользователь заполнит его, заголовок будет заменен…

Комментарии:

1. Он имеет в виду подзаголовок или заполнитель.

Ответ №1:

В Windows API были встроены баннеры-подсказки (или текст приглашения) начиная с Windows XP. Он не предоставляется VB 6 напрямую, но это не мешает вам добраться до него, выполнив несколько вызовов API.

Этот путь имеет несколько преимуществ по сравнению с реализацией вашего собственного стиля. Во-первых, он уже доступен бесплатно, а это значит, что вам придется проделать совсем немного работы, чтобы его использовать. Во-вторых, он уже полностью протестирован и профессионально отшлифован. В-третьих, он будет автоматически обновляться при выходе следующей версии Windows.

Весь необходимый код доступен здесь: SendMessage: используйте баннеры Cue для приглашения пользователей

Как объясняется на странице, вам необходимо убедиться, что вы включили манифест в свой EXE-файл, чтобы вы могли воспользоваться темами и функциями Windows XP. Единственная реальная сложность в коде заключается в том, что вам нужно убедиться, что вы передаете строку в Юникоде.

Конечный эффект выглядит примерно так:

   Пример баннера Cue

Ответ №2:

если вы хотите, чтобы в текстовом поле сохранялось значение по умолчанию до тех пор, пока пользователь не выберет это поле для начала ввода:

используйте событие GotFocus() для вашего текстового поля и вставьте следующее в качестве вашего кода: txtName.text = ""

в событии LostFocus() используется:

 If txtName.text = "" Then
txtName.text = "Enter Name Here"
End If
  

Ответ №3:

 Private Sub Text1_Change()  
If Trim(Text1.Text) = "" Then
Label1.Caption = "Enter Name Here"
Else
Label1.Caption = ""
End If
End Sub

Private Sub Text1_Click()
Label1.Caption = "Enter Name Here"
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If Trim(Text1.Text) = "" Then
 Label1.Caption = "Enter Name Here"
Else
 Label1.Caption = ""
 End If
End Sub
  

Комментарии:

1. @Sourav: Пожалуйста, не выпрашивайте голоса в комментариях. Прошло 3 минуты; в любом случае, никто не сможет принять ваш ответ так быстро.

2. Я сожалею об этом. Я просмотрел ваши недавние вопросы, но ни один из них не касается того, о чем я что-либо знаю. В противном случае я был бы рад помочь. Однако я не уверен, какое это имеет отношение к получению положительных голосов…

3. Я не понимаю, почему этот ответ был принят. Он отображает заголовок на элементе управления label , а не в самом текстовом поле. Все другие решения кажутся гораздо более подходящими и соответствуют тому, что искал пользователь. Если вы собираетесь использовать отдельный элемент управления label для отображения текста приглашения, непонятно, почему вы не можете постоянно просто отображать текст label. Единственная причина, по которой вам нужно было бы скрыть его, заключалась бы в том, что он действительно отображался в текстовом поле и его нужно было убрать с дороги, когда пользователь начал вводить текст.

4. текстовое поле может не иметь заголовка в VB 6.0, но метка есть !

5. Да, это возможно. Свойство вызывается Text , оно есть у каждого TextBox элемента управления. Он получает / устанавливает то, что отображается в самом текстовом поле. Вы не предоставили ответ на заданный вопрос ( «В текстовом поле есть заголовок по умолчанию, когда он пуст, скажем «Введите имя здесь». но когда пользователь заполнит текст, заголовок будет заменен …» ). Уму непостижимо, как это было приемлемо для спрашивающего.

Ответ №4:

Встроенная альтернатива win32:

 Private Const ECM_FIRST As Long = amp;H1500
Private Const EM_SETCUEBANNER As Long = (ECM_FIRST   1)

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function InitCommonControls Lib "comctl32" () As Long

Private Sub Form_Initialize()
    InitCommonControls
End Sub

Private Sub Form_Load()
    Dim sCueCaption As String
    sCueCaption = StrConv("Enter Name Here", vbUnicode)
    Call SendMessage(Text1.hwnd, EM_SETCUEBANNER, 0amp;, ByVal sCueCaption)
End Sub
  

Для этого нужен манифест, поэтому следующее сохраняется как « <exename>.exe.manifest » (также может использовать ресурс)

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
   xmlns="urn:schemas-microsoft-com:asm.v1"
   manifestVersion="1.0">
   <assemblyIdentity
      type="win32"
      processorArchitecture="*"
      version="6.0.0.0"
      name="test"
   />
   <description>Enter your Description Here</description>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            language="*"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
         />
      </dependentAssembly>
   </dependency>
</assembly>
  

Комментарии:

1. Form_Initialize часто слишком поздно для вызова initcommon CONTROLS, вместо этого делайте это в Sub Main. Также вы обнаружите, что даже это иногда дает сбой, если вы не загружаете Shell32.dll перед вызовом initcommon CONTROLS. Чтобы избежать синдрома «работает на моей машине», выполните оба этих действия в правильной последовательности перед загрузкой любых форм. Для его загрузки достаточно вызова IsUserAnAdmin в Shell32, вам не нужна LoadLibrary.

2. Зачем вообще вызывать InitCommonControls ? Функция устарела и была заменена на InitCommonControlsEx . Последний доступен по крайней мере еще в Windows 2000 и обеспечивает гораздо большую гибкость в регистрируемых вами классах управления. В первом из них регистрируются только классы Windows 95. Подробности см. в документации .

3. @Bob: LoadLibrary предотвращает сбой при завершении работы приложения, если среда выполнения VB выгружает shell32 слишком рано. Он работает путем блокировки библиотеки dll в пространстве процесса до полного завершения процесса.

4. @wqw: Я никогда не слышал о такой вещи. Что может привести к тому, что среда выполнения VB выгружается shell32.dll слишком рано? Это может применяться только в том случае, если вы создаете подкласс. Здесь дело не в этом, нет никаких шансов, что DLL будет выгружена слишком рано. (И есть лучшие способы создания подкласса. LoadLibrary это не ответ.)