Помогите сделать нормальную перерисовку

. Сделал как показано не ниже но все передергивается и моргает. Ещё вопрос кто-нибудь делал прокрутку по Петзолду? Как избавиться от отступа сверху?? Знаю место где оно задается но как убрать????
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
INT NUMLINES = 0;
HANDLE hFile = NULL;
HANDLE hFileMapping = NULL;
PCHAR pbFile = NULL;
DWORD size = 0;
TCHAR cCaptionDefault[] = "Hex";
TCHAR strf_mem[] = "00000000";
TCHAR strf_file[] = "0000000000000000";
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc = NULL ;
PAINTSTRUCT ps ;
// RECT rect ;
HMENU hMenu, hSubMenu ;
static INT cxChar, cyChar, cxClient, cyClient, iMaxWidth,
iVscrollPos, iVscrollMax, iHscrollPos, iHscrollMax;
static LOGFONT lf;
static HFONT hfont, hfOldFont;
TEXTMETRIC tm;
INT j, x, y, iPaintBeg, iPaintEnd, iVscrollInc, iHscrollInc;
DWORD cTextOld = 0, cBkOld = 0;
static INT iSelect = 0;
static INT xPosBeg = 0, yPosBeg = 0,
xPosEnd = 0, yPosEnd = 0;
switch (iMsg)
{
case WM_CREATE : {
hMenu = CreateMenu();
SetMenu(hWnd, hMenu);
hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_FILE_OPEN, "&Открыть ...");
AppendMenu(hSubMenu, MF_SEPARATOR, 0, 0);
AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "В&ыход");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Файл");
hdc = GetDC(hWnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading; // здесь !!!!!!!!
ReleaseDC(hWnd, hdc);
iMaxWidth = 88 * cxChar;
}
return 0 ;
case WM_SIZE :
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
iVscrollMax = max(0, NUMLINES + 2 - cyClient / cyChar);
iVscrollPos = min(iVscrollPos, iVscrollMax);
SetScrollRange(hWnd, SB_VERT, 0, iVscrollMax, FALSE);
SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
iHscrollMax = max(0, 2 +(iMaxWidth - cxClient) / cxChar);
iHscrollPos = min(iHscrollPos, iHscrollMax);
SetScrollRange(hWnd, SB_HORZ, 0, iHscrollMax, FALSE);
SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
return 0;
case WM_VSCROLL :
switch(LOWORD(wParam))
{
case SB_TOP :
iVscrollInc = -iVscrollPos;
break;
case SB_BOTTOM :
iVscrollInc = iVscrollMax - iVscrollPos;
break;
case SB_LINEUP :
iVscrollInc = -1;
break;
case SB_LINEDOWN :
iVscrollInc = 1;
break;
case SB_PAGEUP :
iVscrollInc = min(-1, -cyClient / cyChar);
break;
case SB_PAGEDOWN :
iVscrollInc = max(1, cyClient / cyChar);
break;
case SB_THUMBTRACK :
iVscrollInc = HIWORD(wParam) - iVscrollPos;
break;
default :
iVscrollInc = 0;
}
iVscrollInc = max(-iVscrollPos, min(iVscrollInc, iVscrollMax - iVscrollPos));
if (iVscrollInc != 0)
{
iVscrollPos += iVscrollInc;
ScrollWindow(hWnd, 0, -cyChar * iVscrollInc, NULL, NULL);
SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
UpdateWindow(hWnd);
}
return 0;
case WM_HSCROLL :
switch(LOWORD(wParam))
{
case SB_LINEUP :
iHscrollInc = -1;
break;
case SB_LINEDOWN :
iHscrollInc = 1;
break;
case SB_PAGEUP :
iHscrollInc = -8;
break;
case SB_PAGEDOWN :
iHscrollInc = 8;
break;
case SB_THUMBPOSITION :
iHscrollInc = HIWORD(wParam) - iHscrollPos;
break;
default :
iHscrollInc = 0;
}
iHscrollInc = max(-iHscrollPos, min(iHscrollInc, iHscrollMax - iHscrollPos));
if (iHscrollInc != 0)
{
iHscrollPos += iHscrollInc;
ScrollWindow(hWnd, -cxChar * iHscrollInc, 0, NULL, NULL);
SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
}
return 0;
case WM_LBUTTONDOWN :
if (hFile) {
iSelect = 1;
RECT rect;
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, &rect, TRUE);
SendMessage(hWnd, WM_PAINT, wParam, lParam);
}
return 0;
case WM_MOUSEMOVE :
if (hFile) {
if (wParam == MK_LBUTTON) {
iSelect = 2;
RECT rect;
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, &rect, TRUE);
SendMessage(hWnd, WM_PAINT, wParam, lParam);
}
}
return 0;
case WM_RBUTTONUP :
return 0;
case WM_PAINT :
hdc = BeginPaint (hWnd, &ps) ;
lf.lfCharSet = SHIFTJIS_CHARSET;
lf.lfPitchAndFamily = FIXED_PITCH;
hfont = CreateFontIndirect(&lf);
if(hfont)
{
INT i = 0, mem = 0x00;
DWORD offset = 0;
hfOldFont = (HFONT)SelectObject(hdc, (HGDIOBJ)hfont);
iPaintBeg = max(0, iVscrollPos + ps.rcPaint.top / cyChar - 1);
iPaintEnd = min(NUMLINES, iVscrollPos + ps.rcPaint.bottom / cyChar);
for(j = iPaintBeg; j < iPaintEnd; j++)
{
x = cxChar *(1 - iHscrollPos);
y = cyChar *(1 - iVscrollPos + j);
// if (iVscrollPos == 0) { GetTextMetrics(hdc, &tm); y -= tm.tmHeight; }
offset = j * 16;
mem = j * 0x10;
if (offset < size)
{
wsprintf(strf_mem, "%08X:", mem);
TextOut(hdc, x, y, strf_mem, 9);
//INT t = iSelect;
if (iSelect == 1) {
xPosBeg = LOWORD(lParam);
yPosBeg = HIWORD(lParam);
}
if (iSelect == 2) {
xPosEnd = LOWORD(lParam);
yPosEnd = HIWORD(lParam);
if (yPosBeg > yPosEnd) {
INT tPos = yPosBeg;
yPosBeg = yPosEnd;
yPosEnd = tPos;
}
if ((y >= yPosBeg)&&(y <= yPosEnd)) {
/* if ((x >= xPosBeg)&&(x <= xPosEnd)) {
TextOut(hdc, x + 480, y, strf_file, 16);
}
else {
*/ cTextOld = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
cBkOld = SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
TextOut(hdc, x + 480, y, strf_file, 16);
SetTextColor(hdc, cTextOld);
SetBkColor(hdc, cBkOld);
// }
}
else {
TextOut(hdc, x + 480, y, strf_file, 16);
}
}
else {
TextOut(hdc, x + 480, y, strf_file, 16);
}
}
}
SelectObject(hdc, hfOldFont);
DeleteObject(hfont);
}
EndPaint (hWnd, &ps) ;
return 0 ;
case WM_COMMAND :
switch(LOWORD(wParam)) {
case ID_FILE_OPEN: {
// открываем и map'им файл
}
break;
case ID_FILE_EXIT:
PostQuitMessage(0);
}
return 0 ;
case WM_CLOSE :
DestroyWindow(hWnd);
return 0 ;
case WM_DESTROY :
UnmapViewOfFile(pbFile);
CloseHandle(hFileMapping);
CloseHandle(hFile);
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hWnd, iMsg, wParam, lParam) ;
}
<< RSDN@Home 1.1.4 stable rev. 510>>