⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_17093.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp; 在WM_CREATE消息里取得字符尺寸大小等信息。 int CSView::OnCreate(LPCREATESTRUCT lpCreateStruct) {&nbsp;&nbsp;&nbsp;&nbsp;if (CView::OnCreate(lpCreateStruct) == -1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your specialized creation code here//这段程序用来获取字符的宽度、高度等信息&nbsp;&nbsp;&nbsp;&nbsp;CDC* pDC=GetDC();&nbsp;&nbsp;&nbsp;&nbsp;TEXTMETRIC tm;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;GetTextMetrics(&tm);&nbsp;&nbsp;&nbsp;&nbsp;cxChar = tm.tmAveCharWidth ;&nbsp;&nbsp;&nbsp;&nbsp;cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;&nbsp;&nbsp;&nbsp;&nbsp;cyChar = tm.tmHeight + tm.tmExternalLeading ;&nbsp;&nbsp;&nbsp;&nbsp;// Save the width of the three columns&nbsp;&nbsp;&nbsp;&nbsp;iMaxWidth = 40 * cxChar + 22 * cxCaps ;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(pDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;} b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在WM_SIZE消息里设置SCROLLINFO。void CSView::OnSize(UINT nType, int cx, int cy) {&nbsp;&nbsp;&nbsp;&nbsp;CView::OnSize(nType, cx, cy);// TODO: Add your message handler code here//当窗口大小发生改变时,将滚动页面的大小设置为窗口大小&nbsp;&nbsp;&nbsp;&nbsp;cxClient=cx;&nbsp;&nbsp;&nbsp;&nbsp;cyClient=cy;&nbsp;&nbsp;&nbsp;&nbsp;si.fMask&nbsp;&nbsp;= SIF_RANGE | SIF_PAGE ;&nbsp;&nbsp;&nbsp;&nbsp;si.nMin&nbsp;&nbsp; = 0 ;&nbsp;&nbsp;&nbsp;&nbsp;si.nMax&nbsp;&nbsp; = NUMLINES - 1 ;&nbsp;&nbsp;&nbsp;&nbsp;si.nPage&nbsp;&nbsp;= cyClient / cyChar ;&nbsp;&nbsp;&nbsp;&nbsp;SetScrollInfo (SB_VERT, &si, TRUE) ;&nbsp;&nbsp;&nbsp;&nbsp; si.fMask&nbsp;&nbsp;= SIF_RANGE | SIF_PAGE ;&nbsp;&nbsp;&nbsp;&nbsp;si.nMin&nbsp;&nbsp; = 0 ;&nbsp;&nbsp;&nbsp;&nbsp;si.nMax&nbsp;&nbsp; = 2 + iMaxWidth / cxChar ;&nbsp;&nbsp;&nbsp;&nbsp;si.nPage&nbsp;&nbsp;= cxClient / cxChar ;&nbsp;&nbsp;&nbsp;&nbsp;SetScrollInfo (SB_HORZ, &si, TRUE) ;&nbsp;&nbsp;<BR>} c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在WM_VSCROLL里获得滚动条的位置iVertPos,对相应的滚动操作做相应的计算得到滚动条位置的变化量;设置SCROLLINFO,如果iVertPos和新设置的SCROLLINFO里保存的滚动条的位置不等,则滚动窗口,更新窗口。void CSView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {&nbsp;&nbsp;&nbsp;&nbsp;CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here and/or call default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.fMask&nbsp;&nbsp;= SIF_ALL ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetScrollInfo (SB_VERT, &si) ; // Save the position for comparison later on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iVertPos = si.nPos ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (nSBCode)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case SB_TOP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos = si.nMin ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SB_BOTTOM:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos = si.nMax ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SB_LINEUP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos -= 1 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SB_LINEDOWN:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos += 1 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SB_PAGEUP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos -= si.nPage ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SB_PAGEDOWN:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos += si.nPage ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SB_THUMBTRACK:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si.nPos = si.nTrackPos ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }// Set the position and then retrieve it.&nbsp;&nbsp;Due to adjustments//&nbsp;&nbsp; by Windows it may not be the same as the value set.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.fMask = SIF_POS ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetScrollInfo (SB_VERT, &si, TRUE) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetScrollInfo (SB_VERT, &si) ;// If the position has changed, scroll the window and update it&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (si.nPos != iVertPos)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScrollWindow (0, cyChar * (iVertPos - si.nPos),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL, NULL) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateWindow () ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR> } d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在WM_PAINT里取得滚动条的位置,计算客户区待重绘区域所对应的绘画内容,对该部分进行正确的绘画。读者对于下面for循环里面的内容可以先忽略,只要知道它是怎样的输出格式就可以了。void CSView::OnPaint() {&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Add your message handler code here&nbsp;&nbsp;&nbsp;&nbsp;PAINTSTRUCT ps;&nbsp;&nbsp;&nbsp;&nbsp;CDC* pDC=BeginPaint(&ps);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.fMask&nbsp;&nbsp;= SIF_POS ;&nbsp;&nbsp;&nbsp;&nbsp;GetScrollInfo (SB_VERT, &si) ;&nbsp;&nbsp;&nbsp;&nbsp;iVertPos = si.nPos ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x,y;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Get horizontal scroll bar position&nbsp;&nbsp;&nbsp;&nbsp;GetScrollInfo (SB_HORZ, &si) ;&nbsp;&nbsp;&nbsp;&nbsp;iHorzPos = si.nPos ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Find painting limits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;&nbsp;&nbsp;&nbsp;&nbsp;iPaintEnd = min (NUMLINES - 1,&nbsp;&nbsp;&nbsp;&nbsp;iVertPos + ps.rcPaint.bottom / cyChar) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = iPaintBeg ; i &lt;= iPaintEnd ; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = cxChar * (1 - iHorzPos) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = cyChar * (i - iVertPos) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;TextOut (x, y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysmetrics[i].szLabel,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lstrlen (sysmetrics[i].szLabel)) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;TextOut (x + 22 * cxCaps, y,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysmetrics[i].szDesc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lstrlen (sysmetrics[i].szDesc)) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetTextAlign (TA_RIGHT | TA_TOP) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;TextOut (x + 22 * cxCaps + 40 * cxChar, y, szBuffer,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf (szBuffer, TEXT ("%5d"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSystemMetrics (sysmetrics[i].iIndex))) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetTextAlign (TA_LEFT | TA_TOP) ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} 2.&nbsp;&nbsp;总结首先初始化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 + -