Вывод графики "поверх всего"

Тема в разделе "WASM.WIN32", создана пользователем Svinn2003, 29 ноя 2004.

  1. Svinn2003

    Svinn2003 New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2004
    Сообщения:
    1
    Мир Вам!



    Итак, мысля: Есть у меня клава (мультимедийная) с кнопочками регулировки громкости и т.д. Так вот, с ней специальный драйвер-программмка. При нажатии на кнопочки регулировки громкости звука на экране появляется полоска, такая как на телевизоре, показывающая уровень громкости, причем выводится всегда, что бы не было запущено, хоть 3д игра, хоть в режиме эмуляции дос.

    Вопрос: как вывести графику также поверх всего.

    Пробовал получать hDC десктопа и рисовать на экране через него, но все этоо надо переодически рефрешить. Если это делать по таймеру - получается некрасиво - мерцает. А в играх частота обновления экрана такая, что моей графики практически не видно.



    Какие у кого есть идеи?

    Может надо както отлавливать момент обновления экрана и дорисовывать свою графику, но как?
     
  2. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Сдается мне, что это не на 3-м кольце делается, хотя я скорее всего ошибаюсь. Попробуй сам драйвер посмотреть. Или вот еще, что. Есть у меня замечательный менеджер для трубки - float Mobile Agent называется, там к нему приблуда есть, float Media Control называется, делает нечто подобное (выводит громкость в процентах на экране). Прога это opensource, лежит на SourceForge
     
  3. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
  4. Tellur

    Tellur New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    21
    Адрес:
    Новокузнецк
    По-моему такое можно с помощью видео оверлея сделать.
     
  5. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Tellur

    Объясни что есть такое этот видео оверлей.
     
  6. Tellur

    Tellur New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    21
    Адрес:
    Новокузнецк
    Посмотри тут

    http://www.delphimaster.ru/articles/directx/

    там написано что это такое и даже пример использования реализации оверлея в DirectX, насколько я понял из MSDN есть и другие реализации
     
  7. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Tellur

    Интересная статейка. Возможно float media control именно через оверлеи и рисует.
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Есть (полу)документированная возможность рисовать на экране без оверлея.

    Смысл прост - получаем адрес экраной памяти и рисуем :)



    для простоты пример расчитан на 32bpp (сорри за сишный код)


    Код (Text):
    1.  
    2. #define INITGUID
    3. #include <ddraw.h>
    4. #include <windows.h>
    5. #pragma comment(linker, "/entry:start /subsystem:windows")
    6. #pragma comment(lib, "kernel32.lib")
    7. #pragma comment(lib, "ddraw.lib")
    8.  
    9.  
    10. void start()
    11. {
    12.     IDirectDraw7          * direct_draw;
    13.     IDirectDrawSurface7   * primary_surface;
    14.     DDSURFACEDESC2          surface_descriptor;
    15.  
    16.     char * p = (char *)&surface_descriptor;
    17.     int i = sizeof(surface_descriptor);
    18.  
    19.     while(i--)
    20.         *p++ = 0;
    21.     surface_descriptor.dwSize = sizeof(surface_descriptor);
    22.  
    23.     DirectDrawCreateEx(0, (void**)&direct_draw,
    24.                         IID_IDirectDraw7, 0);
    25.  
    26.     direct_draw->SetCooperativeLevel(0, DDSCL_NORMAL);
    27.  
    28.     surface_descriptor.dwFlags = DDSD_CAPS;
    29.     surface_descriptor.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    30.  
    31.     direct_draw->CreateSurface(&surface_descriptor,
    32.                         &primary_surface, NULL);
    33.  
    34.     primary_surface->Lock(0, &surface_descriptor, 0, 0);
    35.     void * memory = surface_descriptor.lpSurface;
    36.  
    37.     for( int dy = surface_descriptor.dwHeight;
    38.          dy;
    39.          dy--, memory = (char *)memory + surface_descriptor.lPitch )
    40.     {
    41.         for( int dx = surface_descriptor.dwWidth;
    42.              dx; --dx )
    43.             if ( (dx ^ dy) & 1 )
    44.                 *((int *)memory + dx) = -1;  
    45.     }
    46.  
    47.     primary_surface->Unlock(0);
    48.     ExitProcess(0);
    49. }
    50.  




    [​IMG] 785445327__over.exe





    ЗЫ: Тфу, не прочитал как следует, это не то :-(