私はC#winformsアプリケーション(VS.NET 2008、.NET 3.5 sp 1)を開発中です。フォーム上に検索フィールドがあり、検索フィールドの横にラベルを表示するのではなく、検索フィールド自体の背景にグレーのテキストを表示したいとします(たとえば、「検索用語」など)。ユーザーが検索フィールドにテキストを入力すると、テキストが消えます。どうすればこれを達成できますか?C#winforms編集コントロールのヒントを表示
答えて
これを行うには、P/Inovke interopコードを使用する必要があります。 Win32 API SendMessage
関数とEM_SETCUEBANNER
メッセージを探します。
テキストボックスコントロールには、とAutoCompleteSourceという組み込みの機能があります。彼らはカスタムやサードパーティのコントロールに入る前に試してみる価値があるかもしれません。
このリンクのコードを試してみてください。これは、すぐにすぐに実現することは不可能なので、winformsの機能を拡張します。ソースコードも利用可能です。 Windows XP以降でのみ動作することを覚えておいてください。
http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/
私はこれが一般的に行われている方法は、お使いのヒントテキストでそれをグレーと事前入力するテキストの色を設定することだと思います。
次に、テキストフィールドのフォーカスイベントのハンドラを作成し、フォーカスが取得されて失われたときにフィールドの内容と色に基づいて変更します。ここではいくつかの擬似コードは(。申し訳ありませんが、それは完全にC#コードではありません、私は今、脳にActionScriptを持っている)だ:
TextInput myInput;
boolean showingHint = true;
myInput.text = "Search Terms";
myInput.color = 0xcccccc;
myInput.onFocusGained = function() {
if(showingHint) {
myInput.text = "";
myInput.color = 0x000000;
showingHint = false;
}
}
myInput.onFocusLost = function() {
if(!showingHint && myInput.text.length == 0) {
myInput.text = "Search Terms";
myInput.color = 0xcccccc;
showingHint = true;
}
}
は、ユーザーが手動で変更されていない場合にのみ、失われたフォーカス上のテキストを変更したい、忘れないでくださいテキスト。ヒントを表示しているかどうかを追跡するには、別のブール値を使用して、ユーザーが手動でヒントテキストを実際のコンテンツとして入力するかどうかを区別することができます。同様に、ヒントが表示されている場合にのみ、入力ボックスの内容を消去して、誤ってユーザー入力を取り除かないようにしたいとします。
リンクの代わりにコードを投稿する方が良いです。私はこれを投稿していますhere
//Copyright (c) 2008 Jason Kemp
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Text;
public static class Win32Utility
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SendMessage(IntPtr hWnd, int msg,
int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
[DllImport("user32.dll")]
private static extern bool SendMessage(IntPtr hwnd, int msg, int wParam, StringBuilder lParam);
[DllImport("user32.dll")]
private static extern bool GetComboBoxInfo(IntPtr hwnd, ref COMBOBOXINFO pcbi);
[StructLayout(LayoutKind.Sequential)]
private struct COMBOBOXINFO
{
public int cbSize;
public RECT rcItem;
public RECT rcButton;
public IntPtr stateButton;
public IntPtr hwndCombo;
public IntPtr hwndItem;
public IntPtr hwndList;
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private const int EM_SETCUEBANNER = 0x1501;
private const int EM_GETCUEBANNER = 0x1502;
public static void SetCueText(Control control, string text)
{
if (control is ComboBox)
{
COMBOBOXINFO info = GetComboBoxInfo(control);
SendMessage(info.hwndItem, EM_SETCUEBANNER, 0, text);
}
else
{
SendMessage(control.Handle, EM_SETCUEBANNER, 0, text);
}
}
private static COMBOBOXINFO GetComboBoxInfo(Control control)
{
COMBOBOXINFO info = new COMBOBOXINFO();
//a combobox is made up of three controls, a button, a list and textbox;
//we want the textbox
info.cbSize = Marshal.SizeOf(info);
GetComboBoxInfo(control.Handle, ref info);
return info;
}
public static string GetCueText(Control control)
{
StringBuilder builder = new StringBuilder();
if (control is ComboBox)
{
COMBOBOXINFO info = new COMBOBOXINFO();
//a combobox is made up of two controls, a list and textbox;
//we want the textbox
info.cbSize = Marshal.SizeOf(info);
GetComboBoxInfo(control.Handle, ref info);
SendMessage(info.hwndItem, EM_GETCUEBANNER, 0, builder);
}
else
{
SendMessage(control.Handle, EM_GETCUEBANNER, 0, builder);
}
return builder.ToString();
}
}
- 1. イメージマップ編集用のWinFormsコントロール
- 2. ヒント付き編集テキストの再表示
- 3. Programmaticaly PropertyGridアクティブコントロールの編集コントロールを表示
- 4. C#/ Winforms:検索結果のヒントを表示
- 5. C++ネイティブWin32シンプル編集コントロール
- 6. Matlab編集テキストボックス - ヒントを表示しますか?
- 7. c#/ winforms:編集可能なコントロールの例外を含むアプリケーションワイドのキーボードショートカット
- 8. SyncFusion編集コントロールの各国語文字[WinForms]
- 9. WinFormsのDataGridView編集セル
- 10. Win32の編集コントロールを強調表示します。
- 11. クロスプラットフォームのコード編集コントロール(構文の強調表示など)
- 12. Win API C++コントロール強制編集
- 13. 編集Tierprice表示
- 14. Winforms DataGridView詳細編集フォーム
- 15. 別のWinFormsコントロールを表示したり非表示にするWinFormsコントロールはありますか?
- 16. カスタム編集コントロールwin32
- 17. FormViewコントロール編集モード
- 18. ヒント付きのテキスト編集のAndroidアクセシビリティ
- 19. jQueryのバージョンと編集ツールのヒント
- 20. UITableView編集モードカスタムボタンを表示
- 21. C#でのwinformsコントロールのスクリーンショット
- 22. C#WinFormsマウスでコントロールをドラッグ
- 23. 表示編集接触
- 24. 編集コントロールの挿入/削除がカスタムUITableViewCellの編集中に表示されない
- 25. ユーザーがコンテンツを編集したときにのみTinyMCEコントロールを表示
- 26. SilverlightでHTMLコントロールの上にある編集ボックスを表示する
- 27. C#winforms mvpプレゼンターの子フォームを表示
- 28. devise編集のパスワード画面を表示
- 29. XSDを基にしたオートコンプリートによるC#コントロールの編集
- 30. XSLTでC#コントロールを表示