Margem em Textbox de Windows Form

20/10/2014

0

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

Jair Souza

Responder

Posts

20/10/2014

Pjava

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
Responder

20/10/2014

Jair Souza

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....???
Responder

20/10/2014

Pjava

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

20/10/2014

Jair Souza

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;
        }
    }
}
Responder

20/10/2014

Joel Rodrigues

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

20/10/2014

Pjava

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

21/10/2014

Jair Souza

Á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.
Responder

21/10/2014

Joel Rodrigues

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.
Responder

21/10/2014

Jair Souza

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 ?
Responder

22/10/2014

Joel Rodrigues

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

22/10/2014

Jair Souza

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

22/10/2014

Joel Rodrigues

Opa, isso aí. Bons estudos!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar