2011-01-31 8 views
6

Estoy cambiar el tamaño de mi control personalizado mediante el siguiente código:¿Cómo puedo cambiar el tamaño de un control personalizado que he construido

private void Form1_Resize_1(object sender, EventArgs e) 
{ 

    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

    canvas21.Invalidate(); 

} 

sólo quiero la esquina superior izquierda del control personalizado (0, 105) a Permanezca en su lugar, y el control para cambiar el tamaño junto con el formulario, pero por alguna razón esto no funciona. Cuando cambio el tamaño, el control permanece en su lugar, pero cambia de tamaño automáticamente para completar el resto del formulario.

Overview of form layout

¿Hay alguna manera de obtener una lista de todo lo que afecta el tamaño de un control de usuario. ¿Para buscar otros lugares del tamaño que establecí, que podría haber pasado por alto?

+1

¿Ya ha investigado las propiedades 'Dock' y' Anchor'? Usar uno o ambos es * mucho * más fácil que implementar manualmente la lógica de cambio de tamaño en el evento 'Resize' como tuvimos que hacer durante años antes. –

+0

@Cody - He intentado ambos, pero no puedo obtener el resultado que quiero. Ver mi respuesta a ho1. – Bildsoe

+0

Bastante confuso lo que se está preguntando. El fragmento de código definitivamente es incorrecto, debe usar ClientSize y restar los valores de propiedad Izquierda y Superior del control. –

Respuesta

6

Si desea que su control cambie de tamaño siempre con el formulario, puede usar la propiedad Anchor para establecer que esté anclado a una o más caras del formulario para que no tenga que tener su propio código de cambio de tamaño (suponiendo que la funcionalidad estándar de cambio de tamaño que obtiene con esto se adapta a sus necesidades).

Debe asegurarse de que la propiedad Dock no esté configurada; de lo contrario, podría completar todo el formulario (o un lado del formulario según la configuración).

+0

He intentado usar la propiedad Anchor, pero todavía rellena el resto del formulario en la parte inferior y a la derecha. Tengo un tabControl en la parte superior, un control personalizado debajo y una etiqueta debajo del control personalizado. Quiero que el control personalizado complete el formulario excepto 15 píxeles en la parte inferior. – Bildsoe

+0

@bildsoe: ¿Así que se ha asegurado de que la propiedad 'Dock' no esté configurada? –

+0

@bildsoe: Solo para aclarar, la propiedad 'Dock' anulará la propiedad' Anchor'. Si eso no está establecido en las propiedades, haré una búsqueda del código para asegurarme de que no está siendo configurado en otro lugar y también sugeriría una búsqueda a través del código para cualquier instancia de donde establezca alguna propiedad de ese control (incluido dentro del control mismo!) para ver si configura las propiedades 'Dock' o' Size' en algún lugar de ellos que podría ser el motivo. –

2

Usar la propiedad Anchor es la mejor manera de hacerlo si puede configurarlo. Los que bloquean son

left, top, right, bottom (all!) 

ancla mantiene a controlar x unidades forman el lado que se ha bloqueado, por lo que siempre es la misma distancia de los lados.

Si eso no es una opción, o simplemente para obtener su código de ir, probar este

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    int iTop = canvas21.Top; 
    int iLeft = canvas21.Left; 
    // - 200 - iTop keeps it 200 from the bottom, -iLeft keeps i stuck to right 
    canvas21.Size = new System.Drawing.Size(this.Width -iLeft, this.Height-200 -iTop); 
    canvas21.Left = iLeft; // move back 
    canvas21.Top = iTop; // move back 
    canvas21.Invalidate(); 
} 

Para mantenerlo 15 pixels in the bottom, cambie 200 arriba para 15. O bien, ajústelo a 15 en el momento del diseño o mediante el código, active el ancla bottom.

+0

@cyberwiki - No funcionó. Estoy buscando lugares donde establezco el tamaño o Dock, pero no puedo encontrar ninguno, así que no parece ser el problema – Bildsoe

0

Para controles que no sean su control personalizado, ¿puede cambiar el tamaño correctamente? Por ejemplo, si coloca un cuadro de texto enriquecido y configura el Ancla correspondiente (Todos) ¿cambiará el tamaño correctamente para usted? Si lo hace, entonces debe haber somthing a pescado con el dimensionamiento de su control, pero que tal vez podría hacer trampas que al hacer esto ...

  1. crear un panel que es el tamaño exacto y de anclaje que le gustaría de su mando .
  2. Agregue su control al Panel y configure Dock para "Rellenar". De hecho, usted llenará el panel con su control y usará el panel para controlar el cambio de tamaño en el formulario.

Si, por supuesto, su panel no cambia el tamaño correctamente, entonces esto no funcionará para usted. De acuerdo, es probable que sea una solución a un problema de código subyacente que en un mundo perfecto sería remedado en el control mismo.

0

estoy mirando a cambiar el tamaño de un control de usuario, y estoy usando muchos eventos diferentes para manejar esto (por ejemplo. OnSizeChanged, OnFontChanged, OnTextChanged)

Dependiendo de cómo los cuadros de texto se ajustan en su control hará una diferencia, pero si su contenedor principal tiene la propiedad AutoScaleMode o AutoSize, entonces puede descubrir que no está captando todos los eventos relevantes.

Me disculpo por adelantado si estoy fuera de la luz ya que soy nuevo en este tipo de cosas.

ps. No encontré tu publicación al principio, ya que había estado buscando en las etiquetas Windows-forms-designer y Custom-Control. ¡Realmente no sé qué etiquetas debería usar y no puedo usar todas las posibilidades cuando el límite de 5 se hace cargo!

4

Realmente no hay ninguna razón por la cual el ajuste de la altura y el anclaje a cada lado (con el conjunto de acoplamiento a ninguno) no debería funcionar.

Sin embargo, noté un error en la lógica del código proporcionado. Tiene:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.Top - 15); 

cuando debería ser en realidad:

canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, this.ClientSize.Height - this.canvas21.Top - 15); 

Usted se acaba tomando la parte superior del formulario, en lugar de la parte superior de canvas21, que es lo que necesita.

Eso parece hacer exactamente lo que quiere, al menos desde mi punto de vista. Si no funciona, ¿no está redimensionando para usted o está cambiando el tamaño al tamaño incorrecto?

0

Amigo, vas a patearte a ti mismo. No desea ClientSize.Height - Arriba - 15, quiere ClientSize.Height - canvas21.Top - 15. ¡Eso es todo!

private void Form1_Resize_1(object sender, EventArgs e) 
{ 
    textBox1.Text = this.Width.ToString(); 
    textBox2.Text = (this.Height - 200).ToString(); 

    canvas21.Size = new System.Drawing.Size(this.ClientSize.Width, 
     this.ClientSize.Height - canvas21.Top - 15); 

    canvas21.Invalidate(); 
} 
+0

Ya lo señalé en mi publicación: P – Yetti

+0

Sí, lo vi después al corriente. He votado a favor su respuesta. –

Cuestiones relacionadas