Margem em Textbox de Windows Form
Tem como se colocar margem em Textbox de Windows Form, C# ?
Procurei na net não encontrei nada que funcionasse...
Procurei na net não encontrei nada que funcionasse...
Jair Souza
Curtidas 0
Respostas
Pjava
20/10/2014
Veja se isso te ajuda.
https://social.msdn.microsoft.com/Forums/vstudio/pt-BR/58e5cf7b-6ce5-4b7e-a4bd-62ccba1c79ee/margem-interna-do-textbox?forum=vscsharppt
https://social.msdn.microsoft.com/Forums/vstudio/pt-BR/58e5cf7b-6ce5-4b7e-a4bd-62ccba1c79ee/margem-interna-do-textbox?forum=vscsharppt
GOSTEI 0
Jair Souza
20/10/2014
Já tinha visto este, até criei um novo projeto windows form com um textbox e adicionei este código, mas não aconteceu nada.
Mas não sei se teria que colocar em algum evento do textbox....???
Mas não sei se teria que colocar em algum evento do textbox....???
GOSTEI 0
Pjava
20/10/2014
Como falei, você deve tratar isso num evento, pois os eventos são as ações dos componentes.
GOSTEI 0
Jair Souza
20/10/2014
Este é o código e Como devo chamá-lo no evento Enter...?
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
Joel Rodrigues
20/10/2014
Cara, qual é sua real necessidade? Porque sinceramente nunca vi ninguém precisar disso.
GOSTEI 0
Pjava
20/10/2014
Ás vezes é só para conhecimento mesmo, Joel, já passei por isso, buscando algo que, na minha realidade não dava, apenas para conhecer.
GOSTEI 0
Jair Souza
20/10/2014
Ás vezes é só para conhecimento mesmo, Joel, já passei por isso, buscando algo que, na minha realidade não dava, apenas para conhecer.
Como PJAVA comentou é para aprendizado, mas também não gosto do texto começar coladinho na borda do textbox.
GOSTEI 0
Joel Rodrigues
20/10/2014
Ah, entendi. Nesse caso não é margin, e sim padding. Margin é da borda pra fora. Padding é da borda pra dentro.
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.
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
Jair Souza
20/10/2014
Não sei nada de WPF, mas pelo que já ouvi falar é o ideal para várias customizações.
Para usar WPF, tem de ser desde o inicio do projeto ?
Tem como migrar um projeto existente para usar WPF ?
Para usar WPF, tem de ser desde o inicio do projeto ?
Tem como migrar um projeto existente para usar WPF ?
GOSTEI 0
Joel Rodrigues
20/10/2014
Sim, tem de criar um novo projeto. Não tem como "converter" um projeto, por exemplo.
GOSTEI 0
Jair Souza
20/10/2014
Então vou criar um novo e vamos aprender mais. Valeu !
GOSTEI 0
Joel Rodrigues
20/10/2014
Opa, isso aí. Bons estudos!
GOSTEI 0