| 362 | } |
| 363 | |
| 364 | LRESULT CHexControl::OnVScroll(UINT, WPARAM wParam, LPARAM, BOOL&) { |
| 365 | SCROLLINFO si; |
| 366 | si.cbSize = sizeof(si); |
| 367 | si.fMask = SIF_ALL; |
| 368 | GetScrollInfo(SB_VERT, &si); |
| 369 | auto pos = si.nPos; |
| 370 | |
| 371 | switch (LOWORD(wParam)) { |
| 372 | case SB_TOP: |
| 373 | si.nPos = si.nMin; |
| 374 | break; |
| 375 | |
| 376 | case SB_BOTTOM: |
| 377 | si.nPos = si.nMax; |
| 378 | break; |
| 379 | |
| 380 | case SB_LINEUP: |
| 381 | si.nPos--; |
| 382 | break; |
| 383 | |
| 384 | case SB_LINEDOWN: |
| 385 | si.nPos++; |
| 386 | break; |
| 387 | |
| 388 | case SB_PAGEUP: |
| 389 | si.nPos -= si.nPage; |
| 390 | break; |
| 391 | |
| 392 | case SB_PAGEDOWN: |
| 393 | si.nPos += si.nPage; |
| 394 | break; |
| 395 | |
| 396 | case SB_THUMBTRACK: |
| 397 | si.nPos = si.nTrackPos; |
| 398 | break; |
| 399 | } |
| 400 | if (si.nPos != pos) { |
| 401 | si.fMask = SIF_POS; |
| 402 | SetScrollInfo(SB_VERT, &si); |
| 403 | GetScrollInfo(SB_VERT, &si); |
| 404 | m_StartOffset = si.nPos * m_BytesPerLine; |
| 405 | if (m_StartOffset + m_Lines * m_BytesPerLine >= m_Buffer->GetSize()) { |
| 406 | m_StartOffset = m_Buffer->GetSize() - (m_Lines - 1) * m_BytesPerLine; |
| 407 | if (m_StartOffset < 0) |
| 408 | m_StartOffset = 0; |
| 409 | m_StartOffset = m_StartOffset - m_StartOffset % m_BytesPerLine; |
| 410 | ATLASSERT(m_StartOffset >= 0); |
| 411 | } |
| 412 | m_EndOffset = m_StartOffset + m_Lines * m_BytesPerLine; |
| 413 | if (m_EndOffset > m_Buffer->GetSize()) |
| 414 | m_EndOffset = m_Buffer->GetSize(); |
| 415 | RedrawWindow(); |
| 416 | } |
| 417 | return 0; |
| 418 | } |
| 419 | |
| 420 | void CHexControl::RecalcLayout() { |
| 421 | if (m_Buffer == nullptr) { |