实现功能:
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.