WinForms:制作折叠/展开图像按钮

时间:2009-12-11 17:59:25

标签: .net winforms user-interface

这是此SO问题的后续问题:How do I make a collapsible UI region on the form?


我正在创建一个带有可扩展或可折叠的区域(面板)的winforms应用程序。

我使用VS2008 Image library中的展开/折叠位图作为按钮。我将这两个放入ImageList。

我希望按钮没有边框,所以我设置FlatStyle = Flat,FlatAppearance.BorderSize = 0.

在按钮的点击事件上,我有

private void button1_Click(object sender, EventArgs e)
{
    if (splitContainer1.Panel1Collapsed == true)
    {
        splitContainer1.Panel1Collapsed = false;
        button1.ImageIndex = 0;
        this.toolTip1.SetToolTip(this.button1, "Collapse");
    }
    else
    {
        splitContainer1.Panel1Collapsed = true;
        button1.ImageIndex = 1;
        this.toolTip1.SetToolTip(this.button1, "Expand");
    }
}

但是不尊重位图的透明度。我的理解是,位图的左上角(或左下角?)角使用的颜色将被视为透明,因此当显示位图时,具有相同颜色值的任何像素都将是透明的。但我没有得到那些结果。相反,我得到透明色,以显示其真实的颜色。

alt text  alt text

我找到了一种方法来避免这种情况,方法是为按钮提供OnPaint方法,并在调用MakeTransparent()之后手动绘制bmp,如下所示:

private void button1_Paint(object sender, PaintEventArgs e)
{
    // This draws the image on the button, and makes the bmp
    // background color as transparent. Why this isn't done
    // automatically, I don't know. 
    Bitmap bmp = (Bitmap) imageList1.Images[button1.ImageIndex];
    bmp.MakeTransparent();
    int x = (button1.Width - bmp.Width) / 2;
    int y = (button1.Height - bmp.Height) / 2;
    e.Graphics.DrawImage(bmp, x, y);
}

但是有没有更简单的方法?

1 个答案:

答案 0 :(得分:2)

您需要在ImageList上设置TransparentColor属性。