Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227

Работа в окне

22.09.2019, 00:57. Показов 6334. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поделитесь примером как инициализировать directdraw для работы в стандартной форме желательно под bulder, все попытки не увенчались успехом, в полноэкранном режиме работает.
Изучаю первый день )
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2019, 00:57
Ответы с готовыми решениями:

Работа в определенном окне
Как сделать чтобы програмка работала с открытым окном независимо от того в каком окне я сижу? Т.е. я сижу в опере а она работала с ИЕ и...

Работа в окне браузера
Программа кликает в закрытое окно браузера, после клика надо как то поределить, прогрузилась ли страница до конца, как это сделать?

Работа в неактивном окне
Народ, подскажете как, ну или ссылку на информацию дайте, как можно сделать следующее: заставить программу работать даже тогда, когда окно...

41
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
05.10.2019, 22:57  [ТС]
Студворк — интернет-сервис помощи студентам
Тут в теме поспешил неправильно ключи вставил, в проге все правильно
lpDDSPrimary->Blt(&dr, lpDDSBack0, &sr, DDBLT_COLORFILL | DDBLT_WAIT, 0);

Больше всего конечно из directdraw умиляет что можно выводить чистый график без всяких окон и фона прямо на рабочий стол, смотрится прямо скажем неожиданно )))

Добавлено через 24 минуты
Черт перепутал DDBLT_KEYSRC и DDBLT_COLORFILL
короче все работает что по отдельности копировать буферы в праймери что сначало слить буферы а потом в праймери )
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.10.2019, 17:23  [ТС]
Вопросик появился,
есть окно, на него отсечение праймери, все отлично выводиться но если сдвинуть окно то на рабочем столе
остаются изображения со старого места окна, те фантомы, можно это как то победить ?
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
10.10.2019, 18:45
Первичная поверхность имеет размер равный всему десктопу. В оконном режиме нужно выполнять свои Blt на первичную поверхность относительно текущих координат окна на десктопе. Возможно, вы где-то промахнулись и сделали Blt не по тем координатам. На своих тестах я не замечал подобной проблемы.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.10.2019, 18:51  [ТС]
Все именно так и делается, при перетаскивании окна изображение тоже сдвигается, но на старом месте остается старое изображение.
Вообще то оно и понятно, если первичная поверхность это видеопамять, а мы ее порисовали а потом перешли в другое место на старом месте останутся все наши рисунки пока винда не обновит экран.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
10.10.2019, 19:16
Логично, что пока не обновит. Но сдаётся мне, что винда при перетаскивании таки вызывает обновление. А проблема будет если порисовать уже после этого обновления.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
10.10.2019, 23:49  [ТС]
Вот так выглядит беда )
https://youtu.be/mNs08fgLUgM
мож 98 винда виновата надо на семерке попробовать.

Добавлено через 4 часа 28 минут
Короче это был какой то жесткий глюк или винды или видеокарты, прошел сам собой.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
12.10.2019, 00:34  [ТС]
Вот эту тестовую програмку никак ускорить (те уменьшить загрузку проца) нельзя ?
У меня все тормоза от вызовов

lpDDSBack->Lock(NULL, &SurfaceDesc, DDLOCK_WAIT, NULL);
lpDDSBack->Unlock(SurfaceDesc.lpSurface);

а без этих вызовов невозможно внести данные .
Celeron 1.2Ггц грузиться на 100 % (
Вложения
Тип файла: rar тест.rar (27.2 Кб, 1 просмотров)
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
12.10.2019, 11:30
В моём понимании, Lock/Unlock работает так:
- есть поверхность в памяти видео карты,
- делаем Lock, поверхность целиком копируется в память компа, возвращается адрес памяти компа,
- используя адрес модифицируем содержимое памяти,
- делаем Unlock, поверхность из памяти компа целиком копируется обратно в память видео карты.

Из-за постоянной переброски памяти туда-сюда такой способ рисовать не очень эффективный. Уменьшайте количество вызовов Lock/Unlock, блокируйте не всю картинку, а только её часть, где планируете вносить изменения. Наверное, я бы ещё попробовал сделать постоянный буфер в памяти компа. При вызове Lock/Unlock для такого буфера не будет вызываться копирование данных. Рисовал бы всё на этой поверхности, а затем копировал её на первичную. Таким образом полная картинка всегда будет в памяти компа и её не нужно забирать из видеопамяти, что в двое уменьшает нагрузку на копирование (по коду, вы похоже и так делаете вспомогательную поверхность в памяти, так что последний совет не актуален).

Хотя с другой стороны, копирование данных из одной памяти в другую должно грузить шину, а не процессор. Возможно, загрузка процессора происходит в пользовательском коде при расчётах и модификации точек.

Добавлено через 42 минуты
Попробовал у себя запустить ваш тест.
1) Создание поверхности с флагом DDSCAPS_SYSTEMMEMORY приводило к эксепшену. Убрал этот флаг и не стал добавлять VIDEOMEMORY. Создавал поверхность без явного указания её местоположения, надеюсь она создавалась в хосте.
2) Замер времени выполнения фрагментов кода показал, что Lock и Unlock выполняются 0 мс, а вот цикл установки точек порядка 37 мс. Полагаю, что именно этот цикл и жрёт ресурсы ЦП.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
12.10.2019, 12:27  [ТС]
Странно, я блокировал вывод точек полностью, ( с сохранением голых лок/анлок) загрузка проца не изменилась вообще я так вижу на разных компах эта directdraw ведет себя совершенно по разному.
А как вы замеряли время выполнения куска кода ?
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
12.10.2019, 13:54
Примерно так измерял.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    LARGE_INTEGER liPoint[4], liFreq;
    QueryPerformanceFrequency(&liFreq);
 
    QueryPerformanceCounter(&liPoint[0]); // первое время
    DDSURFACEDESC SurfaceDesc = { sizeof(DDSURFACEDESC) };
    m_pOffscreen->Lock(NULL, &SurfaceDesc, DDLOCK_WAIT, NULL);
    QueryPerformanceCounter(&liPoint[1]); // второе время
 
    BYTE* AdresVideo = (BYTE*)SurfaceDesc.lpSurface;
 
    for (int j = 0; j != screenW; j++)
    {
        int x = j * 4;
        for (int i = 0; i != screenH; i++)
        {
            int y = i * SurfaceDesc.lPitch;
            AdresVideo[x + y] = (BYTE)rand();
            AdresVideo[x + 1 + y] = 0;
            AdresVideo[x + 2 + y] = 0;
            AdresVideo[x + 3 + y] = 250;
        }
 
    }
 
    QueryPerformanceCounter(&liPoint[2]);  // третье время
    m_pOffscreen->Unlock(SurfaceDesc.lpSurface);
    QueryPerformanceCounter(&liPoint[3]);  // четвёртое время
 
    // ....
 
    static int historyInd = 0;
    static int history[500][3];
    history[historyInd][0] = int((liPoint[1].QuadPart - liPoint[0].QuadPart) * 1000 / liFreq.QuadPart); // время Lock
    history[historyInd][1] = int((liPoint[2].QuadPart - liPoint[1].QuadPart) * 1000 / liFreq.QuadPart); // время цикла
    history[historyInd][2] = int((liPoint[3].QuadPart - liPoint[2].QuadPart) * 1000 / liFreq.QuadPart); // время Unlock
    if (++historyInd == 500)
        historyInd = 0; // тут ставил брекпоинт и смотрел потом в отладчике history
1
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
12.10.2019, 14:09  [ТС]
Попробовал на 3 других компах, действительно грузит в основном ввод точек, может очередной глюк был, пока до того компа где тормозило не добрался.
Тогда вопрос - как же изменить все точки на поверхности быстро и почему так медленно они заносятся ?
Перейти на 16 бит цвет не получиться.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
12.10.2019, 14:41  [ТС]
Похоже не получиться быстро все точки менять, остановлюсь на таком варианте
Вложения
Тип файла: rar Project1.rar (7.9 Кб, 0 просмотров)
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
13.10.2019, 01:57  [ТС]
Сделал психоделическую програмку )
Вложения
Тип файла: rar Project1.rar (187.0 Кб, 0 просмотров)
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
14.10.2019, 20:56  [ТС]
Беда какая то с этим Dx, вот например как попасть в рабочею область окна без учета шапки (где кнопки меню)
Допустим на одном компе сделаем координаты поверхности Form->Top+36 чтобы меню не закрывать, все отлично, но переходим на другой комп и оба на - вместо +36 надо уже другую величину делать.... как же ее туда запихать чтобы на всех компах вписывалась нормально ?
(те высота шапки в форме на разных видеокартах/дисплеях имеет разную величину в точка)

Добавлено через 20 минут
надо наверно все таки отсечение использовать.
0
фрилансер
 Аватар для Алексей1153
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,199
14.10.2019, 21:22
whale2, если я правильно понял, что тебе нужно, то вот так сможешь найти смещение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    HWND h=...;//хендл окна
 
    //глобальные координаты всего окна
    RECT wr_global={0};
    ::GetWindowRect(h,&wr_global);
 
    //глобальные координаты клиентской части
    RECT cl_global={0};
    ::GetClientRect(h,&cl_global);
    ::MapWindowPoints(h,0,(POINT*)&cl_global,2);
 
    //смещение клиентской области от угла окна
    long top_padding=cl_global.top -wr_global.top ;
    long lef_padding=cl_global.left-wr_global.left;
1
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
14.10.2019, 22:22  [ТС]
Спасибо попробую.

Добавлено через 20 минут
Красота, работает
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
15.10.2019, 10:20  [ТС]
Еще небольшая проблема, если окно выходит на пределы экрана blt перестает работать, есть более менее рабочий вариант запрета выхода окна ? Пытался делать через сообщения и принудительной установкой координат но окно начинает дергаться при попытке вывести за пределы .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
h
 
BEGIN_MESSAGE_MAP
       MESSAGE_HANDLER(WM_MOVING, TMessage, CatchDrag);
       END_MESSAGE_MAP(TForm)
 
void __fastcall CatchDrag(TMessage &Msg);
 
 
cpp
 
void __fastcall TForm10::CatchDrag(TMessage &Msg)
{
TForm::Dispatch(&Msg);
 
    if(Msg.Msg == WM_MOVING)
      {
 
        if(Form10->Left<0)Form10->Left=0;                               
        if(Form10->Left+Form10->Width > Screen->Width)Form10->Left=Screen->Width-Form10->Width;
 
        if(Form10->Top<0)Form10->Top=0;
        if(Form10->Top+Form10->Height > Screen->Height)Form10->Top = Screen->Height-Form10->Height;
 
        }
}
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
16.10.2019, 01:07  [ТС]
Кто нить может объяснить такой эффект,
берем форму, вычисляем координаты,
создаем праймери на весь экран,
блокируем праймери по координатам формы
заносим рисунок
разблокируем праймери

теперь если двигать форму, то рисунок остается в форме ! хотя по идее должен остаться на экране в месте создания.
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
16.10.2019, 12:28
Цитата Сообщение от whale2 Посмотреть сообщение
Пытался делать через сообщения и принудительной установкой координат но окно начинает дергаться при попытке вывести за пределы
Не знаю как это делается в билдере, но для WinAPI в обработчике WM_MOVING нужно менять не координаты окна (формы), а смотреть прямоугольник в аргументах сообщения и изменять именно этот прямоугольник, если что-то не устраивает.
lParam
A pointer to a RECT structure with the current position of the window, in screen coordinates. To change the position of the drag rectangle, an application must change the members of this structure.


Цитата Сообщение от whale2 Посмотреть сообщение
теперь если двигать форму, то рисунок остается в форме !
Возможно винда закэшировала картинку и как-то использует данный кэш, скорее всего как только окно свернётся/развернётся или на время закроется другими окнами кэш обнулится. Дальше вызовется WM_PAINT и, если в нём нет новой корректной отрисовки, то начнётся кривое отображение. То что вы ожидаете я видел на видео плеерах при использовании ими оверлея. Наверное, использование оверлея отключает возможность подобного кэширования.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
16.10.2019, 14:55  [ТС]
Еще бы понять где и как этот lparam выцепить.... 90% времени выходить не прогать алгоритмы а искать какую где закорючку поставить (

Насчет кэширования точно, если свернуть-развернуть или перекрыть картинка исчезает/портиться.
Непонятно главное - как винда решила что эта картинка привязана именно к форме, нигде это не указано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2019, 14:55
Помогаю со студенческими работами здесь

работа приложение в окне формы
надо запустить прогу в окне формы !???!?!?!?!

Работа скрипта в свернутом окне
Привет. Если можно подскажите пожалуйста- есть ли возможность заставить скрипт работать в свернутом окне. У меня есть скрипт который...

Работа с массивом в графическом окне
Столкнулся с проблемой заполнения массива матрицы в новом окне (работал в CodeBlocks-EP). В файле Определитель - основное содержится...

Работа с бэкграундом в окне SFML
Разрабатываю проект на С++ с библиотекой SFML и возник такой вопрос: как сделать масштабируемое изображение в рабочем окне. У меня...

Работа программы при не активном окне
Доброго времени суток. Столкнулся со следующей проблемой. Не знаю как это обозвать поэтому напишу подробно что надо и как есть. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru