Помогите разобраться
От: Andruxa-1  
Дата: 24.07.08 12:47
Оценка:
Добрый день!

Помогите разобраться с такой ситуацией.

Есть СДИ приложение. Наследуется от CScrollView.
Задаю режим MM_LOMETRIC

void CInventoryView::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    CSize sizeTotal;
    // TODO: calculate the total size of this view
    sizeTotal.cx = sizeTotal.cy = 100;
    SetScrollSizes(MM_LOMETRIC, sizeTotal);
}



void CInventoryView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
    CScrollView::OnPrepareDC(pDC, pInfo);

    // TODO: Add your specialized code here and/or call the base class
    CRect rect;

    GetClientRect(&rect);

    pDC->SetMapMode(MM_LOMETRIC);
    pDC->SetViewportExt(rect.right, -rect.bottom);
    pDC->SetViewportOrg(rect.right/2, rect.bottom/2);
        
    
}



void CInventoryView::OnDraw(CDC* pDC)
{
    CInventoryDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    // TODO: add draw code for native data here
    OnPrepareDC(pDC);

    POSITION pos = NULL;

    CBasePoint *pShape = NULL;
    
    if(pDoc->m_ShapesList.GetCount() > 0)
        pos = pDoc->m_ShapesList.GetHeadPosition();

    while(pos != NULL)
    {
        pShape = pDoc->m_ShapesList.GetNext(pos);

        if(pShape != NULL)
            pShape->Show(pDC);
    }
}


void CInventoryView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CInventoryDoc *pDoc = GetDocument();

    CPoint LogPoint = point;

    CDC *pDC = GetDC();
    
    OnPrepareDC(pDC);

    pDC->DPtoLP(&LogPoint);

    AddShape(LogPoint); //В этой функции создается объект и добовляется к списку объектов
            
    Invalidate();

    CScrollView::OnLButtonDown(nFlags, point);
}


Создаю класс, в нем я хочу вывести битмап, он выводится, но верх ногами и на некотором растоянии. Я понимаю, что тут проблема с преобразованием, но не могу найти свою ошибку.

void CSquare::Show(CDC* pDC)
{
        int s = m_wSize / 2;
    CRect rect(pCenter.x - s, pCenter.y + s, pCenter.x + s, pCenter.y - s); //Находим размер ограничивающей области

    CBitmap bm;
    CDC MemDC;

    bm.LoadBitmap(IDB_BITMAP1);
    
        BITMAP bmInf;

    bm.GetBitmap(&bmInf);

        MemDC.CreateCompatibleDC(pDC);
    MemDC.SelectObject(&bm);

    pDC->Rectangle(&rect);

    pDC->SetStretchBltMode(COLORONCOLOR);

    pDC->BitBlt(rect.left, rect.top, bmInf.bmWidth, bmInf.bmHeight, &MemDC, 0, 0, SRCCOPY);
}
Re: Помогите разобраться
От: Fwiffo Россия  
Дата: 24.07.08 17:22
Оценка: 3 (1)
Здравствуйте, Andruxa-1, Вы писали:

A1>Создаю класс, в нем я хочу вывести битмап, он выводится, но верх ногами и на некотором растоянии. Я понимаю, что тут проблема с преобразованием, но не могу найти свою ошибку.



Это потому что ось y в pDC и memDC направлена в разные стороны. SetMapMode(MM_LOMETRIC) помимо единиц измерения еще и ориентацию меняет. Можно так сделать:

pDC->StretchBlt( rect.left, rect.top, bmInf.bmWidth, -bmInf.bmHeight,
                 &MemDC, 0, 0, bmInf.bmWidth, bmInf.bmHeight, SRCCOPY );


Ну и еще

A1>
A1>void CInventoryView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
        ...
    pDC->SetMapMode(MM_LOMETRIC);
    pDC->SetViewportExt(rect.right, -rect.bottom);
A1>


SetViewportExt() при заданном MM_LOMETRIC ничего не делает.

A1>
A1>void CInventoryView::OnDraw(CDC* pDC)
A1>{

A1>    // TODO: add draw code for native data here
A1>    OnPrepareDC(pDC);

A1>


OnPrepareDC() нельзя вызывать из OnDraw. MFC его сама уже вызвала к этому моменту.
Re[2]: Помогите разобраться
От: Andruxa-1  
Дата: 25.07.08 09:20
Оценка:
Здравствуйте, Fwiffo, Вы писали:

Спасибо! Все заработало.

Сразу возникло пару встречных вопросов.

F>Это потому что ось y в pDC и memDC направлена в разные стороны. SetMapMode(MM_LOMETRIC) помимо единиц измерения еще и ориентацию меняет. Можно так сделать:


F>
pDC->>StretchBlt( rect.left, rect.top, bmInf.bmWidth, -bmInf.bmHeight,
F>                 &MemDC, 0, 0, bmInf.bmWidth, bmInf.bmHeight, SRCCOPY );
F>


Есть ли смысл задавать в memDC режим преобразования?
При создании memDC я использую функцию
MemDC.CreateCompatibleDC(pDC);


Почему она не передает данные параметры. Может подскажите литературку какую почитать или ресурс в нете.
Re[3]: Помогите разобраться
От: Fwiffo Россия  
Дата: 25.07.08 12:24
Оценка: 3 (1)
Здравствуйте, Andruxa-1, Вы писали:

A1>Здравствуйте, Fwiffo, Вы писали:


A1>Спасибо! Все заработало.


A1>Сразу возникло пару встречных вопросов.


A1>Есть ли смысл задавать в memDC режим преобразования?


Смысл есть, но эффект другой будет. Так квадратик 100х100 пикселей отображается в 1см х 1см, а будет 1 в 1 отображаться.

A1>При создании memDC я использую функцию
MemDC.CreateCompatibleDC(pDC);

A1>Почему она не передает данные параметры.

Потому что "When a memory DC is created, all attributes are set to normal default values." Совместимое оно только в смысле внутреннего устройства, преобразования систем координат сюда не входят.

A1>Может подскажите литературку какую почитать или ресурс в нете.


Чего ж не подсказать . http://msdn.microsoft.com/ Можно начинать отсюда:
http://msdn.microsoft.com/en-us/library/ms536795(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms533187(VS.85).aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.