请问如何自绘制非客户区(Non client area)?

154 lượt xem
Chuyển tới thư đầu tiên chưa đọc

叁K

chưa đọc,
09:30:34 28 thg 5, 201128/5/11
đến Qt中文
MFC可以这样:
http://stackoverflow.com/questions/99623/how-to-draw-in-the-nonclient-area

请问Qt该怎么做?

Qt应该没有预留这方面的机制,这是窗口管理器的事情。
初步想通过预编译#ifdef Q_OS_WIN 这样的本地实现,
至少先把windows下搞定,但是不知道从哪里下手。

提问之前我思考过,查过资料,搞不定……感谢!

Goldfish Huang

chưa đọc,
04:40:57 29 thg 5, 201129/5/11
đến qt-c...@googlegroups.com
似乎可以通过winId()得到窗口句柄。然后应该就跟MFC差不多了吧。

> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“Qt中文”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 qt-c...@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 qt-china+u...@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/qt-china?hl=zh-CN 访问此网上论坛。
>
>

Kermit

chưa đọc,
05:38:56 29 thg 5, 201129/5/11
đến qt-c...@googlegroups.com
On Sun, May 29, 2011 at 04:40:57PM +0800, Goldfish Huang wrote:
> 似乎可以通过winId()得到窗口句柄。然后应该就跟MFC差不多了吧。
>
> 在 2011年5月28日 下午9:30,叁K <caox...@gmail.com> 写道:
> > MFC可以这样:
> > http://stackoverflow.com/questions/99623/how-to-draw-in-the-nonclient-area
> >
> > 请问Qt该怎么做?
> >
> > Qt应该没有预留这方面的机制,这是窗口管理器的事情。
> > 初步想通过预编译#ifdef Q_OS_WIN 这样的本地实现,
> > 至少先把windows下搞定,但是不知道从哪里下手。
> >
> > 提问之前我思考过,查过资料,搞不定……感谢!
> >

楼主能否把你的需求详述一下? nonclient-area是MS下的名词我没有用过,是不是指标题栏和边框? 你想重绘什么地方?

B.R
Kermit

叁K

chưa đọc,
18:23:34 29 thg 5, 201129/5/11
đến Qt中文
非常感谢,获得窗口句柄后重写哪个事件?
或者如何让windows调用我指定的函数(方法)进行绘制?

On 5月29日, 下午4时40分, Goldfish Huang <hgoldf...@gmail.com> wrote:
> 似乎可以通过winId()得到窗口句柄。然后应该就跟MFC差不多了吧。
>

> 在 2011年5月28日 下午9:30,叁K <caoxi...@gmail.com> 写道:> MFC可以这样:
> >http://stackoverflow.com/questions/99623/how-to-draw-in-the-nonclient...

叁K

chưa đọc,
18:37:47 29 thg 5, 201129/5/11
đến Qt中文
是的,就是指窗口frameGeometry()区域减去geometry()后的区域。
请见文档:http://doc.qt.nokia.com/4.7-snapshot/application-
windows.html#window-geometry
以及
示意图:http://doc.qt.nokia.com/4.7-snapshot/images/geometry.png

啰嗦部分:
通常由窗口管理器绘制。
一种方案是用setWindowFlags屏蔽非客户区,然后在客户区“伪造”一个
出来,让用户错觉新的标题栏和边框,但是任务栏点击发出的系统事件收不到。

一种方案就是如1楼stackoverflow那个例子(windows mfc),但是在Qt下不知道从哪里下口,
有预感要修改Qt源代码,但是GPL和LGPL的情况感觉蛋疼。

On 5月29日, 下午5时38分, Kermit <kermit....@gmail.com> wrote:
> On Sun, May 29, 2011 at 04:40:57PM +0800, Goldfish Huang wrote:
> > 似乎可以通过winId()得到窗口句柄。然后应该就跟MFC差不多了吧。
>

> > 在 2011年5月28日 下午9:30,叁K <caoxi...@gmail.com> 写道:
> > > MFC可以这样:
> > >http://stackoverflow.com/questions/99623/how-to-draw-in-the-nonclient...
>

Kermit

chưa đọc,
21:17:49 29 thg 5, 201129/5/11
đến qt-c...@googlegroups.com
On Sun, May 29, 2011 at 03:37:47PM -0700, 叁K wrote:
> 是的,就是指窗口frameGeometry()区域减去geometry()后的区域。
> 请见文档:http://doc.qt.nokia.com/4.7-snapshot/application-
> windows.html#window-geometry
> 以及
> 示意图:http://doc.qt.nokia.com/4.7-snapshot/images/geometry.png
>
> ??嗦部分:

> 通常由窗口管理器绘制。
> 一种方案是用setWindowFlags屏蔽非客户区,然后在客户区“伪造”一个
> 出来,让用户错觉新的标题栏和边框,但是任务栏点击发出的系统事件收不到。
>
> 一种方案就是如1楼stackoverflow那个例子(windows mfc),但是在Qt下不知道从哪里下口,
> 有预感要修改Qt源代码,但是GPL和LGPL的情况感觉蛋疼。

这个貌似应该是QStyle要解决的问题吧? 你看看QStyle相关文档有没有什么方案。

B.R
Kermit

Goldfish Huang

chưa đọc,
02:32:22 30 thg 5, 201130/5/11
đến qt-c...@googlegroups.com
稍微看了一下,Windows下的话,QWidget::winId()应该就是窗口的句柄,类型是HWND。可以通过QWidget::winEvent()处理Windows事件。

叁K

chưa đọc,
12:53:25 30 thg 5, 201130/5/11
đến Qt中文
感谢!

P.S 结贴了,也谢谢前面几位的帮助。

On 5月30日, 下午2时32分, Goldfish Huang <hgoldf...@gmail.com> wrote:
> 稍微看了一下,Windows下的话,QWidget::winId()应该就是窗口的句柄,类型是HWND。可以通过QWidget::winEvent()-处理Windows事件。

Lucian Feng

chưa đọc,
06:22:28 22 thg 5, 201422/5/14
đến qt-c...@googlegroups.com, caox...@gmail.com
see http://qt-project.org/forums/viewthread/3331/

在 2011年5月28日星期六UTC+8下午9时30分34秒,叁K写道:
Trả lời tất cả
Trả lời tác giả
Chuyển tiếp
0 tin nhắn mới