1.画深灰色边框
这个很简单,具体取决于您希望边框看起来有多复杂。如果您只想要深灰色的轮廓,可以使用直线和弧线的组合来绘制它,或者使用FrameRgn http://msdn.microsoft.com/en-us/library/dd144839%28v=VS.85%29.aspx功能使用特定的画笔在您的区域周围绘制轮廓。这样做是最好的解决方案,因为您已经有一个用于定义窗口形状的区域。
然而,MSDN 文档SetWindowRgn http://msdn.microsoft.com/en-us/library/dd145102%28v=vs.85%29.aspx says, “成功拨打电话后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 http://msdn.microsoft.com/en-us/library/ms645618%28v=vs.85%29.aspx信息。 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;
}
}
您可以执行一些自己的命中测试来限制窗口的哪些部分显示为标题栏,以便创建您自己的标题栏。
Delphi 代码示例。 http://delphi.about.com/od/windowsshellapi/a/dragnocaption.htm
一篇关于使用此消息以及需要注意的事情/不要陷入陷阱的好文章。 http://blogs.msdn.com/b/oldnewthing/archive/2011/02/18/10131176.aspx