两个关于窗口Rect的问题,高手请进。
两个关于窗口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
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn
