首页| 论坛| 消息
主题:更加“Native”的方式实现无边框可拖动调整大小的阴影窗口
nyyzpp发表于 2014-03-03 00:09
ze)
*result = HTLEFT;
if (x > this->width() - d->shadowSize && x < this->width())
*result = HTRIGHT;
if (y > 0 && y < d->shadowSize)
*result = HTTOP;
if (y > this->height() - d->shadowSize && y < this->height())
*result = HTBOTTOM;
if (x > 0 && x < d->shadowSize && y > 0 && y < d->shadowSize)
*result = HTTOPLEFT;
if (x > this->width() - d->shadowSize && x < this->width() && y > 0 && y < d->shadowSize)
*result = HTTOPRIGHT;
if (x > 0 && x < d->shadowSize && y > this->height() - d->shadowSize && y < this->height())
*result = HTBOTTOMLEFT;
if (x > this->width() - d->shadowSize && x < this->width() && y > this->height() - d->shadowSize && y < this->height())
*result = HTBOTTOMRIGHT;
return true;
}
case WM_NCLBUTTONDBLCLK:
{
//! [1] 如果窗口大小不可调整,则不处理
if (!d->resizable) return false;
//! [1]

HWND hWnd = (HWND)this->winId();
if (IsZoomed(hWnd)) {
ShowWindow(hWnd, SW_RESTORE);
}
else {
ShowWindow(hWnd, SW_MAXIMIZE);
}
return true;
}
case WM_GETMINMAXINFO:
{
QRect rect = QApplication::desktop()->availableGeometry(this);
MINMAXINFO* info = reinterpret_cast(param->lParam);
info->ptMaxPosition.x = rect.x() - d->shadowSize;
info->ptMaxPosition.y = rect.y() - d->shadowSize;
info->ptMaxSize.x = rect.width() + d->shadowSize*2;
info->ptMaxSize.y = rect.height() + d->shadowSize*2;
return true;
}
}// end switch

return false;
}你可以在msdn library上查看这几个消息所代表的意思,凡是以NC开头的消息,都代表非客户区域的消息(not client)
I. WM_NCHITTEST表示鼠标在非客户区域的位置,result返回具体的位置,例如HTCAPTION表示鼠标在标题栏,HTLEFT表示鼠标在窗口左边界,接下来操作系统会自己去处理先关事件,相信大家很快就会知道由操作系统去处理,比我们自己去处理的好处和代码简洁度的提高。
II. WM_NCLBUTTONDBLCLK表示非客户区域双击事件,这段代码很容易懂,不做详细解释。
III. WM_GETMINMAXINFO表示操作系统需要获取窗口最大化最小化的一些信息,为什么需要处理这个消息呢,事实是这样的,由于自绘了阴影部分,算在客户区域,当不处理这个消息的时候,最大化的话会发现,窗口会遮挡任务栏,并且阴影在出现在最大化的状态当中,这样就不太符合要求了。幸运的是,微软提供了响应的处理来获取最大化信息。代码很容易懂,不做详细解释。
4.支持修改阴影大小
void QShadowDialog::setShadowSize(int shadowSize)
{
Q_D(QShadowDialog);
if (shadowSize > 0 && shadowSize < 20) {
d->shadowSize = shadowSize;
this->update();
}
else {
qWarning()
附件: QtWidgetsExtend.rar (17 K) 下载次数:207
下一页上一页  (2/3)
回帖(11):
11楼:
10楼:给力帖子 顶
9楼:看起来很不错

全部回帖(11)»
最新回帖
收藏本帖
发新帖