C#中弹出窗口的Aero Glass边框

5

我想创建像这样的弹出窗口(固定大小):

pop-up windows

在我的C#应用程序中,我研究了NativeWindow,但我不确定这是否是正确的方法。我想让一个窗口的行为与Windows 7中的音量控制或“连接到”窗口完全相同。
我该如何实现这个?
4个回答

4
使用WinForms创建一个窗体,并设置以下内容:
Text = "";
FormBorderStyle = Sizable;
ControlBox = false;
MaximizeBox = false;
MinimizeBox = false;
ShowIcon = false;

编辑:

这需要窗口可以调整大小,但你可以在这方面小小地作弊。将 MinimumSize 和 MaximumSize 设置为所需的大小。这会防止用户调整大小。

正如 Jeff 建议的那样,你也可以在 CreateParams 中实现这一点:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        unchecked
        {
            cp.Style |= (int)0x80000000;    // WS_POPUP
            cp.Style |= 0x40000;            // WS_THICKFRAME
        }
        return cp;
    }
}

然而,在这两种情况下,当您将鼠标悬停在边缘时,仍会出现大小调整光标。我不确定如何防止这种情况发生。


你认为是否有可能捕获某种窗口消息以禁用光标? - zsalzbank
@codethis:我找了一下,没有找到任何东西。不过肯定有办法的。 - Jon B
我通过取消WM_SETCURSOR成功摆脱了调整大小的光标。 protected override void WndProc(ref Message m) { if (m.Msg == 0x20) { m.Result = (IntPtr)1; return; } base.WndProc(ref m); }这样做可以解决问题,但会留下一个奇怪的副作用——第一次悬停在边框上时,等待光标会出现。然后当你将它移动到客户区域时,它就能正常工作了。不确定如何解决这个问题... - zsalzbank

2
我能够完成这个任务:
if (m.Msg == 0x84 /* WM_NCHITTEST */) {
    m.Result = (IntPtr)1;
    return;
}
base.WndProc(ref m);

2
在您的CreateParams中指定WS_POPUP和WS_THICKFRAME。

0
为了防止调整大小的光标超过边界,请处理 WM_NCHITTEST,当光标在边界上时返回 HTBORDER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接