I have written a small C program using win32 functions.
I want to basically enable the line buffering. For ex: when the text reaches to the end of the window, i want to scroll the text to one line above then then print the next line to the end of the window.
Problem: I am able to scroll the text up when i reach to the end of the window but i m unable to see the next lines being printed to the end of the window.
Can you please point out the flaw in my code.
Collapse | Copy Code
Code:
// code for your reference //
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
static cxChar, cyChar, cxClient, cyClient, iVertPos = 0, iCnt = 0;
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
static RECT rect;
static TCHAR cCh, cScrollFlag = 'N';
TCHAR szBuffer[30];
switch( message )
{
case WM_CREATE:
hdc = GetDC( hwnd );
GetTextMetrics( hdc, &tm );
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight;
ReleaseDC( hwnd, hdc );
break;
case WM_SIZE:
cxClient = LOWORD( lParam );
cyClient = HIWORD( lParam );
rect.left = cxChar;
rect.right = cxClient;
rect.top = cyChar;
rect.bottom = cyClient;
InvalidateRect( hwnd, &rect, TRUE );
break;
case WM_CHAR:
cCh = wParam;
iVertPos = ++iCnt * cyChar;
if( iVertPos >= cyClient ) // reached to the end of the window //
{
cScrollFlag = 'Y';
ScrollWindow( hwnd, 0, -cyChar, &rect, &rect );
}
else // did not reach to the end of the window //
{
InvalidateRect( hwnd, &rect, FALSE );
cScrollFlag = 'N';
}
break;
case WM_PAINT:
hdc = BeginPaint( hwnd, &ps );
wsprintf( szBuffer, TEXT("[%2d] Key pressed: %c, current pos: %d"), iCnt, cCh, iVertPos );
if( iVertPos )
{
if( cScrollFlag == 'Y' ) // if scrolling required //
{
TextOut( hdc, cxChar, iVertPos, szBuffer, lstrlen( szBuffer ) );
}
else // scroll not required //
{
TextOut( hdc, cxChar, iVertPos, szBuffer, lstrlen( szBuffer ) );
}
}
EndPaint( hwnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}
//
Thanks
