5

在以下代码的帮助下,我制作了一个带有圆角的 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) 的边框

我想让整个表格可以拖动。

4

1 回答 1

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

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;
  }
}

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

示例德尔福代码。

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

于 2011-05-31T00:33:11.353 回答