Margem em Textbox de Windows Form
20/10/2014
0
Procurei na net não encontrei nada que funcionasse...
Jair Souza
Posts
20/10/2014
Pjava
https://social.msdn.microsoft.com/Forums/vstudio/pt-BR/58e5cf7b-6ce5-4b7e-a4bd-62ccba1c79ee/margem-interna-do-textbox?forum=vscsharppt
20/10/2014
Jair Souza
Mas não sei se teria que colocar em algum evento do textbox....???
20/10/2014
Pjava
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; } } }
20/10/2014
Joel Rodrigues
20/10/2014
Pjava
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.
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.
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 ?
22/10/2014
Joel Rodrigues
Clique aqui para fazer login e interagir na Comunidade :)