Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Быстрый вывод графики средствами WinAPI

12K
28 октября 2007 года
whmario
33 / / 23.08.2007
Привет всем!
Подскажите пожалуйста как сделать вывод графики на поверхность окна средствами функций CreateCompatibleDC и BitBlt.
Я сделал че то типа:

 
Код:
dc:=CreateCompatibleDC(GetDC(Wnd));
   rectangle(dc,10,10,100,100);
   BitBlt(GetDC(Wnd),0,0,iWidth,iHeight,dc,0,0,srccopy);
   .....


Ни че не выводиться(((
Подскажите в чем ошибка!
21K
28 октября 2007 года
Gais
23 / / 28.03.2007
Вот код на асме с комментариями:

Код:
invoke BeginPaint,hWnd,addr ps ;Получаем хэндл (DC).
         mov    hdc,eax                ; сохраняем его в переменную                
         invoke CreateCompatibleDC,hdc ;указываем поверхность для
;рисования
         mov    hMemDC,eax      ;сохраняем его в переменную                    
         invoke SelectObject,hMemDC,hBitmap; выбираем объект для
;отображения на поверхности (в моем случае bmp-файл)
         invoke GetClientRect,hWnd,addr rect ;выбираем отображение в
;клиентской области окна
         invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY ;отображаем
;картинку в клиентской области окна
         invoke DeleteDC,hMemDC ;освобождаем DC
Надеюсь тебе это чем то поможет. Приведенный код находится в обработчике сообщения WM_PAINT
12K
28 октября 2007 года
whmario
33 / / 23.08.2007
Я не очень разбираюсь в ассемблере, пишу на Delphi.
насколько я понял то что ты написал на Delphi будет примерно так (
но я гружу не картинку из файла, а просто вывожу прямоугольник к примеру):
Код:
var
 ps: tpaintstruct;
 dc, mydc: hdc;
 lprect: TRect;
 pen: hpen;
...
 dc:=beginpaint(handle,ps);
 mydc:=CreateCompatibleDC(dc);
 pen:=CreatePen(ps_solid,1,rgb(0,0,0));
 rectangle(mydc,10,10,100,100);
 GetClientRect(handle,lprect);
 BitBlt(dc,lprect.Left,lprect.Top,lprect.Right,lprect.Bottom,
 mydc,0,0,srccopy);
 deletedc(mydc);
 endpaint(handle,ps);


Почему прямоугольник не выводиться я понять не могу:confused:
Подскажи иначе я об стенку убьюсь:)
534
28 октября 2007 года
HarryAxe
448 / / 19.01.2006
Всё гораздо проще. CreateCompatibleDC() тут абсолютно не причём.
 
Код:
SetRect(&rect, 0, 0, 10, 10);
hDC = GetDC(hwnd);
hBrush = CreateSolidBrush(0x0000FF00);
FillRect(hDC, &rect, hBrush);
ReleaseDC(hDC)
334
28 октября 2007 года
HexEdit
809 / / 27.07.2006
Ну это то все хорошо, а как использовать те же например Rectangle, LineTo и т. д.
На основной контекст выводится нормально.
А на совместимый - ....
21K
28 октября 2007 года
Gais
23 / / 28.03.2007
После строчки
 
Код:
pen:=CreatePen(ps_solid,1,rgb(0,0,0));
Получается что ты получил чем ты будешь рисовать, но не взял в руки.

Еще надо добавить
 
Код:
SelectObject(mydc,pen)

потом
 
Код:
rectangle(mydc,10,10,100,100);

 deletedc(mydc);
 endpaint(handle,ps);

Или просто
 
Код:
rectangle(mydc,10,10,100,100);
GetClientRect(handle,lprect);
BitBlt(dc,lprect.Left,lprect.Top,lprect.Right,lprect.Bottom,
mydc,0,0,srccopy);
deletedc(mydc);
endpaint(handle,ps);

Но в последнем примере кода я не очень уверен :)
334
28 октября 2007 года
HexEdit
809 / / 27.07.2006
Только я немного сомневаюсь что нужно одновременно и CompatibleDC и BeginPaint/EndPaint
1.9K
28 октября 2007 года
max_dark
256 / / 11.11.2005
кроме MEMDC необходимо создавать битмап MEMBMP и назначать его MEMDC

Держите рабочий код:
Код:
void Paint(HDC hdc);
// WndProc
/* ... */
    case WM_PAINT: {
        RECT rc;
        PAINTSTRUCT ps;
        GetClientRect(hwnd,&rc);
        HDC hdc=BeginPaint(hwnd,&ps);
        HDC MEMDC=CreateCompatibleDC(hdc);
        HBITMAP MEMBMP=CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
        SelectObject(MEMDC,MEMBMP);
        Paint(MEMDC);
        BitBlt(hdc,0,0,rc.right,rc.bottom,MEMDC,0,0,SRCCOPY);
        EndPaint(hwnd,&ps);
        DeleteDC(MEMDC);
        DeleteObject(MEMBMP);
        } break;
/* ... */
void Paint(HDC hdc) {
    ;/* Рисуем ...*/
}
534
29 октября 2007 года
HarryAxe
448 / / 19.01.2006
Ещё раз повторяю: если мы не льём битмапы из памяти на экран, то CreateCompatible...()-функции тут на фиг не нужны. Всё гораздо проще.
334
31 октября 2007 года
HexEdit
809 / / 27.07.2006
Короче... все было намного проще. Проблема заключалась в том, что Delphi похоже дополняла своими обработчиками (ну либо перерисовывала, или еще чего).
Решилось перехватом сообщения WM_PAINT
 
Код:
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;


[size=1][color=red]ЗЫ. Проблема решена. Тема закрыта.[/color][/size]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог