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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.