在c ++ builder XE中围绕带圆角的表单边框

rud*_*ani 5 border c++builder rounding drag c++builder-xe

我已经使用以下代码制作了带圆角的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);
}
Run Code Online (Sandbox Code Playgroud)

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

我希望整个表格可以拖动.

Dav*_*vid 3

1.画深灰色边框

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

然而,MSDN 文档SetWindowRgn说:“成功调用 后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
Run Code Online (Sandbox Code Playgroud)

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Delphi 代码示例。

一篇关于使用此消息以及需要注意的事项/不要陷入陷阱的好文章。