Re[3]: Проблема с BitBlt
От: Alex Fedotov США  
Дата: 05.06.04 14:47
Оценка: 18 (1)
Здравствуйте, Аноним, Вы писали:

А>>> Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?


SDB>>Если Вы нам не покажете код — придется ждать телепатов.


А>HWND hWnd;
А>...
А>HDC hDC = GetDC(hWnd);

А>HDC compDC=CreateCompatibleDC(hDC);


Прежде чем что-то рисовать в совместимом контексте, в него нужно выбрать bitmap подходящих размеров и формата. В данном случае удобнее всего воспользоваться CreateCompatibleBitmap для ее создания:

RECT rc;
GetClientRect(hWnd, &rc);

int width = rc.right - rc.left;
int height = rc.bottom - rc.top;

HBITMAP hBitmap = CreateCompatibleBitmap(hDC, width, height);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(compDC, hBitmap);


Обрати внимание, что:

1. Первым параметром в CreateCompatibleBitmap передается изначальный контекст, а не только что созданный совместимый контекст. По умолчанию, в совместимый контекст выбрана черно-белая картинка 1x1, поэтому, если здесь использовать совместимый контекст, наша bitmap получится черно-белой.

2. Вместо GetWindowRect используется GetClientRect. GetWindowRect выдает размеры всего окна, включая рамку, заголовок и меню (если есть). GetClientRect выдает размеры только клиентской части, в которой и происходит рисование.

А>//рисую что-нибудь
А>Rectangle(compDC,...

А>BitBlt(hDC,0,0,width, height,compDC,0,0,SRCCOPY);


После того, как рисование закончено, нужно в совместимый контекст выбрать исходную bitmap и удалить все за собой:

SelectObject(compDC, hOldBitmap);

DeleteObject(hBitmap);
DeleteDC(compDC);
-- Alex Fedotov
Re: Проблема с BitBlt
От: Frostbitten Россия  
Дата: 04.06.04 21:50
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Проблемя вся в том что это не работает. Почему?

Битмапку совместимую создаете? Код показывайте.
Re[3]: Проблема с BitBlt
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 05.06.04 19:31
Оценка: :)
Здравствуйте, Frostbitten, Вы писали:

F>Я первый спросил!


А Янус — зажал!
[ posted via RSDN@Home 1.1.2 stable ]
- Искренне ваш, Поросенок Пафнутий
Проблема с BitBlt
От: Аноним  
Дата: 04.06.04 21:30
Оценка:
Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?
Re: Проблема с BitBlt
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.06.04 21:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?


Если Вы нам не покажете код — придется ждать телепатов.
[ posted via RSDN@Home 1.1.2 stable ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Проблема с BitBlt
От: Frostbitten Россия  
Дата: 04.06.04 22:23
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Если Вы нам не покажете код — придется ждать телепатов.

Я первый спросил!
Re[2]: Проблема с BitBlt
От: Аноним  
Дата: 05.06.04 14:16
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, <Аноним>, Вы писали:


А>> Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?


SDB>Если Вы нам не покажете код — придется ждать телепатов.


HWND hWnd;
...
HDC hDC = GetDC(hWnd);

HDC compDC=CreateCompatibleDC(hDC);

//рисую что-нибудь
Rectangle(compDC,...

RECT rc;
GetWindowRect(hWnd,&rc);

int width = rc.right - rc. left;
int height = rc.bottom-rc. top;

BitBlt(hDC,0,0,width, height,compDC,0,0,SRCCOPY);


Код типа такого. Что не так? Вроде все должно работать.
Re[4]: Проблема с BitBlt
От: Аноним  
Дата: 05.06.04 15:38
Оценка:
AF>
А>>HWND hWnd;
А>>...
А>>HDC hDC = GetDC(hWnd);

А>>HDC compDC=CreateCompatibleDC(hDC);
AF>


AF>Прежде чем что-то рисовать в совместимом контексте, в него нужно выбрать bitmap подходящих размеров и формата. В данном случае удобнее всего воспользоваться CreateCompatibleBitmap для ее создания:


AF>
AF>RECT rc;
AF>GetClientRect(hWnd, &rc);

AF>int width = rc.right - rc.left;
AF>int height = rc.bottom - rc.top;

AF>HBITMAP hBitmap = CreateCompatibleBitmap(hDC, width, height);
AF>HBITMAP hOldBitmap = (HBITMAP)SelectObject(compDC, hBitmap);
AF>


AF>Обрати внимание, что:


AF>1. Первым параметром в CreateCompatibleBitmap передается изначальный контекст, а не только что созданный совместимый контекст. По умолчанию, в совместимый контекст выбрана черно-белая картинка 1x1, поэтому, если здесь использовать совместимый контекст, наша bitmap получится черно-белой.


AF>2. Вместо GetWindowRect используется GetClientRect. GetWindowRect выдает размеры всего окна, включая рамку, заголовок и меню (если есть). GetClientRect выдает размеры только клиентской части, в которой и происходит рисование.


AF>
А>>//рисую что-нибудь
А>>Rectangle(compDC,...

А>>BitBlt(hDC,0,0,width, height,compDC,0,0,SRCCOPY);
AF>


AF>После того, как рисование закончено, нужно в совместимый контекст выбрать исходную bitmap и удалить все за собой:


AF>
AF>SelectObject(compDC, hOldBitmap);

AF>DeleteObject(hBitmap);
AF>DeleteDC(compDC);
AF>


Так работает, спасибо, теперь проблема немного в другом. Дело в том, что я рисую не GDI функциями, а OpenGL. Я пишу код:

SetWindowPixelFormat(compDC);
hGLRC = wglCreateContext(compDC);
wglMakeCurrent(compDC,hGLRC);


чтобы весь вывод графики OpenGL шел на совместимый контекст, а потом функцией BitBlt копирую рисунок на основной (если выводить разу на основной, то все нормально). В итоге, я получаю странную картину. Она похожа на абракадабру из книги 3D-магии, в которой, расфокусировав зрение, можно увидеть трехмерную картинку + части тех окон, что у меня открыты.
Не подскажешь, в чем загвоздка?
Re[5]: Проблема с BitBlt
От: Alex Fedotov США  
Дата: 05.06.04 18:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так работает, спасибо, теперь проблема немного в другом. Дело в том, что я рисую не GDI функциями, а OpenGL. Я пишу код:


А>
А>SetWindowPixelFormat(compDC);
А>hGLRC = wglCreateContext(compDC);
А>wglMakeCurrent(compDC,hGLRC);
А>


А>чтобы весь вывод графики OpenGL шел на совместимый контекст, а потом функцией BitBlt копирую рисунок на основной (если выводить разу на основной, то все нормально). В итоге, я получаю странную картину. Она похожа на абракадабру из книги 3D-магии, в которой, расфокусировав зрение, можно увидеть трехмерную картинку + части тех окон, что у меня открыты.

А> Не подскажешь, в чем загвоздка?

Я бы почитал http://msdn.microsoft.com/library/en-us/dnopen/html/msdn_gl6.asp и другие статьи из этой серии.
-- Alex Fedotov
Re[6]: Проблема с BitBlt
От: AlexProgrammer  
Дата: 04.03.07 12:51
Оценка:
У меня точно такая же проблема, как возникла у первого товарища два с лишним года назад. Но у меня не просто ничего не происходит, а весь экран после копирования становится черным. Вот исходный код.

case WM_PAINT:{
hdc = BeginPaint(hWnd, &ps);
// Создание совместимого контекста
HDC secondDC = CreateCompatibleDC(hdc);

// Получение размеров клиентской области окна
RECT rcClient;
GetClientRect(hWnd, &rcClient);
int nWidth = rcClient.right;
int nHeight = rcClient.bottom;

HBITMAP hBitmap = CreateCompatibleBitmap(secondDC, nWidth, nHeight);

// Выбор в совместимый контекст только что созданной битмапки
HBITMAP hOldBitmap = (HBITMAP)SelectObject(secondDC, hBitmap);

// Рисование в совместимом контексте
DrawSineWave(secondDC, 0);

// Копируем битмапку из совместимого контекста в исходный
BOOL bSuccess = BitBlt(hdc, 0, 0, nWidth, nHeight, secondDC, 0, 0, SRCCOPY);

SelectObject(secondDC, hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(secondDC);

EndPaint(hWnd, &ps);
break;
}
Re[7]: Проблема с BitBlt
От: Аноним  
Дата: 04.03.07 13:00
Оценка:
И с HBITMAP hBitmap = CreateCompatibleBitmap(hdc, nWidth, nHeight); (т.е. если поменять secondDC на hDC) то же самое...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.