tempad
Readygo技术搜索引擎 >>游戏开发 >> 两个关于窗口Rect的问题,高手请进。

两个关于窗口Rect的问题,高手请进。

Readygo技术搜索引擎 网络搜索 efish 2008-1-17 2:00:39

两个关于窗口Rect的问题,高手请进。

楼主codewarrior(会思考的草)2004-03-25 13:25:14 在 VC/MFC / 基础类 提问

1,pMainFrame->GetClientRect,得到主框架窗口的客户区,有没有把工具条和状态栏的矩形算在内?如果要想得到实际可见的客户区大小(就是扣除上下左右停靠的各种bar以及状态栏然),有没有什么简便的方法?  
  2,我在DLL中得到主框架指针pMainFrame,进而通过GetMessageBar得到StatusBar的指针,但是为什么pStatusBar->GetWindowRect总是返回一个size为0的矩形? 问题点数:50、回复次数:19Top

1 楼codewarrior(会思考的草)回复于 2004-03-25 14:44:27 得分 0

自己upTop

2 楼icenl(成冈【我不要分,不要给我】)回复于 2004-03-25 14:53:07 得分 5

GetCleentRect()得到的应该就是实际可见的客户区大小吧Top

3 楼NomaD2003(多耐特)回复于 2004-03-25 14:54:02 得分 5

GetClientRect只是到客户区的范围,不包括工具栏和状态栏,如果想得到实际可见的客户区用它就行了。下一个不知道,UP一下吧Top

4 楼codewarrior(会思考的草)回复于 2004-03-25 17:24:06 得分 0

自己再upTop

5 楼hanzp(木瓜.COM)回复于 2004-03-25 17:26:44 得分 5

你pStatusBar->GetWindowRect()返回值成功吗,不成功的话GetLastError()试试Top

6 楼icenl(成冈【我不要分,不要给我】)回复于 2004-03-25 17:46:32 得分 5

我在UI线程中也遇到了你第二个问题同样的麻烦,期待高手Top

7 楼codewarrior(会思考的草)回复于 2004-03-26 08:29:41 得分 0

GetLastError返回0。  
  自己再UP。一定是和实例句柄有关。Top

8 楼ymbymb(毛病大哥)回复于 2004-03-26 08:37:45 得分 10

1.GetClientRect   得到的客户区不包括框架,即不包括工具条,状态条等Top

9 楼codewarrior(会思考的草)回复于 2004-03-26 08:40:18 得分 0

很多人都这么说,我自己以前也是一直这么认为的。但是我算出来的rect,确确实实包含工具条和状态栏。这是不是和我用pMainFrame的指针调用有关呢?Top

10 楼mintwlf(Programmer)回复于 2004-03-26 08:41:18 得分 5

主框架是在VC的MFC库中初始化的,你的DLL中并没有初始化,所以没有statusbar之类的信息,通过GetMessageBar得到的StatusBar指针相当于新创建的Bar,  
  pStatusBar->GetWindowRect就是获得空的状态栏区域。Top

11 楼codewarrior(会思考的草)回复于 2004-03-26 08:46:22 得分 0

那有什么办法解决吗?Top

12 楼rnl(rnl)回复于 2004-03-26 08:57:23 得分 5

1.包括工具栏和状态栏的区域;调用CView的GetClientRect  
  2.可以尝试一下这样得到状态栏的指针  
  CWnd   *pStaWnd=AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);  
  然后在调用GetWindowRectTop

13 楼codewarrior(会思考的草)回复于 2004-03-26 09:18:28 得分 0

早就试验过了,一样是size为0Top

14 楼codewarrior(会思考的草)回复于 2004-03-26 09:21:48 得分 0

我的代码如下,奇怪的是同样的mainframe,我用pFrame->GetWindowRect可以得到正确的窗口大小,而下一步的pStatus->GetClientRect就出错。但是pStatus确实指向了一个CStatusBar对象,其句柄,已经GetLastError都没有错。但是大小就是不对。  
   
  CFrameWnd*   pFrame   =   (CFrameWnd*)AfxGetMainWnd();  
  ASSERT_KINDOF(CFrameWnd,   pFrame);  
   
  rectClient.SetRectEmpty();  
  pFrame->GetClientRect(&rectClient);  
   
  CRect   rectStatusbar(0,0,0,0);  
   
  //CStatusBar*   pStatus   =   (CStatusBar*)pFrame->GetDescendantWindow(AFX_IDW_STATUS_BAR);  
  //CStatusBar*   pStatus   =   (CStatusBar*)pFrame->GetMessageBar();  
  pStatus->GetWindowRect(&rectStatusbar);  
  Top

15 楼888atao(阿涛)回复于 2004-03-26 09:26:55 得分 5

EnumChildWindows得到ScrollBar的hwnd  
  GetWindowRect取出ScrollBar的矩形  
  从GetClientRect中减去CScrollBar的矩形就可以了  
  Top

16 楼codewarrior(会思考的草)回复于 2004-03-26 10:13:48 得分 0

再UP!Top

17 楼codewarrior(会思考的草)回复于 2004-03-26 11:41:27 得分 0

现在的问题是,同样的MainFrame的指针,我取得MainFrame的Client   Rectangle就是正确的,但是取得Status   Bar的rectangle就是size为0。Top

18 楼codewarrior(会思考的草)回复于 2004-03-26 12:56:08 得分 0

再顶!解决不了我就一直顶。Top

19 楼digerati(阿土瓜)回复于 2004-03-29 11:35:18 得分 5

对于第一个问题:  
   
  你应该取得VIEW的客户区吧?VIEW的客户区就是去处了所有BAR的  
   
  Frame里面应该有个GetActiveView()取得VIEW指针吧,  
   
  你也可以在FRAME定义一个内部成员,在VIEW生成的时候把指针赋给它。。  
   
  Top

责任编辑: efish 参与评论 查找更多:
相关文章
原来的公司找到了个好项目,叫我回去,我该怎么办?… 原来的公司找到了个好项目,叫我回去,我该怎么办???
请大家帮忙!.net的示例程序在我这里为什么不能运行? 请大家帮忙!.net的示例程序在我这里为什么不能运行?
北京高校处女排行榜 北京高校处女排行榜
大家帮忙看看符合这个schema的XML文件该怎样写? 大家帮忙看看符合这个schema的XML文件该怎样写?
程序报错为:PL/SQL: 数字或值错误 : 字符串缓冲区太… 程序报错为:PL/SQL: 数字或值错误 : 字符串缓冲区太小
关于表单的保存问题!(内详) 关于表单的保存问题!(内详)
(求助)Tomcat配置连接池问题?迷惑~~(在线等) (求助)Tomcat配置连接池问题?迷惑~~(在线等)
关于 散分帖子之十二的分(给 {猛禽} 的200分) 关于 散分帖子之十二的分(给 {猛禽} 的200分)
怎么将vb声明转为C#的声明 怎么将vb声明转为C#的声明
sysdba、sysoper、normal在登陆connect as时的区别?… sysdba、sysoper、normal在登陆connect as时的区别?谢谢!
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎