图像按钮CF.net

时间:2012-03-16 06:48:23

标签: c# vb.net mobile

我在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 :(得分:0)

您需要在 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);
}

以上示例是如何基于第一像素绘制具有透明色的图像。现在你需要修改第二行:

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移动分辨率,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)

结束如果