鱼C论坛

 找回密码
 立即注册
查看: 2308|回复: 1

关于ScrollWindow的问题

[复制链接]
发表于 2012-4-6 00:14:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  

{  

  static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;  

  HDC hdc ;  

  int i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ;  

  PAINTSTRUCT ps ;  

  SCROLLINFO si ;  

  TCHAR szBuffer[10] ;  

  TEXTMETRIC tm ;  

   

  switch (message)  

  {  

  case WM_CREATE:  

  hdc = GetDC (hwnd) ;  

   

  GetTextMetrics (hdc, &tm) ;  

  cxChar = tm.tmAveCharWidth ;  

  cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;  

  cyChar = tm.tmHeight + tm.tmExternalLeading ;  

   

  ReleaseDC (hwnd, hdc) ;  


  // Save the width of the three columns  

   

  iMaxWidth = 40 * cxChar + 22 * cxCaps ;  

  return 0 ;  

   

  case WM_SIZE:  

  cxClient = LOWORD (lParam) ;  

  cyClient = HIWORD (lParam) ;  


  // Set vertical scroll bar range and page size  


  si.cbSize = sizeof (si) ;  

  si.fMask = SIF_RANGE | SIF_PAGE ;  

  si.nMin = 0 ;  

  si.nMax = NUMLINES - 1 ;  

  si.nPage = cyClient / cyChar ;  

  SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;  


  // Set horizontal scroll bar range and page size  


  si.cbSize = sizeof (si) ;  

  si.fMask = SIF_RANGE | SIF_PAGE ;  

  si.nMin = 0 ;  

  si.nMax = 2 + iMaxWidth / cxChar ;  

  si.nPage = cxClient / cxChar ;  

  SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;  

  return 0;

  case WM_VSCROLL:  

  // Get all the vertial scroll bar information  


  si.cbSize = sizeof (si) ;  

  si.fMask = SIF_ALL ;  

  GetScrollInfo (hwnd, SB_VERT, &si) ;  


  // Save the position for comparison later on  


  iVertPos = si.nPos ;  


  switch (LOWORD (wParam))  

  {  

  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 (hwnd, SB_VERT, &si, TRUE) ;  

  GetScrollInfo (hwnd, SB_VERT, &si) ;  


  // If the position has changed, scroll the window and update it  


  if (si.nPos != iVertPos)  

  {   

  ScrollWindow (hwnd, 0, cyChar * (iVertPos - si.nPos),   

  NULL, NULL) ;  

  UpdateWindow (hwnd) ;  

  }  

  return 0 ;  

   
case WM_HSCROLL:  

  // Get all the vertial scroll bar information  


  si.cbSize = sizeof (si) ;  

  si.fMask = SIF_ALL ;  


  // Save the position for comparison later on  


  GetScrollInfo (hwnd, SB_HORZ, &si) ;  

  iHorzPos = si.nPos ;  


  switch (LOWORD (wParam))  

  {  

  case SB_LINELEFT:  

  si.nPos -= 1 ;  

  break ;  

   

  case SB_LINERIGHT:  

  si.nPos += 1 ;  

  break ;  

   

  case SB_PAGELEFT:  

  si.nPos -= si.nPage ;  

  break ;  

   

  case SB_PAGERIGHT:  

  si.nPos += si.nPage ;  

  break ;  

   

  case SB_THUMBPOSITION:  

  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 (hwnd, SB_HORZ, &si, TRUE) ;  

  GetScrollInfo (hwnd, SB_HORZ, &si) ;  

   

  // If the position has changed, scroll the window   


  if (si.nPos != iHorzPos)  

  {  

  ScrollWindow (hwnd, cxChar * (iHorzPos - si.nPos), 0,   

  NULL, NULL) ;  

  }  

  return 0 ;  

case WM_PAINT :

  hdc = BeginPaint (hwnd, &ps) ;  


  // Get vertical scroll bar position  


  si.cbSize = sizeof (si) ;  

  si.fMask = SIF_POS ;  

  GetScrollInfo (hwnd, SB_VERT, &si) ;  

  iVertPos = si.nPos ;  


  // Get horizontal scroll bar position  


  GetScrollInfo (hwnd, 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 (i = iPaintBeg ; i <= iPaintEnd ; i++)  

  {  

  x = cxChar * (1 - iHorzPos) ;  

  y = cyChar * (i - iVertPos) ;  

   

  TextOut (hdc, x, y,  

  sysmetrics.szLabel,  

  lstrlen (sysmetrics.szLabel)) ;  

   

  TextOut (hdc, x + 22 * cxCaps, y,  

  sysmetrics.szDesc,  

  lstrlen (sysmetrics.szDesc)) ;  

   

  SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;  

   

  TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer,  

  wsprintf (szBuffer, TEXT ( "%5d "),  

  GetSystemMetrics (sysmetrics.iIndex))) ;  

   

  SetTextAlign (hdc, TA_LEFT | TA_TOP) ;  

  }  


  EndPaint (hwnd, &ps) ;  

  return 0 ;  

   

  case WM_DESTROY :  

  PostQuitMessage (0) ;  

  return 0 ;  

  }  

  return DefWindowProc (hwnd, message, wParam, lParam) ;  

} 在WM_PAINT消息里面的无效客户区是哪个区域啊?请详细说明.iPaintBeg和iPaintEnd 是什么意思啊?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-6 00:15:20 | 显示全部楼层
有点长,大家复制到记事本讲就看一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 11:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表