Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

154 lines
3.2 KiB

#include "ulib.hxx"
#include "vscroll.hxx"
BOOLEAN
VERTICAL_TEXT_SCROLL::Initialize(
IN HWND WindowHandle,
IN INT NumLines,
IN INT ClientHeight,
IN INT ClientWidth,
IN INT CharHeight,
IN INT CharWidth
)
{
_client_height = ClientHeight;
_client_width = ClientWidth;
_char_height = CharHeight;
_char_width = CharWidth;
_scroll_position = 0;
return TRUE;
}
VOID
VERTICAL_TEXT_SCROLL::SetRange(
IN HWND WindowHandle,
IN INT NumLines
)
{
_num_lines = NumLines - _client_height/_char_height;
SetScrollRange(WindowHandle, SB_VERT, 0, _num_lines, FALSE);
}
VOID
VERTICAL_TEXT_SCROLL::ClientSize(
IN INT Height,
IN INT Width
)
{
_client_height = Height;
_client_width = Width;
}
VOID
VERTICAL_TEXT_SCROLL::ScrollUp(
IN HWND WindowHandle
)
{
_scroll_position--;
UpdateScrollPosition(WindowHandle);
}
VOID
VERTICAL_TEXT_SCROLL::ScrollDown(
IN HWND WindowHandle
)
{
_scroll_position++;
UpdateScrollPosition(WindowHandle);
}
VOID
VERTICAL_TEXT_SCROLL::PageUp(
IN HWND WindowHandle
)
{
_scroll_position -= _client_height/_char_height;
UpdateScrollPosition(WindowHandle);
}
VOID
VERTICAL_TEXT_SCROLL::PageDown(
IN HWND WindowHandle
)
{
_scroll_position += _client_height/_char_height;
UpdateScrollPosition(WindowHandle);
}
VOID
VERTICAL_TEXT_SCROLL::ThumbPosition(
IN HWND WindowHandle,
IN INT NewThumbPosition
)
{
_scroll_position = NewThumbPosition;
UpdateScrollPosition(WindowHandle);
}
VOID
VERTICAL_TEXT_SCROLL::UpdateScrollPosition(
IN HWND WindowHandle
)
{
INT current_pos;
current_pos = GetScrollPos(WindowHandle, SB_VERT);
_scroll_position = max(0, min(_scroll_position, _num_lines));
if (_scroll_position != current_pos) {
SetScrollPos(WindowHandle, SB_VERT, _scroll_position, TRUE);
ScrollWindow(WindowHandle, 0,
QueryCharHeight()*(current_pos - _scroll_position),
NULL, NULL);
UpdateWindow(WindowHandle);
}
}
STATIC TCHAR buf[1024];
VOID
VERTICAL_TEXT_SCROLL::WriteLine(
IN HDC DeviceContext,
IN INT LineNumber,
IN PTCHAR String
)
{
if( LineNumber >= QueryScrollPosition() &&
LineNumber <= QueryScrollPosition() + QueryClientHeight()/QueryCharHeight() + 1) {
CONST INT tabstop = 8;
INT pos, bufpos;
//
// Copy string into buf, expanding tabs into spaces as we go. This
// is because the window to which we are displaying does not do tabs.
//
for (pos = 0, bufpos = 0; String[pos] != '\0'; ++pos) {
if ('\t' == String[pos]) {
do {
buf[bufpos++] = ' ';
} while (0 != bufpos % tabstop);
continue;
}
buf[bufpos++] = String[pos];
}
buf[bufpos++] = '\0';
TextOut( DeviceContext,
0,
(LineNumber - QueryScrollPosition())*QueryCharHeight(),
buf,
wcslen( buf ) );
}
}