现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

关于GetWindowRect()、GetClientRect()和SetWindowRgn()的问题

2012-08-31 23:37 工业·编程 ⁄ 共 993字 ⁄ 字号 暂无评论

    最近在和同学做一个模拟时钟的程序,我们做的是基于对话框的,我想把对话框的形状做成圆形的,因为我们做的时钟外形就是圆形的,在其中我遇到了以下问题(在同学的帮助下都已解决):

下面是我在OninitDialog中添加的代码:

CRgn rgn;
CRect rect;
GetClientRect(rect);
rgn.CreateEllipticRgn(rect.left,rect.top,rect.right,rect.bottom);
SetWindowRgn(rgn,true);

可是运行后我发现这并不是我要的效果,因为这个圆形区域竟然包含了标题栏,而我想要的只是客户区,后来同学的实现方法就是在对话框属性设置中将边框一项选为无,再运行竟然达到了我想要的结果,真是很感谢。可是我很疑惑:难道GetClientRect()获得的不是客户区的矩形大小?对话框的客户区又是指哪一部分呢?经过一番思考及搜索之后得到如下启示:

一、客户区:

1。在一个MDI(多文档)应用程序中每个概念如下图所标示:

wps_clip_image-22739

wps_clip_image-3919

窗口框架的客户区就是指图中的灰色部分:即蓝色方框内区域,框架的非客户区就是指蓝色方框之外的窗口区域,包括程序图标,标题栏,菜单,最大最小/关闭按纽,左右两个框和底下的状态条.

  1. 视图的客户区就是指图中绿色部分:即红色方框内的区域,视图的非客户区就是指视图部分红色方框之外的区域,包括:文件图标,标题栏,三个按纽和两个滚动条.

  2. 从图中可以看出,工具栏(工具条)不属于框架的非客户区,它跟视图是框架客户区内的"兄弟".它也是一个窗口,读者不妨再拖拽工具条,它还可以拖出框架窗口区域.

  3. 因此,以后编程中,对于CClientDC,CWindowDC,GetClientDC(),GetWindowDC()应该可以很容易就区分开了.

  4. 至于在单文档中,每个概念所指的区域跟上面类似分析即可.

  5. 对话框中客户区是指:去除标题栏、菜单栏以及对话框边框的那部分。

二、GetWindowRect()、GetClientRect()和SetWindowRgn()的坐标问题

GetwindowRect()的原点是指整个窗口的左上角,而GetClientRect()的原点是指客户区的左上角,SetWindowRgn()的原点又是指整个窗口的左上角,这就解释了为什么在去除了标题栏和菜单栏后显示的才是我想要的结果,慢慢体会。(坐标原点选的不同)

给我留言

留言无头像?