Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HBITMAP и отрисовка в окне 
:(
    Опции темы
Alexoid
Дата 29.5.2012, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Здравствуйте, Винградцы.
Имеется классическая проблема, помогите решить, пожалуйста.
В отдельной процедуре - 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 

Это сообщение отредактировал(а) Alexoid - 29.5.2012, 11:47
PM MAIL   Вверх
Dem_max
Дата 29.5.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



обычно делают так, найди отличия
Код

  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);


Это сообщение отредактировал(а) Dem_max - 29.5.2012, 12:26


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Earnest
Дата 29.5.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
Alexoid
Дата 29.5.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Alexoid - 29.5.2012, 14:35
PM MAIL   Вверх
Alexoid
Дата 29.5.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



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

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


Это сообщение отредактировал(а) Alexoid - 30.5.2012, 09:47
PM MAIL   Вверх
Dem_max
Дата 29.5.2012, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



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

Используй CreateBitmap


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexoid
Дата 30.5.2012, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Dem_max, спасибо огромное с графикой давно неработал уже позабывал всё.
Всё получилось!!!!
PM MAIL   Вверх
Alexoid
Дата 31.5.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.4.2008

Репутация: нет
Всего: нет



Можно ещё вопрсик по этой теме?
У меня в диалоговом окне находится самописная панель инструментов(обычный С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 

Это сообщение отредактировал(а) Alexoid - 31.5.2012, 14:47

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Рисунок_на_ТооlBar_е.jpg 122,61 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1206 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.