转自http://www.cppblog.com/eXile/archive/2007/12/09/38084.html
这里讨论的只是Windows平台上的实现。
在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口。相对来说比较麻烦的, 是进行窗口拖动和缩放的处理。
在 Windows SDK 和 MFC 中比较容易,只要处理 WM_NCHITTEST,返回相应的测试值就可以了。幸运的是,QT中也提供了直接处理各平台消息的方法,在 Windows下只需要重载winEvent方法。
下面给出了示例代码:
// include <windows.h>
bool MyDialog::winEvent(MSG
*
msg,
long
*
result)
{
const
int
captionHeight
=
25
;
const
int
frameWidth
=
6
;
if
(msg
->
message !
=
WM_NCHITTEST) return
false
;

QPoint pos
=
mapFromGlobal(QCursor::pos());
int
w
=
width();
int
h
=
height();

if
(QRect(frameWidth, captionHeight, w
-
frameWidth
-
frameWidth, h
-
captionHeight
-
frameWidth).contains(pos))
{
*
result
=
HTCLIENT;
}
else
if
(QRect(
0
,
0
, w, captionHeight).contains(pos))
{
*
result
=
HTCAPTION;
}
else
if
(QRect(
0
, captionHeight, frameWidth, h
-
captionHeight
-
frameWidth).contains(pos))
{
*
result
=
HTLEFT;
}
else
if
(QRect(w
-
frameWidth, captionHeight, frameWidth, h
-
captionHeight
-
frameWidth).contains(pos))
{
*
result
=
HTRIGHT;
}
else if (QRect(frameWidth, h-frameWidth, w-frameWidth-frameWidth, frameWidth).contains(pos))
{
*result = HTBOTTOM;
}
else
if
(QRect(
0
, h
-
frameWidth, frameWidth, frameWidth).contains(pos))
{
*
result
=
HTBOTTOMLEFT;
}
else
if
(QRect(w
-
frameWidth, h
-
frameWidth, frameWidth, frameWidth).contains(pos))
{
*
result
=
HTBOTTOMRIGHT;
}
return
true
;
}



























else if (QRect(frameWidth, h-frameWidth, w-frameWidth-frameWidth, frameWidth).contains(pos))
{
*result = HTBOTTOM;
}











