powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать такой фокус с TextBox
24 сообщений из 24, страница 1 из 1
Как сделать такой фокус с TextBox
    #39114240
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы когда пусто там было написано, например, <current>, если юзер вводит - его ввод, если вытирает - снова выныривало <current>, и чтобы цвет фонта этой надписи был серый, а цвет юзерского текста - нормальный

а?
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114264
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinnipuhЧтобы когда пусто там было написано, например, <current>, если юзер вводит - его ввод, если вытирает - снова выныривало <current>, и чтобы цвет фонта этой надписи был серый, а цвет юзерского текста - нормальный

а?

в OnPaint серым цветом нарисовать слово <current> если в TextBox нет текста и он не в фокусе.

ты ни чего не пил и не курил?
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114284
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh, у меня для этих целей есть готовый класс. Сильно не тестировал, но дело вроде делает. Работает как с обычным текстом так и с паролями.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public class PlaceholderTextBox : TextBox
{
	protected override void OnHandleCreated(EventArgs e)
	{
		base.OnHandleCreated(e);
		if (!string.IsNullOrWhiteSpace(_placeholderText))
		{
			SendMessage(Handle, EM_SETCUEBANNER, 0, _placeholderText);
		}
	}

	string _placeholderText = "";
	public string PlaceholderText
	{
		get { return _placeholderText; }
		set
		{
			_placeholderText = value ?? "";
			if (IsHandleCreated && !string.IsNullOrWhiteSpace(_placeholderText))
			{
				SendMessage(Handle, EM_SETCUEBANNER, 0, _placeholderText);
			}
		}
	}

	const int EM_SETCUEBANNER = 0x1501;

	[DllImport("user32.dll", CharSet = CharSet.Auto)]
	static extern Int32 SendMessage(
		IntPtr hWnd,
		int msg,
		int wParam,
		[MarshalAs(UnmanagedType.LPWStr)]string lParam);
}

...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114346
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesWinnipuhЧтобы когда пусто там было написано, например, <current>, если юзер вводит - его ввод, если вытирает - снова выныривало <current>, и чтобы цвет фонта этой надписи был серый, а цвет юзерского текста - нормальный

а?

в OnPaint серым цветом нарисовать слово <current> если в TextBox нет текста и он не в фокусе.

ты ни чего не пил и не курил?
исключительно пиво

да это да, фигня, вопрос в том, что когда юзер вводит свое - исчезает эта умолчательная надпись и т.д.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114347
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileWinnipuh, у меня для этих целей есть готовый класс. Сильно не тестировал, но дело вроде делает. Работает как с обычным текстом так и с паролями.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public class PlaceholderTextBox : TextBox
{
	protected override void OnHandleCreated(EventArgs e)
	{
		base.OnHandleCreated(e);
		if (!string.IsNullOrWhiteSpace(_placeholderText))
		{
			SendMessage(Handle, EM_SETCUEBANNER, 0, _placeholderText);
		}
	}

	string _placeholderText = "";
	public string PlaceholderText
	{
		get { return _placeholderText; }
		set
		{
			_placeholderText = value ?? "";
			if (IsHandleCreated && !string.IsNullOrWhiteSpace(_placeholderText))
			{
				SendMessage(Handle, EM_SETCUEBANNER, 0, _placeholderText);
			}
		}
	}

	const int EM_SETCUEBANNER = 0x1501;

	[DllImport("user32.dll", CharSet = CharSet.Auto)]
	static extern Int32 SendMessage(
		IntPtr hWnd,
		int msg,
		int wParam,
		[MarshalAs(UnmanagedType.LPWStr)]string lParam);
}



спасибо, проверю
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114442
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Winnipuh,

Поверх тексбокса - полупрозрачный лэйбл
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114444
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazileWinnipuh, у меня для этих целей есть готовый класс. Сильно не тестировал, но дело вроде делает. Работает как с обычным текстом так и с паролями.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public class PlaceholderTextBox : TextBox
{
	protected override void OnHandleCreated(EventArgs e)
	{
		base.OnHandleCreated(e);
		if (!string.IsNullOrWhiteSpace(_placeholderText))
		{
			SendMessage(Handle, EM_SETCUEBANNER, 0, _placeholderText);
		}
	}

	string _placeholderText = "";
	public string PlaceholderText
	{
		get { return _placeholderText; }
		set
		{
			_placeholderText = value ?? "";
			if (IsHandleCreated && !string.IsNullOrWhiteSpace(_placeholderText))
			{
				SendMessage(Handle, EM_SETCUEBANNER, 0, _placeholderText);
			}
		}
	}

	const int EM_SETCUEBANNER = 0x1501;

	[DllImport("user32.dll", CharSet = CharSet.Auto)]
	static extern Int32 SendMessage(
		IntPtr hWnd,
		int msg,
		int wParam,
		[MarshalAs(UnmanagedType.LPWStr)]string lParam);
}




Пишем на программу на C# на C?
Что , без "user32.dll" - никак?
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114512
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Пишем на программу на C# на C?
Нет, с использованием Windows API

Cat2Что , без "user32.dll" - никак?
Так быстрее. Тебе никто не мешает написать свой вариант без p/invoke.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114576
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bazileCat2Пишем на программу на C# на C?
Нет, с использованием Windows API

Cat2Что , без "user32.dll" - никак?
Так быстрее. Тебе никто не мешает написать свой вариант без p/invoke.
Мешают рекомендации Micrоsft использовать неуправляемый код как можно реже
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114605
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Мешают рекомендации Micrоsft использовать неуправляемый код как можно реже
1. P/Invoke - это не неуправляемый код, это управляемый вызов методов WinAPI. Управляет вызовами CLR.
2. Примерчик - System.Windows.Forms.MessageBox.ShowCore :

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
        private static DialogResult ShowCore(IWin32Window owner, string text, string caption,   
                                             MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton,
                                             MessageBoxOptions options, bool showHelp) {
       
            if (!ClientUtils.IsEnumValid(buttons, (int)buttons, (int)MessageBoxButtons.OK, (int)MessageBoxButtons.RetryCancel)){
               throw new InvalidEnumArgumentException("buttons", (int)buttons, typeof(MessageBoxButtons));
            }
 
            // valid values are 0x0 0x10 0x20 0x30 0x40, chop off the last 4 bits and check that it's between 0 and 4.
            if (!WindowsFormsUtils.EnumValidator.IsEnumWithinShiftedRange(icon, /*numBitsToShift*/4, /*min*/0x0,/*max*/0x4)) {
                throw new InvalidEnumArgumentException("icon", (int)icon, typeof(MessageBoxIcon));
            }
            // valid values are 0x0 0x100, 0x200, chop off the last 8 bits and check that it's between 0 and 2.
            if (!WindowsFormsUtils.EnumValidator.IsEnumWithinShiftedRange(defaultButton, /*numBitsToShift*/8, /*min*/0x0,/*max*/0x2)) {
                throw new InvalidEnumArgumentException("defaultButton", (int)defaultButton, typeof(DialogResult));
            }
            
            // options intentionally not verified because we don't expose all the options Win32 supports.
 
            if (!SystemInformation.UserInteractive && (options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) == 0) {
                throw new InvalidOperationException(SR.GetString(SR.CantShowModalOnNonInteractive));
            }
            if (owner != null && (options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != 0) {
                throw new ArgumentException(SR.GetString(SR.CantShowMBServiceWithOwner), "options");
            }
            if (showHelp && (options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != 0) {
                throw new ArgumentException(SR.GetString(SR.CantShowMBServiceWithHelp), "options");
            }
 
            // demand if not safe known options.
            if ((options & ~(MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading)) != 0) {
                // See DDB#163043.
                IntSecurity.UnmanagedCode.Demand();
            }
 
            IntSecurity.SafeSubWindows.Demand();
 
            int style = (showHelp) ? HELP_BUTTON : 0; 
            style |= (int) buttons | (int) icon | (int) defaultButton | (int) options;
 
            IntPtr handle = IntPtr.Zero;
            if (showHelp || ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) == 0)) {
                if (owner == null) {
                    handle = UnsafeNativeMethods.GetActiveWindow();
                }
                else {
                    handle = Control.GetSafeHandle(owner);
                }
            }
 
            IntPtr userCookie = IntPtr.Zero;
 
            if (Application.UseVisualStyles) {
                // CLR4.0 or later, shell32.dll needs to be loaded explicitly.
                if (UnsafeNativeMethods.GetModuleHandle(ExternDll.Shell32) == IntPtr.Zero) {
                    if (UnsafeNativeMethods.LoadLibrary(ExternDll.Shell32) == IntPtr.Zero) {
                        int lastWin32Error = Marshal.GetLastWin32Error();
                        throw new Win32Exception(lastWin32Error, SR.GetString(SR.LoadDLLError, ExternDll.Shell32));
                    }
                }
 
                // Activate theming scope to get theming for controls at design time and when hosted in browser.
                // NOTE: If a theming context is already active, this call is very fast, so shouldn't be a perf issue.
                userCookie = >>UnsafeNativeMethods.ThemingScope.Activate();<<<
            }
 
            Application.BeginModalMessageLoop();
            DialogResult result;
            try {
                result = Win32ToDialogResult(SafeNativeMethods.MessageBox(new HandleRef(owner, handle), text, caption, style));
            }
            finally {
                Application.EndModalMessageLoop();
                UnsafeNativeMethods.ThemingScope.Deactivate(userCookie);
            }
 
            // Right after the dialog box is closed, Windows sends WM_SETFOCUS back to the previously active control 
            // but since we have disabled this thread main window the message is lost. So we have to send it again after
            // we enable the main window.
            //
            UnsafeNativeMethods.SendMessage(new HandleRef(owner, handle), NativeMethods.WM_SETFOCUS, 0, 0);
            return result;
        }



и такая картина в исходниках фреймворка встречается чуть более, чем часто.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114670
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2, на C# пишется только управляемый код. Что касается p/invoke то это один из доступных инструментов. И как любой другой инструмент он подходит или не подходит для решения задачи, упрощает реализацию или усложняет её. Исходя из этого и нужно оценивать применение, а не держаться за рекомендации Microsft как за священные тексты.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114677
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны1. P/Invoke - это не неуправляемый код, это управляемый вызов методов WinAPI. Управляет вызовами CLR.

Вот это бред...
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114687
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoid, p/invoke это механизм для взаимодействия с неуправляемым кодом, а не код. Поэтому Сон Веры Павловны прав.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114711
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Winnipuh,

Поверх тексбокса - полупрозрачный лэйбл

лайкнул!
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114713
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileMrVoid, p/invoke это механизм для взаимодействия с неуправляемым кодом, а не код. Поэтому Сон Веры Павловны прав.
А как же он его вызывает?
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114717
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoid, подозреваю что с помощью LoadLibary и GetProcAddress. Только это не имеет никакого значения т.к. p/invoke все равно остается механизмом взаимодействия с внешним миром, а не кодом.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114783
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

То есть механизм не вызывает unmanaged code?
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114786
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
автор Для упрощения взаимодействия между компонентами .NET Framework и неуправляемым программным кодом, а также для облегчения перехода от одной модели к другой среда CLR скрывает имеющиеся в этих объектных моделях различия от клиентов и серверов.

Так что можно показывать пальцем на Микрософт, что оно само WIN API использует, но готовится надо к тому, что когда-то все эти User32 будут отправлены в топку
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114788
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114825
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2но готовится надо к тому, что когда-то все эти User32 будут отправлены в топку
этот ишак сдохнет не скоро,
что не отменяет рекомендации по возможность меньше использовать в c# pinvoke
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114832
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoidТо есть механизм не вызывает unmanaged code?
Вызывает. Ведь именно для этого он и предназначен.

Cat2но готовится надо к тому, что когда-то все эти User32 будут отправлены в топку
Помоги приблизить этот момент предоставив код решающий задачу ТС.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114889
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилэтот ишак сдохнет не скоро
Ну да... Если, конечно, не учитывать, что весь этот CLR и написан на unmanaged code.
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114916
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrVoidИзопропилэтот ишак сдохнет не скоро
Ну да... Если, конечно, не учитывать, что весь этот CLR и написан на unmanaged code.
как раз с учётом этого фактора
...
Рейтинг: 0 / 0
Как сделать такой фокус с TextBox
    #39114952
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMrVoidпропущено...

Ну да... Если, конечно, не учитывать, что весь этот CLR и написан на unmanaged code.
как раз с учётом этого фактораА про CoreCLR вы, парни, слышали вообще?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сделать такой фокус с TextBox
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]