Здравствуйте, Аноним, Вы писали:
А>>> Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?
SDB>>Если Вы нам не покажете код — придется ждать телепатов.
Прежде чем что-то рисовать в совместимом контексте, в него нужно выбрать 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 выдает размеры только клиентской части, в которой и происходит рисование.
Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?
Здравствуйте, <Аноним>, Вы писали:
А> Есть главное окно, есть его дескриптор hWnd. hDC — контекст, связанный с этим окном, comDC — совместимый контекст. Я рисую не в контекст главного окна, а в comDC, а затем функцией BitBlt копирую содержимое совместимого контекста в главный. Проблемя вся в том что это не работает, то есть то что я на рисовал в совместимом контексте на экран не выводится, хотя если рисовать сразу в главный контекст, то все работает. Почему?
Если Вы нам не покажете код — придется ждать телепатов.
Здравствуйте, 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);
Код типа такого. Что не так? Вроде все должно работать.
AF>Прежде чем что-то рисовать в совместимом контексте, в него нужно выбрать bitmap подходящих размеров и формата. В данном случае удобнее всего воспользоваться CreateCompatibleBitmap для ее создания:
AF>
AF>Обрати внимание, что:
AF>1. Первым параметром в CreateCompatibleBitmap передается изначальный контекст, а не только что созданный совместимый контекст. По умолчанию, в совместимый контекст выбрана черно-белая картинка 1x1, поэтому, если здесь использовать совместимый контекст, наша bitmap получится черно-белой.
AF>2. Вместо GetWindowRect используется GetClientRect. GetWindowRect выдает размеры всего окна, включая рамку, заголовок и меню (если есть). GetClientRect выдает размеры только клиентской части, в которой и происходит рисование.
AF>
чтобы весь вывод графики OpenGL шел на совместимый контекст, а потом функцией BitBlt копирую рисунок на основной (если выводить разу на основной, то все нормально). В итоге, я получаю странную картину. Она похожа на абракадабру из книги 3D-магии, в которой, расфокусировав зрение, можно увидеть трехмерную картинку + части тех окон, что у меня открыты.
Не подскажешь, в чем загвоздка?
Здравствуйте, Аноним, Вы писали:
А>Так работает, спасибо, теперь проблема немного в другом. Дело в том, что я рисую не GDI функциями, а OpenGL. Я пишу код:
А>
А>чтобы весь вывод графики OpenGL шел на совместимый контекст, а потом функцией BitBlt копирую рисунок на основной (если выводить разу на основной, то все нормально). В итоге, я получаю странную картину. Она похожа на абракадабру из книги 3D-магии, в которой, расфокусировав зрение, можно увидеть трехмерную картинку + части тех окон, что у меня открыты. А> Не подскажешь, в чем загвоздка?
У меня точно такая же проблема, как возникла у первого товарища два с лишним года назад. Но у меня не просто ничего не происходит, а весь экран после копирования становится черным. Вот исходный код.
case WM_PAINT:{
hdc = BeginPaint(hWnd, &ps);
// Создание совместимого контекста
HDC secondDC = CreateCompatibleDC(hdc);
// Получение размеров клиентской области окна
RECT rcClient;
GetClientRect(hWnd, &rcClient);
int nWidth = rcClient.right;
int nHeight = rcClient.bottom;