Hi,
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.
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 ) {
cScrollFlag = 'Y';
ScrollWindow( hwnd, 0, -cyChar, &rect, &rect );
}
else {
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' ) {
TextOut( hdc, cxChar, iVertPos, szBuffer, lstrlen( szBuffer ) );
}
else {
TextOut( hdc, cxChar, iVertPos, szBuffer, lstrlen( szBuffer ) );
}
}
EndPaint( hwnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}
Note: I wanted to achieve this using raw Win32 functions but not re-implementing the same using MFC or some other advanced concepts.
Thanks