根据一副png图片绘制半透明窗体时,用了WS_EX_LAYERED后当前窗体再也不会处理paint事件,所以所含的子控件是一辈子也不会画出来的,但是这个控件确实存在,而且可以响应事件 。而此时windows画制窗体是使用UpdateLayeredWindow这个api函数的。
其实这个问题,3年前就在csdn网友miky的"笨笨钟"发布后就讨论过了,后来出了一个叫桌面天气秀 的东东也采用类似的技术。那时候我有幸拿到了miky的delphi下实现gdi+半透明窗体的一段代码,因为无法画出button等控件和 几位高人讨论过,这里是当时的讨论情况
http://borland.mblogger.cn/jinjazz/posts/21093.aspx
最终并没有很好的解决办法,而是通过大概如下的方法解决的
————————————————————————————————————
对于按钮,完全可以自己画两个图片然后盖在button上面,通过处理button的enter和leave消息来切换者两个图片来表达按钮状态
对于输入框..这个可以用一个让任何人看了都生气地办法,那就是....两个窗体 ,的确别人就是这么做的
可以用一个空心窗体只显示该显示的控件,然后盖在你的半透明窗体上面,并处理半透明窗体的move事件,让另外一个窗体同步移动或者做其它事情
效果如下:
以下是一些C#代码,Delphi的就不贴了
主Form的代码
using
System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace WindowsApplication7
... {
public class Form1 : System.Windows.Forms.Form
... {
private System.ComponentModel.IContainer components;
public Form1()
... {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
}
/**/ /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
... {
if ( disposing )
... {
if (components != null )
... {
components.Dispose();
}
}
base .Dispose( disposing );
}
Windows Form Designer generated code #region Windows Form Designer generated code
/**/ /// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
... {
this .button1 = new System.Windows.Forms.Button();
this .SuspendLayout();
//
// button1
//
this .button1.Cursor = System.Windows.Forms.Cursors.Hand;
this .button1.Location = new System.Drawing.Point( 20 , 20 );
this .button1.Name = " button1 " ;
this .button1.Size = new System.Drawing.Size( 113 , 51 );
this .button1.TabIndex = 1 ;
this .button1.Text = " button1 " ;
this .button1.MouseLeave += new System.EventHandler( this .button1_MouseLeave);
this .button1.Click += new System.EventHandler( this .button1_Click);
this .button1.MouseEnter += new System.EventHandler( this .button1_MouseEnter);
//
// Form1
//
this .AutoScaleBaseSize = new System.Drawing.Size( 6 , 14 );
this .ClientSize = new System.Drawing.Size( 184 , 123 );
this .Controls.Add( this .button1);
this .Name = " Form1 " ;
this .StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this .Text = " Form1 " ;
this .Load += new System.EventHandler( this .Form1_Load);
this .VisibleChanged += new System.EventHandler( this .Form1_VisibleChanged);
this .FormClosed += new System.Windows.Forms.FormClosedEventHandler( this .Form1_FormClosed);
this .MouseDown += new System.Windows.Forms.MouseEventHandler(
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace WindowsApplication7
... {
public class Form1 : System.Windows.Forms.Form
... {
private System.ComponentModel.IContainer components;
public Form1()
... {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
}
/**/ /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
... {
if ( disposing )
... {
if (components != null )
... {
components.Dispose();
}
}
base .Dispose( disposing );
}
Windows Form Designer generated code #region Windows Form Designer generated code
/**/ /// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
... {
this .button1 = new System.Windows.Forms.Button();
this .SuspendLayout();
//
// button1
//
this .button1.Cursor = System.Windows.Forms.Cursors.Hand;
this .button1.Location = new System.Drawing.Point( 20 , 20 );
this .button1.Name = " button1 " ;
this .button1.Size = new System.Drawing.Size( 113 , 51 );
this .button1.TabIndex = 1 ;
this .button1.Text = " button1 " ;
this .button1.MouseLeave += new System.EventHandler( this .button1_MouseLeave);
this .button1.Click += new System.EventHandler( this .button1_Click);
this .button1.MouseEnter += new System.EventHandler( this .button1_MouseEnter);
//
// Form1
//
this .AutoScaleBaseSize = new System.Drawing.Size( 6 , 14 );
this .ClientSize = new System.Drawing.Size( 184 , 123 );
this .Controls.Add( this .button1);
this .Name = " Form1 " ;
this .StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this .Text = " Form1 " ;
this .Load += new System.EventHandler( this .Form1_Load);
this .VisibleChanged += new System.EventHandler( this .Form1_VisibleChanged);
this .FormClosed += new System.Windows.Forms.FormClosedEventHandler( this .Form1_FormClosed);
this .MouseDown += new System.Windows.Forms.MouseEventHandler(