gpt4 book ai didi

在 C++ builder XE 中,带有圆角的窗体周围的边框

转载 作者:行者123 更新时间:2023-12-04 20:54:27 25 4
gpt4 key购买 nike

我在以下代码的帮助下制作了一个带有圆角的 C++ Builder XE 表单

BorderStyle = bsNone; 

void __fastcall TForm1::FormCreate(TObject *Sender)
{
HRGN frmrgn;

frmrgn = CreateRoundRectRgn (0, 0, ClientWidth, ClientHeight,12,12);
SetWindowRgn(Handle,frmrgn,true);
}

看起来很酷但是没有边框,我尝试了很多东西但没有得到好的结果
所以请帮我画 RGB(96,96,96) 颜色的边框

我想让整个表单可拖动。

最佳答案

1. 绘制深灰色边框

这很简单,取决于您希望边框看起来有多复杂。如果您只想要深灰色的轮廓,请使用线条和弧线的组合绘制它,或者使用 FrameRgn 函数使用特定画笔在您的区域周围绘制轮廓。这样做是最好的解决方案,因为您已经有了一个用来定义窗口形状的区域。

但是, SetWindowRgn 的 MSDN 文档说,“成功调用 SetWindowRgn 后,系统拥有区域句柄 hRgn 指定的区域。系统不会复制该区域。因此,您不应进行任何进一步的函数调用用这个区域句柄。”您需要为绘制方法再次创建您的区域。

您的绘画方法的一些代码:

HRGN hRegion = ::CreateRoundRectRgn (0, 0, ClientWidth, ClientHeight,12,12);
Canvas->Brush->Style = bsSolid;
Canvas->Brush->Color = RGB(96, 96, 96);
::FrameRgn(Canvas->Handle, hRegion, Canvas->Brush->Handle, 2, 2);
::DeleteObject(hRegion); // Don't leak a GDI object

2. 使窗口可拖动而没有标题栏

简短的总结是您需要处理 WM_NCHITTEST 消息。 Windows 发送它以查看鼠标是否在标题栏上(“NC”代表“非客户端”;它实际上是在测试它是否位于非客户端区域中的任何位置,可以是任何窗口边框,而不仅仅是顶部。)您可以通过说“是的,鼠标现在在标题中”使您的窗口可拖动,即使它不在。一些代码:
// In the 'protected' section of your form's class declaration
virtual void __fastcall WndProc(Messages::TMessage &Message);

// The implementation of that method:
void __fastcall TForm1::WndProc(Messages::TMessage& Message) {
TForm::WndProc(Message); // inherited implementation
if (Message.Msg == WM_NCHITTEST && Msg.Result == htClient) {
Msg.Result = htCaption;
}
}

您可以自己执行一些 HitTest 以限制窗口的哪些部分显示为标题栏,以便创建自己的标题栏。

Example Delphi code.

A good article about using this message, and things to be aware of / traps not to fall into.

关于在 C++ builder XE 中,带有圆角的窗体周围的边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6174134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com