• Поиск по форумам
  •  
      Этот форум закрыт. Новый форум располагается по адресу http://forum.use.ru  

      Nordnet Форум
      Программирование
      HDC и HBITMAP
     
    Страницы: 1
    Автор Тема:  HDC и HBITMAP
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 05-12-2006 21:45    
    Глупо конечно, но в чем разница между этими хэндлами? И кто будет быстрее отрисовываться на форме? Оба, походу, нацелены на некую область памяти. Не очень понимаю словосочетание "контекст устройства".
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 06-12-2006 14:28    
    Контекст устройства, если простыми словами, то это некий универсальный интерфейс для устройства.
    Т.е. в данном случае - всё, на чем можно рисовать :) И нет особой разницы, на чем рисовать - на экране, или на принтере.
    В твоем случае - ты немного путаешь понятие. HBITMAP - это хендл картинки. А HDC - это контекст устройства, которым можно рисовать, в том числе и эти картинки.
    Если привести аналогию - то HDC - это лист бумаги, на котором ты можешь рисовать кисточкой (HBRUSH), карандашом (HPEN), или взять клей и наклеить уже существующую картинку (HBITMAP).

    Соотвественно фраза - "кто быстрее будет отрисовываться" - в корне не верна. У формы есть HDC, на котором уже все и рисуется.

    ЗЫ: Во нафлудил :)
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 06-12-2006 19:15    
    Это все понятно.

    "У формы есть HDC, на котором уже все и рисуется."

    Но если к примеру отрисовать прямогольник и нарисовать битмап, то я думаю примитив будет отрисован быстрее.

    Собственно, к чему это я. У меня есть проект графической проги, в которой я вывожу на экран инфу через виртуальное окно (CreateCompatibleDC). И есть еще "промежуточные" битмапы, в которые выводиться разная инфа. Все они отрисовываются на виртуальном окне, а окно на экране.
    Вопрос вот в чем. А не лучше ли заменить все битмапы на виртуальные окна?
    нафига хранить в памяти все структуры этих бмпшек.
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 07-12-2006 10:55    
    2 Sergion:
    Лучше - или не лучше - решать тебе :) Я не знаю, что у тебя там рисуется. Если какая-нить простота, то нефиг еще хранить картинки. Если что-то сложное, то лучше заранее отрисовать и копировать при необходимости.
    ALIEN Xupypr 

    регистрация: 31-10-2004 в 15:53
    сообщений: 248

    отправлено 07-12-2006 13:09    
    Sergion, HDC - это дескриптор на устройсто рисования, а HBITMAP - это дескриптор на картинку.

    А разница в том что, HDC можно применить в чему угодно, а TBITMAP к определённому объекту (картинке).

    Вот программа на Delphi, которая рисует на рамке своего окна:
    procedure WMNCPaint(var Msg:TWMNCPaint); Message WM_NCPAINT; //В раздел с процедурами
    
    procedure TTest.WMNCPaint(var Msg: TWMNCPaint);
    var DC:HDC;
        Pen,OldPen:HPEN;
        OldBrush:HBRUSH;
    begin
      inherited;
      DC:=GetWindowDC(Handle);
      Msg.Result:=1;
      Pen:=CreatePen(PS_SOLID,1,RGB(255,0,0));
      OldPen:=SelectObject(DC,Pen);
      OldBrush:=SelectObject(DC,GetStockObject(NULL_BRUSH));
      Rectangle(DC,0,0,Width,Height);
      SelectObject(DC,OldBrush);
      SelectObject(DC,OldPen);
      DeleteObject(Pen);
      ReleaseDC(Handle,Canvas.Handle);
    end;
    
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 07-12-2006 23:48    
    2 Force:
    Я, собственно, пишу клиент к игре Империя звезд.
    Вывожу все через GDI. И мне нужно отрисовывать всё каждую секунду (по таймеру).
    Я, собственно, хотел узнать как быстрее выводить графику, с учетом того что раз в секунду идет обсчет массива из 1000 элементов. И в каждой итерации идет отрисовка нескольких битмапов.

    2 Alien Хирург: Примеры это конечно хорошо, но немножко не в тему.
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 08-12-2006 14:43    
    2 Sergion:
    Я думаю, что разница не очень большая. Отличия могут быть только, если обсчет действительно долгий. Тогда рекомендую рисовать вначале в HBITMAP, а потом выводить его на окно (причем с учетом видимой области). Главное - отключи в этом случае DoubleBuffering - тут он будет только мешать :)
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 08-12-2006 20:05    
    2 Force:
    Ясно. Я правда использую компонент TFastLib заместо стандартного делфийского TBitmap, а он написан на API.
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 08-12-2006 20:11    
    2 Force:
    DoubleBuffering? Это свойство оконных компонентов?
    Если да, то я его вообще никогда не использую.
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 11-12-2006 11:04    
    2 Sergion:
    Угу. Свойство оконных компонентов. Сделано, чтобы при обновлении формы она не мерцала. Но делается собсно - теми же средствами, а именно - прорисовкой в память, и выводом отрисованной картинки.
    Страницы: 1