Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > HBITMAP и отрисовка в окне


Автор: Alexoid 29.5.2012, 11:46
Здравствуйте, Винградцы.
Имеется классическая проблема, помогите решить, пожалуйста.
В отдельной процедуре - SetLine(), в создаю BITMAP присоединяю к нему контекст и рисую, вот код:
Код

    hmf=GetMetaFile(_T("C:\\1.WMF"));
    hBitmap=CreateBitmap(100,100,1,24, NULL);
    HBITMAP hbmOld=(HBITMAP)SelectObject(hDCmem, hBitmap);
    MoveToEx(hDCmem,0,0,0);
    LineTo(hDCmem,1000,1000);

затем в обработчике отрисовки окна написал:
Код


void CDlgPrint::OnPaint()
{
    CPaintDC dc(this);  
    HDC hDC=dc.m_hDC;
    FillRect(hDC,&pMetaArr->rSize,0); 
    
    SetMapMode(hDC,MM_ISOTROPIC);
    //SetWindowExtEx(hDCmem,pMetaArr->rSize.right,pMetaArr->rSize.bottom,0);

    SetViewportExtEx(hDC,pMetaArr->rSize.right*plToolBar->iPercent/2000, \
        pMetaArr->rSize.bottom*plToolBar->iPercent/2000,0);
    SetViewportOrgEx(hDC,-pHScrool->GetScrollPos(),-pVScrool->GetScrollPos(),0);
    BOOL b=BitBlt(dc.m_hDC,dc.m_ps.rcPaint.left,dc.m_ps.rcPaint.top,dc.m_ps.rcPaint.right,dc.m_ps.rcPaint.bottom,hDCmem, \
        dc.m_ps.rcPaint.left,dc.m_ps.rcPaint.top,SRCCOPY);
    if(b==FALSE)
    {
        TCHAR *pszTmp=new TCHAR[256];
        _GetLastErr(pszTmp,256);
        delete pszTmp;
    }
    //PlayMetaFile(hDC,hmf);
}


В итоге линию, которую я нарисовал я невижу.
что я опять не так делаю smile 

Автор: Dem_max 29.5.2012, 12:23
обычно делают так, найди отличия
Код

  HDC hDC,                  // Handle to the display device context 
    hDCMem;               // Handle to the memory device context
  HBITMAP hBitmap;          // Handle to the new bitmap
  int iWidth, iHeight;      // Width and height of the bitmap
  // Retrieve the handle to a display device context for the client 
  // area of the window. 
  hDC = GetDC (hwnd);
  // Create a memory device context compatible with the device. 
  hDCMem = CreateCompatibleDC (hDC);
  // Retrieve the width and height of window display elements.
  iWidth = GetSystemMetrics (SM_CXSCREEN) / 10;
  iHeight = GetSystemMetrics (SM_CYSCREEN) / 10;
  // Create a bitmap compatible with the device associated with the 
  // device context.
  hBitmap = CreateCompatibleBitmap (hDC, iWidth, iHeight);
  HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDCMem, hBitmap);
// Insert code to use the bitmap.
// ну вот тут ты можешь рисовать на битмап hBitmap


// восстанавливаем старый битмап
 SelectObject(hDCMem, hOldBitmap);
  // Delete the bitmap object and free all resources associated with it. 
  DeleteObject (hBitmap);
  // Delete the memory device context and the display device context.
  DeleteDC (hDCMem);
  ReleaseDC (hDC);

Автор: Earnest 29.5.2012, 13:01
Скорее всего у тебе путаница с координатами. BitBlt работает в логических координатах. Попробуй сначала сделать все в режиме MM_TEXT.

Автор: Alexoid 29.5.2012, 14:33
А как сделать чтобы Битмап был допустим двухбитным в вашем алгоритме, Dem_max

Автор: Alexoid 29.5.2012, 15:03
Я из далека всё это дело начал, в общем у меня есть данные о заказе и к ним рисунки (сам заказ) в WMF-формате. Тоесть мне нужно в окно вывести wmf-картинку, но так как её нада сдвинуть вниз, чтобы перед ней были данные, мне кажется нужно поступить следующим образом: функцией GetMetaFile загрузить картинку, функцией PlayMetaFile отобразить её в контексте HDC hDC1 с привязкой к HBITMAP hBMP1, потмом с помощье Bitblt отобразить на контекст HDC hDC2 со смещением вниз(таким образом у меня WMF сместиткя вниз), а только потом рисовать в окно.

Может дадите совет как это сделать наименее ресурсоёмко.

Автор: Dem_max 29.5.2012, 17:28
Цитата(Alexoid @ 29.5.2012,  14:33)
А как сделать чтобы Битмап был допустим двухбитным в вашем алгоритме, Dem_max

Используй CreateBitmap

Автор: Alexoid 30.5.2012, 09:46
Dem_max, спасибо огромное с графикой давно неработал уже позабывал всё.
Всё получилось!!!!

Автор: Alexoid 31.5.2012, 14:46
Можно ещё вопрсик по этой теме?
У меня в диалоговом окне находится самописная панель инструментов(обычный СStatic и на нём расположены кнопки CButtons - не CToolBar) и элемент - NS_CPainter,  наследник класса СStatic в который я вывожу изображение HBITMAT с приаттаченным HDC hDCmem. Вывожу изображени в режиме MM_ISOTROPIC, Как есть необходимость в масштабировании и скроллине. Проблемы две, одна в том, что изображение выходит за рамки Пайнтера, а вторая когда силно прокрутиш изображение, то оно оставляет след.
Вот Код:
Код

CPaintDC dc(this);    
    HDC hDC=dc.m_hDC;
    CDlgPrint *pDlgPrint=(CDlgPrint*)GetParent();
    SetMapMode(hDC,MM_ISOTROPIC);

    SetViewportExtEx(hDC,pDlgPrint->pMetaArr->rSize.right*pDlgPrint->iPercent/1000, \
        pDlgPrint->pMetaArr->rSize.bottom*pDlgPrint->iPercent/1000,0);
    
    SetViewportOrgEx(hDC, \
        -pDlgPrint->pHScrool->GetScrollPos()*((3000)/100)*pDlgPrint->iPercent/100, \
        -pDlgPrint->pVScrool->GetScrollPos()*((3000)/pDlgPrint->iDlgHeght)*pDlgPrint->iPercent/100,0);

    BOOL b=BitBlt(dc.m_hDC,dc.m_ps.rcPaint.left,dc.m_ps.rcPaint.top,dc.m_ps.rcPaint.right*pDlgPrint->iPercent, \
        dc.m_ps.rcPaint.bottom*pDlgPrint->iPercent,pDlgPrint->hDCmem,dc.m_ps.rcPaint.left,dc.m_ps.rcPaint.top,SRCCOPY);
};


Смотрите рисунок.
Подскажите стандартное или нестандартное решение. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)