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

. Сделал как показано не ниже но все передергивается и моргает. Ещё вопрос кто-нибудь делал прокрутку по Петзолду? Как избавиться от отступа сверху?? Знаю место где оно задается но как убрать????
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>>
Здравствуйте, SpLove, Вы писали:
SL>Помогите сделать нормальную перерисовку
. Сделал как показано не ниже но все передергивается и моргает. Ещё вопрос кто-нибудь делал прокрутку по Петзолду? Как избавиться от отступа сверху?? Знаю место где оно задается но как убрать????
Чтот такое "Петзолд" я не знаю, но рисование без маргания вот
void DrawOffScreen(RECT rcPaint)
{
PAINTSTRUCT ps;
::BeginPaint(hWnd, &ps);
HDC hDC = ::CreateCompatibleDC(ps.m_hDC);
//HBITMAP hBmp = ::CreateCompatibleBitmap(ps.m_hDC, MaxWidth+1, MaxHeidth+1);
HBITMAP hBmp = ::CreateCompatibleBitmap(ps.m_hDC, rcPaint.right - rcPaint.left, rcPaint.bottom - rcPaint.top);
HBITMAP hPrevBmp = (HBITMAP)::SelectObject(hDC, hBmp);
// Clearing
HBRUSH brush = CreateSolidBrush(ColorBackGround);
HBRUSH OldBrush = (HBRUSH)SelectObject( hDC, brush);// can store brush
ExtFloodFill(hDC,0,0,ColorBackGround,FLOODFILLBORDER);
//DeleteObject(brush);
//brush = CreateSolidBrush(RGB(255,255,255));
SelectObject( hDC, brush);
DeleteObject(brush);
// shift origin, allows to use window client coords instead of using hBmp-relative coords
::SetWindowOrgEx(hDC, rcPaint.left, rcPaint.top, NULL);
//////////////////////////////////////////
// Draw here
//////////////////////////////////////////
::SetWindowOrgEx(hDC, 0, 0, NULL);
::BitBlt(ps.m_hDC, rcPaint.left, rcPaint.top,
rcPaint.right - rcPaint.left, rcPaint.bottom - rcPaint.top,
hDC, 0, 0, SRCCOPY);
::SelectObject(hDC, hPrevBmp);
::DeleteObject(hBmp);
::DeleteDC(hDC);
::EndPaint(hWnd, &ps);
}
Здравствуйте, SpLove, Вы писали:
SL>Помогите сделать нормальную перерисовку
. Сделал как показано не ниже но все передергивается и моргает. Ещё вопрос кто-нибудь делал прокрутку по Петзолду? Как избавиться от отступа сверху?? Знаю место где оно задается но как убрать????
SL>SL>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
SL>INT NUMLINES = 0;
SL>HANDLE hFile = NULL;
SL>HANDLE hFileMapping = NULL;
SL>PCHAR pbFile = NULL;
SL>DWORD size = 0;
SL>TCHAR cCaptionDefault[] = "Hex";
SL>TCHAR strf_mem[] = "00000000";
SL>TCHAR strf_file[] = "0000000000000000";
SL>int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
SL> PSTR szCmdLine, int iCmdShow)
SL>{
SL>}
SL>LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
SL>{
SL> HDC hdc = NULL ;
SL> PAINTSTRUCT ps ;
SL>// RECT rect ;
SL> HMENU hMenu, hSubMenu ;
SL> static INT cxChar, cyChar, cxClient, cyClient, iMaxWidth,
SL> iVscrollPos, iVscrollMax, iHscrollPos, iHscrollMax;
SL> static LOGFONT lf;
SL> static HFONT hfont, hfOldFont;
SL> TEXTMETRIC tm;
SL> INT j, x, y, iPaintBeg, iPaintEnd, iVscrollInc, iHscrollInc;
SL> DWORD cTextOld = 0, cBkOld = 0;
SL> static INT iSelect = 0;
SL> static INT xPosBeg = 0, yPosBeg = 0,
SL> xPosEnd = 0, yPosEnd = 0;
SL> switch (iMsg)
SL> {
SL> case WM_CREATE : {
SL> hMenu = CreateMenu();
SL> SetMenu(hWnd, hMenu);
SL> hSubMenu = CreatePopupMenu();
SL> AppendMenu(hSubMenu, MF_STRING, ID_FILE_OPEN, "&Открыть ...");
SL> AppendMenu(hSubMenu, MF_SEPARATOR, 0, 0);
SL> AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "В&ыход");
SL> AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Файл");
SL> hdc = GetDC(hWnd);
SL> GetTextMetrics(hdc, &tm);
SL> cxChar = tm.tmAveCharWidth;
SL> cyChar = tm.tmHeight + tm.tmExternalLeading; // здесь !!!!!!!!
SL> ReleaseDC(hWnd, hdc);
SL> iMaxWidth = 88 * cxChar;
SL> }
SL> return 0 ;
SL> case WM_SIZE :
SL> cxClient = LOWORD(lParam);
SL> cyClient = HIWORD(lParam);
SL> iVscrollMax = max(0, NUMLINES + 2 - cyClient / cyChar);
SL> iVscrollPos = min(iVscrollPos, iVscrollMax);
SL> SetScrollRange(hWnd, SB_VERT, 0, iVscrollMax, FALSE);
SL> SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
SL> iHscrollMax = max(0, 2 +(iMaxWidth - cxClient) / cxChar);
SL> iHscrollPos = min(iHscrollPos, iHscrollMax);
SL> SetScrollRange(hWnd, SB_HORZ, 0, iHscrollMax, FALSE);
SL> SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
SL> return 0;
SL> case WM_VSCROLL :
SL> switch(LOWORD(wParam))
SL> {
SL> case SB_TOP :
SL> iVscrollInc = -iVscrollPos;
SL> break;
SL> case SB_BOTTOM :
SL> iVscrollInc = iVscrollMax - iVscrollPos;
SL> break;
SL> case SB_LINEUP :
SL> iVscrollInc = -1;
SL> break;
SL> case SB_LINEDOWN :
SL> iVscrollInc = 1;
SL> break;
SL> case SB_PAGEUP :
SL> iVscrollInc = min(-1, -cyClient / cyChar);
SL> break;
SL> case SB_PAGEDOWN :
SL> iVscrollInc = max(1, cyClient / cyChar);
SL> break;
SL> case SB_THUMBTRACK :
SL> iVscrollInc = HIWORD(wParam) - iVscrollPos;
SL> break;
SL> default :
SL> iVscrollInc = 0;
SL> }
SL> iVscrollInc = max(-iVscrollPos, min(iVscrollInc, iVscrollMax - iVscrollPos));
SL> if (iVscrollInc != 0)
SL> {
SL> iVscrollPos += iVscrollInc;
SL> ScrollWindow(hWnd, 0, -cyChar * iVscrollInc, NULL, NULL);
SL> SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
SL> UpdateWindow(hWnd);
SL> }
SL> return 0;
SL> case WM_HSCROLL :
SL> switch(LOWORD(wParam))
SL> {
SL> case SB_LINEUP :
SL> iHscrollInc = -1;
SL> break;
SL> case SB_LINEDOWN :
SL> iHscrollInc = 1;
SL> break;
SL> case SB_PAGEUP :
SL> iHscrollInc = -8;
SL> break;
SL> case SB_PAGEDOWN :
SL> iHscrollInc = 8;
SL> break;
SL> case SB_THUMBPOSITION :
SL> iHscrollInc = HIWORD(wParam) - iHscrollPos;
SL> break;
SL> default :
SL> iHscrollInc = 0;
SL> }
SL> iHscrollInc = max(-iHscrollPos, min(iHscrollInc, iHscrollMax - iHscrollPos));
SL> if (iHscrollInc != 0)
SL> {
SL> iHscrollPos += iHscrollInc;
SL> ScrollWindow(hWnd, -cxChar * iHscrollInc, 0, NULL, NULL);
SL> SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
SL> }
SL> return 0;
SL> case WM_LBUTTONDOWN :
SL> if (hFile) {
SL> iSelect = 1;
SL> RECT rect;// Это можно убрать
SL> GetClientRect(hWnd, &rect);// Это тоже можно убрать
SL> InvalidateRect(hWnd, &rect, TRUE); // вместо rect надо NULL и будет тотже результат
SL> SendMessage(hWnd, WM_PAINT, wParam, lParam);// вот это лишнее
// InvalidateRect сам пошлет WM_PAINT окну
// ктомуже у вас тут не правильные параметры читай WM_PAINT
SL> }
SL> return 0;
SL> case WM_MOUSEMOVE : // аналогично выше
SL> if (hFile) {
SL> if (wParam == MK_LBUTTON) {
SL> iSelect = 2;
SL> RECT rect;
SL> GetClientRect(hWnd, &rect);
SL> InvalidateRect(hWnd, &rect, TRUE);
SL> SendMessage(hWnd, WM_PAINT, wParam, lParam);
SL> }
SL> }
SL> return 0;
SL> case WM_RBUTTONUP :
SL> return 0;
SL> case WM_PAINT :
SL> hdc = BeginPaint (hWnd, &ps) ;
SL> lf.lfCharSet = SHIFTJIS_CHARSET;
SL> lf.lfPitchAndFamily = FIXED_PITCH;
SL> hfont = CreateFontIndirect(&lf);
SL> if(hfont)
SL> {
SL> INT i = 0, mem = 0x00;
SL> DWORD offset = 0;
SL> hfOldFont = (HFONT)SelectObject(hdc, (HGDIOBJ)hfont);
SL> iPaintBeg = max(0, iVscrollPos + ps.rcPaint.top / cyChar - 1);
SL> iPaintEnd = min(NUMLINES, iVscrollPos + ps.rcPaint.bottom / cyChar);
SL> for(j = iPaintBeg; j < iPaintEnd; j++)
SL> {
SL> x = cxChar *(1 - iHscrollPos);
SL> y = cyChar *(1 - iVscrollPos + j);
SL>// if (iVscrollPos == 0) { GetTextMetrics(hdc, &tm); y -= tm.tmHeight; }
SL> offset = j * 16;
SL> mem = j * 0x10;
SL> if (offset < size)
SL> {
SL> wsprintf(strf_mem, "%08X:", mem);
SL> TextOut(hdc, x, y, strf_mem, 9);
SL> //INT t = iSelect;
SL> if (iSelect == 1) {
SL> xPosBeg = LOWORD(lParam);
SL> yPosBeg = HIWORD(lParam);
SL> }
SL> if (iSelect == 2) {
SL> xPosEnd = LOWORD(lParam);
SL> yPosEnd = HIWORD(lParam);
SL> if (yPosBeg > yPosEnd) {
SL> INT tPos = yPosBeg;
SL> yPosBeg = yPosEnd;
SL> yPosEnd = tPos;
SL> }
SL> if ((y >= yPosBeg)&&(y <= yPosEnd)) {
SL>/* if ((x >= xPosBeg)&&(x <= xPosEnd)) {
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> }
SL> else {
SL>*/ cTextOld = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
SL> cBkOld = SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> SetTextColor(hdc, cTextOld);
SL> SetBkColor(hdc, cBkOld);
SL>// }
SL> }
SL> else {
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> }
SL> }
SL> else {
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> }
SL> }
SL> }
SL> SelectObject(hdc, hfOldFont);
SL> DeleteObject(hfont);
SL> }
SL> EndPaint (hWnd, &ps) ;
SL> return 0 ;
SL> case WM_COMMAND :
SL> switch(LOWORD(wParam)) {
SL> case ID_FILE_OPEN: {
SL>// открываем и map'им файл
SL> }
SL> break;
SL> case ID_FILE_EXIT:
SL> PostQuitMessage(0);
SL> }
SL> return 0 ;
SL> case WM_CLOSE :
SL> DestroyWindow(hWnd);
SL> return 0 ;
SL> case WM_DESTROY :
SL> UnmapViewOfFile(pbFile);
SL> CloseHandle(hFileMapping);
SL> CloseHandle(hFile);
SL> PostQuitMessage (0) ;
SL> return 0 ;
SL> }
SL> return DefWindowProc (hWnd, iMsg, wParam, lParam) ;
SL>}
SL>
Чтоб не моргало.
Создай битмар, bDC, и всю отрисовку делай на bDC, а в WM_PAINT просто отображай битмар на экран, если нужно обновить экран вызывай InvalidateRect(), с параметром FALSE, чтоб не стерал экран цветом фона. Когда будете создавать класс окна hbrBackground = NULL тогда фон окна перересовываться не будет.
С уважением Валерий.
Извините, но я конечно не знаю что такое "Петзолд", но...
недавно открыл для себя функцию RedrawWindow(...), скажем так, ядро функции InvalidateXXXX(...), ну а далее читаем МСДН.
Здравствуйте, SpLove, Вы писали:
SL>SL>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
SL>INT NUMLINES = 0;
SL>HANDLE hFile = NULL;
SL>HANDLE hFileMapping = NULL;
SL>PCHAR pbFile = NULL;
SL>DWORD size = 0;
SL>TCHAR cCaptionDefault[] = "Hex";
SL>TCHAR strf_mem[] = "00000000";
SL>TCHAR strf_file[] = "0000000000000000";
SL>int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
SL> PSTR szCmdLine, int iCmdShow)
SL>{
SL>}
SL>LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
SL>{
SL> HDC hdc = NULL ;
SL> PAINTSTRUCT ps ;
SL>// RECT rect ;
SL> HMENU hMenu, hSubMenu ;
SL> static INT cxChar, cyChar, cxClient, cyClient, iMaxWidth,
SL> iVscrollPos, iVscrollMax, iHscrollPos, iHscrollMax;
SL> static LOGFONT lf;
SL> static HFONT hfont, hfOldFont;
SL> TEXTMETRIC tm;
SL> INT j, x, y, iPaintBeg, iPaintEnd, iVscrollInc, iHscrollInc;
SL> DWORD cTextOld = 0, cBkOld = 0;
SL> static INT iSelect = 0;
SL> static INT xPosBeg = 0, yPosBeg = 0,
SL> xPosEnd = 0, yPosEnd = 0;
SL> switch (iMsg)
SL> {
SL> case WM_CREATE : {
SL> hMenu = CreateMenu();
SL> SetMenu(hWnd, hMenu);
SL> hSubMenu = CreatePopupMenu();
SL> AppendMenu(hSubMenu, MF_STRING, ID_FILE_OPEN, "&Открыть ...");
SL> AppendMenu(hSubMenu, MF_SEPARATOR, 0, 0);
SL> AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "В&ыход");
SL> AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Файл");
SL> hdc = GetDC(hWnd);
SL> GetTextMetrics(hdc, &tm);
SL> cxChar = tm.tmAveCharWidth;
SL> cyChar = tm.tmHeight + tm.tmExternalLeading; // здесь !!!!!!!!
SL> ReleaseDC(hWnd, hdc);
SL> iMaxWidth = 88 * cxChar;
SL> }
SL> return 0 ;
SL> case WM_SIZE :
SL> cxClient = LOWORD(lParam);
SL> cyClient = HIWORD(lParam);
SL> iVscrollMax = max(0, NUMLINES + 2 - cyClient / cyChar);
SL> iVscrollPos = min(iVscrollPos, iVscrollMax);
SL> SetScrollRange(hWnd, SB_VERT, 0, iVscrollMax, FALSE);
SL> SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
SL> iHscrollMax = max(0, 2 +(iMaxWidth - cxClient) / cxChar);
SL> iHscrollPos = min(iHscrollPos, iHscrollMax);
SL> SetScrollRange(hWnd, SB_HORZ, 0, iHscrollMax, FALSE);
SL> SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
SL> return 0;
SL> case WM_VSCROLL :
SL> switch(LOWORD(wParam))
SL> {
SL> case SB_TOP :
SL> iVscrollInc = -iVscrollPos;
SL> break;
SL> case SB_BOTTOM :
SL> iVscrollInc = iVscrollMax - iVscrollPos;
SL> break;
SL> case SB_LINEUP :
SL> iVscrollInc = -1;
SL> break;
SL> case SB_LINEDOWN :
SL> iVscrollInc = 1;
SL> break;
SL> case SB_PAGEUP :
SL> iVscrollInc = min(-1, -cyClient / cyChar);
SL> break;
SL> case SB_PAGEDOWN :
SL> iVscrollInc = max(1, cyClient / cyChar);
SL> break;
SL> case SB_THUMBTRACK :
SL> iVscrollInc = HIWORD(wParam) - iVscrollPos;
SL> break;
SL> default :
SL> iVscrollInc = 0;
SL> }
SL> iVscrollInc = max(-iVscrollPos, min(iVscrollInc, iVscrollMax - iVscrollPos));
SL> if (iVscrollInc != 0)
SL> {
SL> iVscrollPos += iVscrollInc;
SL> ScrollWindow(hWnd, 0, -cyChar * iVscrollInc, NULL, NULL);
SL> SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
SL> UpdateWindow(hWnd);
SL> }
SL> return 0;
SL> case WM_HSCROLL :
SL> switch(LOWORD(wParam))
SL> {
SL> case SB_LINEUP :
SL> iHscrollInc = -1;
SL> break;
SL> case SB_LINEDOWN :
SL> iHscrollInc = 1;
SL> break;
SL> case SB_PAGEUP :
SL> iHscrollInc = -8;
SL> break;
SL> case SB_PAGEDOWN :
SL> iHscrollInc = 8;
SL> break;
SL> case SB_THUMBPOSITION :
SL> iHscrollInc = HIWORD(wParam) - iHscrollPos;
SL> break;
SL> default :
SL> iHscrollInc = 0;
SL> }
SL> iHscrollInc = max(-iHscrollPos, min(iHscrollInc, iHscrollMax - iHscrollPos));
SL> if (iHscrollInc != 0)
SL> {
SL> iHscrollPos += iHscrollInc;
SL> ScrollWindow(hWnd, -cxChar * iHscrollInc, 0, NULL, NULL);
SL> SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
SL> }
SL> return 0;
SL> case WM_LBUTTONDOWN :
SL> if (hFile) {
SL> iSelect = 1;
SL> RECT rect;
SL> GetClientRect(hWnd, &rect);
SL> InvalidateRect(hWnd, &rect, TRUE);
SL> SendMessage(hWnd, WM_PAINT, wParam, lParam); //что за мода :xz: ??
SL> }
SL> return 0;
SL> case WM_MOUSEMOVE :
SL> if (hFile) {
SL> if (wParam == MK_LBUTTON) {
SL> iSelect = 2;
SL> RECT rect;
SL> GetClientRect(hWnd, &rect);
SL> InvalidateRect(hWnd, &rect, TRUE);
SL> SendMessage(hWnd, WM_PAINT, wParam, lParam);//...
SL> }
SL> }
SL> return 0;
SL> case WM_RBUTTONUP :
SL> return 0;
SL> case WM_PAINT :
SL> hdc = BeginPaint (hWnd, &ps) ;
SL> lf.lfCharSet = SHIFTJIS_CHARSET;
SL> lf.lfPitchAndFamily = FIXED_PITCH;
SL> hfont = CreateFontIndirect(&lf);
SL> if(hfont)
SL> {
SL> INT i = 0, mem = 0x00;
SL> DWORD offset = 0;
SL> hfOldFont = (HFONT)SelectObject(hdc, (HGDIOBJ)hfont);
SL> iPaintBeg = max(0, iVscrollPos + ps.rcPaint.top / cyChar - 1);
SL> iPaintEnd = min(NUMLINES, iVscrollPos + ps.rcPaint.bottom / cyChar);
SL> for(j = iPaintBeg; j < iPaintEnd; j++)
SL> {
SL> x = cxChar *(1 - iHscrollPos);
SL> y = cyChar *(1 - iVscrollPos + j);
SL>// if (iVscrollPos == 0) { GetTextMetrics(hdc, &tm); y -= tm.tmHeight; }
SL> offset = j * 16;
SL> mem = j * 0x10;
SL> if (offset < size)
SL> {
SL> wsprintf(strf_mem, "%08X:", mem);
SL> TextOut(hdc, x, y, strf_mem, 9);
SL> //INT t = iSelect;
SL> if (iSelect == 1) {
SL> xPosBeg = LOWORD(lParam);
SL> yPosBeg = HIWORD(lParam);
SL> }
SL> if (iSelect == 2) {
SL> xPosEnd = LOWORD(lParam);
SL> yPosEnd = HIWORD(lParam);
SL> if (yPosBeg > yPosEnd) {
SL> INT tPos = yPosBeg;
SL> yPosBeg = yPosEnd;
SL> yPosEnd = tPos;
SL> }
SL> if ((y >= yPosBeg)&&(y <= yPosEnd)) {
SL>/* if ((x >= xPosBeg)&&(x <= xPosEnd)) {
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> }
SL> else {
SL>*/ cTextOld = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
SL> cBkOld = SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> SetTextColor(hdc, cTextOld);
SL> SetBkColor(hdc, cBkOld);
SL>// }
SL> }
SL> else {
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> }
SL> }
SL> else {
SL> TextOut(hdc, x + 480, y, strf_file, 16);
SL> }
SL> }
SL> }
SL> SelectObject(hdc, hfOldFont);
SL> DeleteObject(hfont);
SL> }
SL> EndPaint (hWnd, &ps) ;
SL> return 0 ;
SL> case WM_COMMAND :
SL> switch(LOWORD(wParam)) {
SL> case ID_FILE_OPEN: {
SL>// открываем и map'им файл
SL> }
SL> break;
SL> case ID_FILE_EXIT:
SL> PostQuitMessage(0);
SL> }
SL> return 0 ;
SL> case WM_CLOSE :
SL> DestroyWindow(hWnd);
SL> return 0 ;
SL> case WM_DESTROY :
SL> UnmapViewOfFile(pbFile);
SL> CloseHandle(hFileMapping);
SL> CloseHandle(hFile);
SL> PostQuitMessage (0) ;
SL> return 0 ;
SL> }
SL> return DefWindowProc (hWnd, iMsg, wParam, lParam) ;
SL>}
SL>
прошу... сделайте код более читабельным... хотя бы так...
void DoMouseMove(...)
{
//...
}
LRESULT CALLBACK WndProc (...)
{
.....
case WM_MOUSEMOVE:
DoMouseMove(...)
break;
....
}
по поводу мигания смотрите выше. не пользуйте Invalidate без надобности и уж тем более в сочетании с SendMessage(WM_PAINT)...
по поводу скроллинга вообще очень сложно что-то понять...
я обычно делаю битмап (ну или если понятнее мемдс) где веду предварительную отрисовку всего что мне надо и BitBlt в WM_PAINT отрисовываю что мне надо...
> Чтот такое "Петзолд" я не знаю, но рисование без маргания вот
эээ... Чарльз Петзольд (Petzold), автор хорошей книги по WinAPI.
Называется "Programming Windows 95"
Posted via RSDN NNTP Server 1.9
С перерисовкой картина понятна, всем кто ответил спасибо

Петзолд — это автор хорошей книжки по программированию под Win 95(а недавно и книжки по программированию под Win на С#) в которой хорошо описывается как сделатть прокрутку при выводе на экран тектовой информации, у меня она работает

, правда отступ сверху раздражает. Может быть кто-то знает реальный пример по организации такой прокрутки

Кстати забыл спросить на сообщение WM_COMMAND делаю SetCursor(LoadCursor(NULL, IDC_IBEAM)); — не работает