Кнопка изображения CF.net - PullRequest
0 голосов
/ 16 марта 2012

Я создал кнопку с изображением для своих приложений на Windows Mobile.Есть небольшая проблема, хотя, когда у меня другое разрешение экрана, например, больше, изображение не изменяется автоматически, чтобы соответствовать элементу управления.Как это можно сделать?

спасибо заранее.

это мой код для функции onPaint

        Dim gxOff As Graphics
        'Offscreen graphics
        Dim imgRect As Rectangle
        'image rectangle
        Dim backBrush As Brush
        'brush for filling a backcolor
        If m_bmpOffscreen Is Nothing Then
            'Bitmap for doublebuffering
            m_bmpOffscreen = New Bitmap(Me.Width, Me.Height)
        End If

        gxOff = Graphics.FromImage(m_bmpOffscreen)

        gxOff.Clear(Me.BackColor)

        If Not bPushed Then
            backBrush = New SolidBrush(Parent.BackColor)
        Else
            backBrush = New SolidBrush(Color.Black)
            'change the background when it's pressed
        End If

        gxOff.FillRectangle(backBrush, Me.ClientRectangle)

        If m_image IsNot Nothing Then
            'Center the image relativelly to the control
            Dim imageLeft As Integer = (Me.Width - m_image.Width) / 2
            Dim imageTop As Integer = (Me.Height - m_image.Height) / 2

            If Not bPushed Then
                imgRect = New Rectangle(imageLeft, imageTop, m_image.Width, m_image.Height)
            Else
                'The button was pressed
                'Shift the image by one pixel
                imgRect = New Rectangle(imageLeft + 1, imageTop + 1, m_image.Width, m_image.Height)
            End If
            'Set transparent key
            Dim imageAttr As New Imaging.ImageAttributes()
            imageAttr.SetColorKey(BackgroundImageColor(m_image), BackgroundImageColor(m_image))
            'Draw image
            gxOff.DrawImage(m_image, imgRect, 0, 0, m_image.Width, m_image.Height, GraphicsUnit.Pixel, imageAttr)
        End If

        If bPushed Then
            'The button was pressed
            'Prepare rectangle
            Dim rc As Rectangle = Me.ClientRectangle
            rc.Width -= 1
            rc.Height -= 1
            'Draw rectangle
            gxOff.DrawRectangle(New Pen(Color.Black), rc)
        End If

        'Draw from the memory bitmap
        e.Graphics.DrawImage(m_bmpOffscreen, 0, 0)

        MyBase.OnPaint(e)

1 Ответ

0 голосов
/ 16 марта 2012

Вам нужно масштабировать изображение во время OnPaint например ::

if (this._image != null)
{                    
  int x = (this.Width - this._image.Width) / 2;
  int y = (this.Height - this._image.Height) / 2;
  var imgRect = new Rectangle(x, y, this._image.Width, this._image.Height);

  var imageAttr = new ImageAttributes();

  Color clr = this._image.GetPixel(0, 0);
  imageAttr.SetColorKey(clr, clr);

  gr2.DrawImage(this._image, imgRect, 0, 0, this._image.Width, this._image.Height, GraphicsUnit.Pixel, imageAttr);
}

Выше приведен пример, как нарисовать изображение прозрачным цветом на основе первого пикселя. Теперь вам нужно изменить вторые 3 строки:

bool qvga = Screen.PrimaryScreen.Bounds.Height == 240 || Screen.PrimaryScreen.Bounds.Width == 240; 
int x = (this.Width - (qvga ? this._image.Width : this._image.Width * 2)) / 2;
int y = (this.Height - (qvga ? this._image.Height : this._image.Height * 2)) / 2;
var imgRect = new Rectangle(x, y, (qvga ? this._image.Width : this._image.Width * 2), (qvga ? this._image.Height : this._image.Height * 2));

[Изменить]

Наблюдение за изменением вашего кода просто. Как я описал в комментарии: для двух основных разрешений Windows Mobile, QVGA и VGA, мы предполагаем, что изображение соответствует размеру QVGA. Пожалуйста, конвертируйте мой код в VB самостоятельно. Так что установите флаг qvga, как я написал:

bool qvga = Screen.PrimaryScreen.Bounds.Height == 240 || Screen.PrimaryScreen.Bounds.Width == 240; 

теперь основано на флаге ammend следующим, основываясь на моем коде выше:

Dim imageLeft As Integer = (Me.Width - m_image.Width) / 2
Dim imageTop As Integer = (Me.Height - m_image.Height) / 2

а затем вот эти:

If Not bPushed Then
     imgRect = New Rectangle(imageLeft, imageTop, m_image.Width, m_image.Height)
Else
     'The button was pressed
     'Shift the image by one pixel
imgRect = New Rectangle(imageLeft + 1, imageTop + 1, m_image.Width, m_image.Height)

End If

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...