日期:2008-05-17  浏览次数:20449 次

实现功能:

1)下拉出颜色选取对话框.

2)后台窗口不失去焦点.

3)点击更多调用windows标准颜色选取对话框选取颜色.




开发背景:

在网上看到一些文章可以基本实现这些功能、但是大多使用前台窗口获得焦点后在迅速把焦点

转移到后台窗口的方法、或是将前台窗口 Show 出通过使去焦点来关闭前台窗口,或者干脆用个控件(用普通的控件如果如果范围超出后台窗口的范围就会被窗口遮挡)

而Windows内置的菜单或下拉框都不会出现使、前台窗口触发失去焦点事件的事件、更不会被遮挡、抱着一个程序员执著的信念、在csdn论坛连发数贴(400 分啊)在加上不断的努力终于有所曾就。

在此感谢 csdn 的各位同僚朋友,没有你们就没有这个世界(哈)。

废话不多说了、进入正题。



程序实现代码解析:

1)文章所用到的基础Windows API 类。

using System;

using System.Runtime.InteropServices;

/// <summary>

/// 系统调用,都是Windows API 相关 注视的地方也许大家有用没有删除,具体说明情察看msdn

/// </summary>

public class SystemShell

{



public const int GWL_STYLE = -16;

//public const int GWL_EXSTYLE = -20;

//public const int WS_VISIBLE =0x10000000;

public const int WS_CHILDWINDOW = 0x40000000;

//public const int WS_CLIPSIBLINGS = 0x04000000;

//public const int WS_CLIPCHILDREN = 0x02000000;

//public const int WS_BORDER = 0x00800000;

//public const long WS_THICKFRAME = 0x00040000;

//public const long WS_OVERLAPPED = 0x00000000;

//public const long WS_DLGFRAME = 0x00400000;

//public const long WS_EX_TOOLWINDOW = 0x00000080;



//public const int WM_NCPAINT = 0x0085;

public const int WM_ACTIVATEAPP = 0x001C;

//public const int WM_ERASEBKGND = 0x0014;



[DllImport("user32.dll", CharSet=CharSet.Auto)]

public static extern long SetWindowLong(IntPtr hWnd, int nIndex, long dwNewLong);



[DllImport("user32.dll", CharSet=CharSet.Auto)]

public static extern long GetWindowLong( IntPtr hWnd,int nIndex);





//[DllImport("user32.dll", CharSet=CharSet.Auto)]

//public static extern int SendMessage(IntPtr hWnd , int msg , int wParam ,int lParam );



//[DllImport("user32.dll", CharSet=CharSet.Auto)]

//public static extern int GetWindowRect (IntPtr hWnd , ref System.Drawing.Rectangle lpRect);



private SystemShell()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

}







本文章弹出窗口的基类(代码处理流程情根据标号浏览)







/// <summary>

/// NoActForm 实现弹出窗口的基类。

/// </summary>

public class NoActForm : System.Windows.Forms.Form

{



/// <summary>

/// 必需的设计器变量。

/// </summary>





private System.ComponentModel.Container components = null;

public NoActForm():base()

{

//

// Windows 窗体设计器支持所必需的

//

InitializeComponent();

}

/// <summary>

/// 清理所有正在使用的资源。

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.