Array
(
)

Margem em Textbox de Windows Form

Jair Souza
   - 20 out 2014

Tem como se colocar margem em Textbox de Windows Form, C# ?
Procurei na net não encontrei nada que funcionasse...

Pjava
   - 20 out 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

0
|
0

Jair Souza
   - 20 out 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....???

0
|
0

Pjava
   - 20 out 2014

Como falei, você deve tratar isso num evento, pois os eventos são as ações dos componentes.

0
|
0

Jair Souza
   - 20 out 2014

Este é o código e Como devo chamá-lo no evento Enter...?

#Códigousing 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;
}
}
}

0
|
0

Joel Rodrigues
   - 20 out 2014

Cara, qual é sua real necessidade? Porque sinceramente nunca vi ninguém precisar disso.

0
|
0

Pjava
   - 20 out 2014

Ás vezes é só para conhecimento mesmo, Joel, já passei por isso, buscando algo que, na minha realidade não dava, apenas para conhecer.

0
|
0

Jair Souza
   - 21 out 2014


Citação:
Á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.

0
|
0

Joel Rodrigues
   - 21 out 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.

0
|
0

Jair Souza
   - 21 out 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 ?

0
|
0

Joel Rodrigues
   - 22 out 2014

Sim, tem de criar um novo projeto. Não tem como "converter" um projeto, por exemplo.

0
|
0

Jair Souza
   - 22 out 2014

Então vou criar um novo e vamos aprender mais. Valeu !

0
|
0

Joel Rodrigues
   - 22 out 2014

Opa, isso aí. Bons estudos!

0
|
0