Здравствуйте, 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 его сама уже вызвала к этому моменту.
Здравствуйте, 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
Добрый день!
Помогите разобраться с такой ситуацией.
Есть СДИ приложение. Наследуется от 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);
}
Здравствуйте, 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);
Почему она не передает данные параметры. Может подскажите литературку какую почитать или ресурс в нете.