GDI и Петзолд
От: SpLove Россия  
Дата: 04.08.05 04:11
Оценка:
Помогите сделать нормальную перерисовку . Сделал как показано не ниже но все передергивается и моргает. Ещё вопрос кто-нибудь делал прокрутку по Петзолду? Как избавиться от отступа сверху?? Знаю место где оно задается но как убрать????

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>>
Re: GDI и Петзолд
От: Hsilgos Беларусь  
Дата: 04.08.05 11:41
Оценка:
Здравствуйте, 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);
}
ХОЙ!
Re: GDI и Петзолд
От: sva1509  
Дата: 04.08.05 15:28
Оценка:
Здравствуйте, 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 тогда фон окна перересовываться не будет.

С уважением Валерий.
Re: GDI и Петзолд
От: .erax  
Дата: 04.08.05 17:42
Оценка:
Извините, но я конечно не знаю что такое "Петзолд", но...

недавно открыл для себя функцию RedrawWindow(...), скажем так, ядро функции InvalidateXXXX(...), ну а далее читаем МСДН.
Re: GDI и Петзолд
От: 0xfeefee  
Дата: 04.08.05 18:12
Оценка:
Здравствуйте, 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 отрисовываю что мне надо...
Re[2]: GDI и Петзолд
От: Torvin  
Дата: 05.08.05 05:20
Оценка:
> Чтот такое "Петзолд" я не знаю, но рисование без маргания вот

эээ... Чарльз Петзольд (Petzold), автор хорошей книги по WinAPI.
Называется "Programming Windows 95"
Posted via RSDN NNTP Server 1.9
Re: GDI и Петзолд
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 05.08.05 10:30
Оценка:
Hello SpLove, you wrote:

> Помогите сделать нормальную перерисовку . Сделал как показано не ниже но все передергивается и моргает.


Посмотри http://slava.fateback.com/work/articles/flicker.htm.

--
Всего хорошего, Слава
Posted via RSDN NNTP Server 1.9
Re: GDI и Петзолд
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 05.08.05 10:30
Оценка:
Hello SpLove, you wrote:

> Помогите сделать нормальную перерисовку . Сделал как показано не ниже но все передергивается и моргает.


Посмотри http://slava.fateback.com/work/articles/flicker.htm.

--
Всего хорошего, Слава
Posted via RSDN NNTP Server 1.9
Re[2]: GDI и Петзолд
От: SpLove Россия  
Дата: 06.08.05 08:15
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Hello SpLove, you wrote:


>> Помогите сделать нормальную перерисовку . Сделал как показано не ниже но все передергивается и моргает.


SA>Посмотри http://slava.fateback.com/work/articles/flicker.htm.


SA>--

SA>Всего хорошего, Слава
Спасибо, познавательная статья
Re: GDI и Петзолд
От: SpLove Россия  
Дата: 06.08.05 08:25
Оценка:
С перерисовкой картина понятна, всем кто ответил спасибо Петзолд — это автор хорошей книжки по программированию под Win 95(а недавно и книжки по программированию под Win на С#) в которой хорошо описывается как сделатть прокрутку при выводе на экран тектовой информации, у меня она работает , правда отступ сверху раздражает. Может быть кто-то знает реальный пример по организации такой прокрутки Кстати забыл спросить на сообщение WM_COMMAND делаю SetCursor(LoadCursor(NULL, IDC_IBEAM)); — не работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.