Fórum Margem em Textbox de Windows Form #498380
20/10/2014
0
Procurei na net não encontrei nada que funcionasse...
Jair Souza
Curtir tópico
+ 0Posts
20/10/2014
Pjava
https://social.msdn.microsoft.com/Forums/vstudio/pt-BR/58e5cf7b-6ce5-4b7e-a4bd-62ccba1c79ee/margem-interna-do-textbox?forum=vscsharppt
Gostei + 0
20/10/2014
Jair Souza
Mas não sei se teria que colocar em algum evento do textbox....???
Gostei + 0
20/10/2014
Pjava
Gostei + 0
20/10/2014
Jair Souza
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public sealed class NativeMethods
{
public static readonly IntPtr TRUE = new IntPtr(1);
public static readonly IntPtr FALSE = new IntPtr(0);
public enum WindowsMessages : int
{
WM_NCCALCSIZE = 0x0083,
WM_NCPAINT = 0x0085
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left, top, right, bottom;
public RECT(int left, int top, int right, int bottom)
{
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}
}
public sealed class User32
{
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
}
}
public class TextBoxEx : TextBox
{
protected virtual void OnNcCalcSize(ref Message m)
{
if (m.WParam == NativeMethods.FALSE)
{
NativeMethods.RECT rect = (NativeMethods.RECT) m.GetLParam(typeof(NativeMethods.RECT));
// Ajusta o espaçamento à esquerda em 15px.
rect.left += 15;
Marshal.StructureToPtr(rect, m.LParam, false);
}
base.WndProc(ref m);
}
protected virtual void OnNcPaint(ref Message m)
{
// Preenche a cor de fundo do controle.
using (Graphics g = this.CreateNcGraphics())
{
g.Clear(base.BackColor);
}
base.WndProc(ref m);
}
protected virtual Graphics CreateNcGraphics()
{
// Cria um objeto Graphics que permite desenhar na non-client area do controle.
IntPtr hDc = NativeMethods.User32.GetWindowDC(base.Handle);
if (hDc != IntPtr.Zero)
return Graphics.FromHdcInternal(hDc);
return null;
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case (int) NativeMethods.WindowsMessages.WM_NCCALCSIZE:
{
this.OnNcCalcSize(ref m);
break;
}
case (int) NativeMethods.WindowsMessages.WM_NCPAINT:
{
this.OnNcPaint(ref m);
break;
}
default:
base.WndProc(ref m);
break;
}
}
}
Gostei + 0
20/10/2014
Joel Rodrigues
Gostei + 0
20/10/2014
Pjava
Gostei + 0
21/10/2014
Jair Souza
Como PJAVA comentou é para aprendizado, mas também não gosto do texto começar coladinho na borda do textbox.
Gostei + 0
21/10/2014
Joel Rodrigues
Nativamente não é possível, infelizmente. Existem "adaptações" para chegar a esse resultado, mas eu não acho nenhuma viável:
1) Uma é colocar um panel branco (ou da cor do TextBox) e o TextBox dentro dele, sem borda, assim daria a impressão de que você tem um TextBox só e o texto ficaria mais "pra dentro". Mas pense só: fazer isso para todos os TextBoxes do seu projeto... sei não, hein.
2) Outra forma é criar um UserControl usando a técnica acima e passara utilizá-lo no lugar dos TextBoxes (também não acho viável).
3) Outra forma é você colocar espaços em branco no início do texto do TextBox para dar impressão que tem um padding (muito fácil de dar erro e só faria o padding na esquerda.
QUANDO um dia eu precisei disso, usei a primeira forma, mas foram só 2 TextBoxes. Quando percebo que precisarei de customizações visuais complexas em todo o projeto, já vou pro WPF.
Um abraço.
Gostei + 0
21/10/2014
Jair Souza
Para usar WPF, tem de ser desde o inicio do projeto ?
Tem como migrar um projeto existente para usar WPF ?
Gostei + 0
22/10/2014
Joel Rodrigues
Gostei + 0
22/10/2014
Jair Souza
Gostei + 0
22/10/2014
Joel Rodrigues
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)