📄 subject_17093.htm
字号:
<p>
序号:17093 发表者:FullMoon 发表日期:2002-10-08 13:09:24
<br>主题:问几个简单问题
<br>内容:我在作程序时遇到几个小问题,不知如何解决:<BR>1、在多文档窗口里,如何让子窗口在创建时最大化。<BR>2、在子窗口最大化时,似乎不发送刷新背景的消息。<BR>3、用SetScrollInfo时,结构里的nPage具体是什么意思,我试过整个文档尺寸的大小、每页大小,但都不对,显示出来的拇指块有整个滚动条大,很奇怪。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:徐景周 回复日期:2002-10-08 13:36:01
<br>内容:在子窗体childFrame中的OnCreate中加入ModifyStyle(NULL,WS_MAXIMIZEBOX);<BR>滚动条操作可参看:<BR> 在WM_CREATE消息里取得字符尺寸大小等信息。 int CSView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here//这段程序用来获取字符的宽度、高度等信息 CDC* pDC=GetDC(); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); cxChar = tm.tmAveCharWidth ; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ; cyChar = tm.tmHeight + tm.tmExternalLeading ; // Save the width of the three columns iMaxWidth = 40 * cxChar + 22 * cxCaps ; ReleaseDC(pDC);<BR> return 0;} b) 在WM_SIZE消息里设置SCROLLINFO。void CSView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy);// TODO: Add your message handler code here//当窗口大小发生改变时,将滚动页面的大小设置为窗口大小 cxClient=cx; cyClient=cy; si.fMask = SIF_RANGE | SIF_PAGE ; si.nMin = 0 ; si.nMax = NUMLINES - 1 ; si.nPage = cyClient / cyChar ; SetScrollInfo (SB_VERT, &si, TRUE) ; si.fMask = SIF_RANGE | SIF_PAGE ; si.nMin = 0 ; si.nMax = 2 + iMaxWidth / cxChar ; si.nPage = cxClient / cxChar ; SetScrollInfo (SB_HORZ, &si, TRUE) ; <BR>} c) 在WM_VSCROLL里获得滚动条的位置iVertPos,对相应的滚动操作做相应的计算得到滚动条位置的变化量;设置SCROLLINFO,如果iVertPos和新设置的SCROLLINFO里保存的滚动条的位置不等,则滚动窗口,更新窗口。void CSView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here and/or call default si.fMask = SIF_ALL ; GetScrollInfo (SB_VERT, &si) ; // Save the position for comparison later on iVertPos = si.nPos ; switch (nSBCode) { case SB_TOP: si.nPos = si.nMin ; break ; case SB_BOTTOM: si.nPos = si.nMax ; break ; case SB_LINEUP: si.nPos -= 1 ; break ; case SB_LINEDOWN: si.nPos += 1 ; break ; case SB_PAGEUP: si.nPos -= si.nPage ; break ; case SB_PAGEDOWN: si.nPos += si.nPage ; break ; case SB_THUMBTRACK: si.nPos = si.nTrackPos ; break ; default: break ; }// Set the position and then retrieve it. Due to adjustments// by Windows it may not be the same as the value set. si.fMask = SIF_POS ; SetScrollInfo (SB_VERT, &si, TRUE) ; GetScrollInfo (SB_VERT, &si) ;// If the position has changed, scroll the window and update it if (si.nPos != iVertPos) { ScrollWindow (0, cyChar * (iVertPos - si.nPos), NULL, NULL) ; UpdateWindow () ; }<BR> } d) 在WM_PAINT里取得滚动条的位置,计算客户区待重绘区域所对应的绘画内容,对该部分进行正确的绘画。读者对于下面for循环里面的内容可以先忽略,只要知道它是怎样的输出格式就可以了。void CSView::OnPaint() { // TODO: Add your message handler code here PAINTSTRUCT ps; CDC* pDC=BeginPaint(&ps); si.fMask = SIF_POS ; GetScrollInfo (SB_VERT, &si) ; iVertPos = si.nPos ; int x,y; // Get horizontal scroll bar position GetScrollInfo (SB_HORZ, &si) ; iHorzPos = si.nPos ; // Find painting limits iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ; iPaintEnd = min (NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar) ; for (int i = iPaintBeg ; i <= iPaintEnd ; i++) { x = cxChar * (1 - iHorzPos) ; y = cyChar * (i - iVertPos) ; pDC->TextOut (x, y, sysmetrics[i].szLabel, lstrlen (sysmetrics[i].szLabel)) ; pDC->TextOut (x + 22 * cxCaps, y, sysmetrics[i].szDesc, lstrlen (sysmetrics[i].szDesc)) ; pDC->SetTextAlign (TA_RIGHT | TA_TOP) ; pDC->TextOut (x + 22 * cxCaps + 40 * cxChar, y, szBuffer, wsprintf (szBuffer, TEXT ("%5d"), GetSystemMetrics (sysmetrics[i].iIndex))) ; pDC->SetTextAlign (TA_LEFT | TA_TOP) ; } <BR>} 2. 总结首先初始化SCROLLINFO(WM_CREATE、WM_SIZE),当用户进行滚动操作时,对滚动量进行正确的计算(WM_VSCROLL、WM_HSCROLL),滚动窗口(WM_VSCROLL),对无效区域进行重绘(WM_PAINT)。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:龙龙 回复日期:2002-10-10 11:04:08
<br>内容:这么多..不知怎么看才好.等会再来.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -