Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Button inside a WinForms textbox

Tags:

c#

.net

winforms

Do WinForms textboxes have any properties that make an embedded button, at the end of the box, possible?

Something like the favorites button on the Chrome address box:

enter image description here

I've also seen something like the following in some Excel forms:

enter image description here


EDIT

I've followed Hans Passant's answer with the addition of a click event handler and it seem to work ok:

protected override void OnLoad(EventArgs e) {     var btn = new Button();     btn.Size = new Size(25, textBoxFolder.ClientSize.Height + 2);     btn.Location = new Point(textBoxFolder.ClientSize.Width - btn.Width, -1);     btn.Cursor = Cursors.Default;     btn.Image = Properties.Resources.arrow_diagright;     btn.Click += btn_Click;          textBoxFolder.Controls.Add(btn);     // Send EM_SETMARGINS to prevent text from disappearing underneath the button     SendMessage(textBoxFolder.Handle, 0xd3, (IntPtr)2, (IntPtr)(btn.Width << 16));     base.OnLoad(e); }  [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);  private void btn_Click(object sender, EventArgs e) {     MessageBox.Show("hello world"); } 
like image 505
whytheq Avatar asked Apr 07 '13 22:04

whytheq


1 Answers

Getting the button inside the TextBox just requires adding it to the box' Controls collection. You'll also need to do something reasonable to prevent the text inside the box disappearing underneath the button; that requires a wee bit of pinvoke. Like this:

    protected override void OnLoad(EventArgs e) {         var btn = new Button();         btn.Size = new Size(25, textBox1.ClientSize.Height + 2);         btn.Location = new Point(textBox1.ClientSize.Width - btn.Width, -1);         btn.Cursor = Cursors.Default;         btn.Image = Properties.Resources.star;         textBox1.Controls.Add(btn);         // Send EM_SETMARGINS to prevent text from disappearing underneath the button         SendMessage(textBox1.Handle, 0xd3, (IntPtr)2, (IntPtr)(btn.Width << 16));         base.OnLoad(e);       }      [System.Runtime.InteropServices.DllImport("user32.dll")]     private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 

Looked like this while I tested the right margin (should have picked a prettier bitmap):

enter image description here

like image 200
Hans Passant Avatar answered Sep 21 '22 08:09

Hans Passant