none
Cambiar el tamaño de una imagen en richtextbox RRS feed

  • Pregunta

  • Hola amigos

    Lo que necesito es obtener el ancho y la altura de una imagen seleccionada en richtextbox1,
    NumericUpDown1   me muestre el ancho 
    NumericUpDown 2  me muestre la altura
    ademas cuando ingrese nuevos valores se actualice la imagen, ej: si mi imagen original tiene el ancho 600 y alto 600 entonces cuando ingrese valores nuevos por decir 400, 400 se actualise a estos valores al presionar un button1.
    Tambien un checkbox1 cuando es chequedo permita bloquear relacion de aspecto si no desbloquear.


    Gracias

    • Cambiado Enrique M. Montejo lunes, 15 de septiembre de 2014 11:55 Pregunta relacionada con controles de Windows Forms.
    miércoles, 10 de septiembre de 2014 16:45

Todas las respuestas

  • Lo estuve intentando un rato y fallando miserablemente.

    Recupero la interface ole del control (IRichEditOle).

    Llamo a GetObject() y obtengo el REOBJECT de la imagen

    Extraigo la interface IOleObject y llamo a su método SetExtent con el nuevo tamaño.

    En tipo lanza una excepción porque resulta que el objeto es "STATIC" y su tamaño no puede ser cambiado.

    No sé si hay otra forma o si estoy perdiendome de algo. La doc dice que el flag no puede modificarse, sólo leerse.

    ---

    Esto va en el marco del ejemplo de código que estuvimos intercambiando

        Private Sub RichTextBox1_SelectionChanged(sender As System.Object, e As System.EventArgs) Handles RichTextBox1.SelectionChanged
    
            NumericUpDown1.Value = 0
            NumericUpDown2.Value = 0
    
            If (RichTextBox1.SelectionType And RichTextBoxSelectionTypes.Object) = RichTextBoxSelectionTypes.Object Then
                Dim obj As New REOBJECT
    
                obj.cbStruct = Marshal.SizeOf(obj)
    
                Dim total As Integer = reo.GetObjectCount()
                Dim iob As Integer = reo.GetObject(0, obj, REO_GETOBJ_POLEOBJ)
    
                ' centésimas de milímetro
                ' pixeles = dpi * (value / 100) / 25.4
                NumericUpDown1.Maximum = obj.sizel.Height * 2
                NumericUpDown1.Value = obj.sizel.Height
    
                NumericUpDown2.Maximum = obj.sizel.Width * 2
                NumericUpDown2.Value = obj.sizel.Width
    
                'Dim s As New Size
    
                'obj.poleobj.GetExtent(CUInt(DVASPECT.DVASPECT_CONTENT), s)
    
                ''s.Width \= 2
                's.Height \= 2
    
                'obj.poleobj.SetExtent(CUInt(DVASPECT.DVASPECT_CONTENT), s)
            End If
        End Sub
    
    Si agregas dos updowns, cuando selecciones la primera imagen (el objeto 0), van a reflejar el tamaño actual de la imagen en centésimas de milímetro (ole usa HIMETRIC).

    La parte comentada contiene el intento fallido de establecer un nuevo tamaño.

    La declaración de la interface IOleObject, se modificópara aceptar el tipo Size del clr, similar al sizel de ole

    Function SetExtent(dwDrawAspect As UInteger, ByRef psizel As Size) As Integer
    Function GetExtent(dwDrawAspect As UInteger, ByRef psizel As Size) As Integer
    


    [W]


    • Editado [Walter] miércoles, 10 de septiembre de 2014 17:52
    miércoles, 10 de septiembre de 2014 17:08
  • Gracias lo intentare solucionar
    de todas formas dejo abierto la pregunta para aquellos que talves se les ocurra otra manera de solucionar el poblema.
    viernes, 12 de septiembre de 2014 23:06