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

问题描述

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

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

     frmrgn = CreateRoundRectRgn (0,ClientWidth,ClientHeight,12,12);
     SetWindowRgn(Handle,frmrgn,true);
}
看起来很酷,但是缺少边框,我尝试了很多事情,但没有得到很好的结果 所以请帮我画出RGB(96,96,96)的边框 我想使整个表格可拖动。     

解决方法

        1.绘制深灰色边框 这很容易,具体取决于您希望边框看起来多么复杂。如果只想使用深灰色轮廓,则可以使用线条和圆弧的组合来绘制轮廓,或者使用
FrameRgn
函数使用特定的笔刷在您的区域周围绘制轮廓。这样做是最好的解决方案,因为您已经具有用于定义窗口形状的区域。 但是,用于documentation2ѭ的MSDN文档说:\“成功调用
SetWindowRgn
之后,系统拥有由区域句柄
hRgn
指定的区域。系统不会复制该区域。因此,您不应做任何进一步的功能具有该区域句柄的调用。\“您将需要为paint方法再次创建您的区域。 绘画方法的一些代码:
HRGN hRegion = ::CreateRoundRectRgn (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 \'代表\'non-client \';它实际上正在测试以查看其是否位于非客户区域的任何位置,可以是任何窗口边框,而不仅仅是顶部边框。)您可以通过说“是的,鼠标现在在标题中”来拖动窗口,即使不是。一些代码:
// 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;
  }
}
您可以执行一些命中测试,以限制窗口的哪些部分显示为标题栏,以便创建自己的标题栏。 示例Delphi代码。 关于使用此消息的一篇不错的文章,并且要注意的事情/陷阱不属于其中。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...