Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибки рисование средствами GDI поверх OpenGL, На Windows 7(Aero On) появились ошибки 
:(
    Опции темы
gorby
Дата 30.1.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

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



10 лет моя программа работала и я горя не знал.
После установки Windows 7 с включенным Aero появились ошибки.
Что интересно, когда я установил винду не было этих ошибок, а после установки драйвера для видеокарты все вылезло.
Моя программа рисует прямоугольник выбора объектов средствами GDI поверх картинки OpenGL

вот фрагмент кода


Код

void CView3d::OnMouseMove(UINT nFlags, CPoint point) 
{
..
    if(mode_mouse==2 || mode_mouse==5 || mode_mouse==7){
        CClientDC DC(this);
        DC.SetROP2(R2_NOT);
        DC.SelectStockObject(NULL_BRUSH);
        if(mode_mouse==2 || mode_mouse==5){//    Рисуем Прямоугольник
            DC.Rectangle(m_pm1.x, m_pm1.y, m_pm2.x, m_pm2.y);
            DC.Rectangle(m_pm1.x, m_pm1.y, point.x, point.y);
            m_pm2=point;
            return;
        }
...
}




Вместо прямоугольника толщиной в один писксель получаю заполненный прямоугольник.

При запуске программы в режиме совместимости WINXPSP3 с и отключенным  интерфейсом Aero проблем нет




Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Hello1.png 14,19 Kb
PM MAIL WWW Skype   Вверх
Alexeis
Дата 30.1.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



gorby, картинка в опенгл рисуется с двойной буферизацией?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gorby
Дата 30.1.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

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



Цитата(Alexeis @ 30.1.2010,  16:49)
gorby, картинка в опенгл рисуется с двойной буферизацией?

Да?, Alexeis.


Код

void CView3d::draw_scene(void)
{

    PrepareScene();
    draw_picture();
    DrawAuxKnot();
    ::SwapBuffers(wglGetCurrentDC());
    glFinish();

}

PM MAIL WWW Skype   Вверх
Alexeis
Дата 30.1.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Ради теста можно попробовать отключить двойную буферизацю.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
gorby
Дата 30.1.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

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



Цитата(Alexeis @ 30.1.2010,  18:44)
Ради теста можно попробовать отключить двойную буферизацю.

двойную буферизацию я использую, чтобы рисовать на заднем плане.
Иначе будет все мигать.
Если я ее отключу и не будет глючить GDI, то что дальше?

Я думаю попробовать использовать GDI+.

Или вааще не использовать GDI, а все рисовать с помощью OpenGL. НО, не знаю пока как там рисовать анимацию.
PM MAIL WWW Skype   Вверх
gorby
Дата 2.2.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

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



Вот, что я нашел на сайте http://www.opengl.org/resources/faq/technical/mslinks.htm


GDI operations, such as TextOut, can be performed on an OpenGL window only if the window is single-buffered. The Windows NT implementation of OpenGL does not support GDI graphics in a double-buffered window. Therefore, you cannot use GDI functions to draw text in a double-buffered window, for example. To draw text in a double-buffered window, an application can use the wglUseFontBitmaps and wglUseFontOutlines functions to create display lists for characters in a font, and then draw the characters in the font with the glCallLists function.
The wglUseFontOutlines function is new to Windows NT 3.51 and can be used to draw 3-D characters of TrueType fonts. These characters can be rotated, scaled, transformed, and viewed like any other OpenGL 3-D image. This function is designed to work with TrueType fonts.
The GLFONT sample shows how to use the wglUseFontOutlines function to create display lists for characters in a TrueType font and how to draw, scale, and rotate the glyphs in the font by using glCallLists to draw the characters and other OpenGL functions to rotate and scale them. You need the Win32 SDK for Windows NT 3.51 to compile this sample, and you need to incorporate wglUseFontOutlines in your own application. You also need Windows NT 3.51 to execute the application.


Уважаемые эксперты!!!
Помогите пожалуйста, как реализовать другими средствами существующую функциональность?

Нарисовал сцену в задний буфер, сделал свап. А потом, я хочу рисовать информации при движении мыши. НО, я не могу перерисовывать всю сцену.
PM MAIL WWW Skype   Вверх
gorby
Дата 5.2.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 27.3.2008
Где: Киев

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



Приведенная выше проблема не единственная у меня

Код ниже тоже работал прекрасно до появления Windows Aero
Копируется содержимое картинки нарисованной средствами OppenGl в буфер

В буфер помещается белый фон и следы рисования средствами GDI поверх OppenGl 

Код

void CView3d::OnCopyViewClipboard() 
{
    CRect R;
    GetWindowRect(&R);
    if (!OpenClipboard())
    {                                     
        Message_err("Cannot open clipboard.");
     return;
    }
    CWindowDC dc(this);
    CBitmap* pbmOld = NULL;
    CDC dcMem;
    VERIFY(dcMem.CreateCompatibleDC(&dc));

    CBitmap bm;
    VERIFY(bm.CreateCompatibleBitmap(&dc,R.Width(),R.Height()));
    ASSERT(bm.m_hObject != NULL);
    pbmOld = dcMem.SelectObject(&bm);
    
    dcMem.PatBlt(0,0,R.Width(),R.Height(),WHITENESS);
    VERIFY(dcMem.BitBlt(0, 0, R.Width(), R.Height(), &dc, 0, 0, SRCCOPY));    
    HGDIOBJ hBM=bm.Detach();
    VERIFY(::EmptyClipboard());
    VERIFY(::SetClipboardData(CF_BITMAP, hBM));
    VERIFY(::CloseClipboard());

    dcMem.SelectObject(pbmOld);
    dcMem.DeleteDC();
}

PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

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


 




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


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

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