c# - 创建 Photoshop 风格的 float 工具调色板

标签 c# winforms user-interface

关于如何创建 Photoshop 风格的 float 工具调色板有什么建议吗?我尝试了几个想法,例如:

  1. 创建子窗口,将其 FormBorderStyle 设置为 FixedToolWindow 并将其显示为主窗体的子窗体,但工具窗口从主窗体窃取焦点。
  2. 如上所述创建子窗口并使用传递给 CreateParams 的各种标志组合,但仍然遇到相同的焦点问题。
  3. 将工具选项板创建为 UserControl 并通过将其父级设置为桌面(通过 user32#SetParent 函数)使其“ float ”,但随后它不再是主窗体的子级并且不会最小化/恢复与主窗体。

我认为 #3 是可行的方法,我将不得不编写代码来使工具选项板窗口状态与主窗体保持同步,并实现拖动选项板的能力,绘制边框等...

关于解决此问题的更好方法的建议?

最佳答案

我只知道一种方法可以做到这一点,但它会将您限制为不能像 Photoshop 中那样离开父窗体的子窗体。覆盖子窗体上的 CreateParams:

const int WS_EX_NOACTIVATE = 0x8000000;
const int WS_CHILD = 0x40000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams ret = base.CreateParams;
        ret.Style |= WS_CHILD;
        ret.ExStyle |= WS_EX_NOACTIVATE;
        return ret;
    }
}

确保当您在子窗体上调用 Show 时,您使用的重载采用 IWin32Window 并传入父窗体。

关于c# - 创建 Photoshop 风格的 float 工具调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213709/

相关文章:

c# - 向数组添加元素

c# - mvc 中没有为此对象定义无参数构造函数

c# - XML 中的 float

c# - 查找 PostgreSQL 数据库列中可用的最小数字

java - 使用 Java 框架的 GUI 桌面应用程序自动化

c# - 具有十进制值或类似值的枚举

vb.net - 更改列表框的颜色、突出显示、背景大小?

c# - 字符串上带有美元的动态对象

php - 仅 1 个 Jquery UI Multiselect 值通过 PHPmailer 发送

JavaFX - 使 GridPane 占用 BorderPane 中的所有可用空间