Direct Draw: окно в окне??? Help!!

Тема в разделе "WASM.DirectX", создана пользователем globe_2007, 7 ноя 2009.

  1. globe_2007

    globe_2007 New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2009
    Сообщения:
    3
    Добрый всем день!
    1. Есть приложение которое работает в полно-экранном режиме. (использует DirectDraw)

    Задача:
    В DirectDraw определить область, чтобы запустить другое приложение DirectDraw внутри этой области. (Запустить DirectDraw приложение внутри другого окна DirectDraw????)


    Подскажите пожалуйста, как это сделать!???
    Заранее благодарен!
     
  2. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    globe_2007 какие программы? Ищи информацию по Surface, Overlay и для начала прочитай как работает DirectDraw.
     
  3. globe_2007

    globe_2007 New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2009
    Сообщения:
    3
    Есть прога, выводящая на экран в графическом режиме (DD) данные, в зависимости от ходных параметров. Надо сделать другую прогу, тоже в графике DD, которая запустит эту прогу в 4-х экземплярах. Каждый экземпляр будет со своими параметрами. Надо свести эти 4 экрана в один и отображать их одновременно, каждый в своём окне.
     
  4. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    globe_2007 в твоем случае легче пропатчить программу под оконный режим. И запускать четыре копии программы с разными входными данными. У тебя будет четыре окна.
     
  5. globe_2007

    globe_2007 New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2009
    Сообщения:
    3
    ...пропатчить - не представляю, как это сделать. Не хотелось бы вмешиваться в готовую программу.
    Я попробовал вариант с ShellExecuteEx. Но он не прошёл. Может я что-то не так делаю?
    Код (Text):
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var
    3.   WndApp : HWND;
    4. begin
    5.   GetMem(ProcInfo, SizeOf(ProcInfo^));
    6.   ZeroMemory(ProcInfo, SizeOf(ProcInfo^));
    7.   with ProcInfo^ do begin
    8.     Wnd := self.Handle;
    9.     cbSize := SizeOf(ProcInfo^);
    10.     lpFile := PChar(Example1);
    11.     lpParameters := nil;
    12.     lpVerb := 'open';
    13.     //nShow := SW_SHOW;
    14.     nShow := SW_HIDE;
    15.     fMask := SEE_MASK_DOENVSUBST or SEE_MASK_NOCLOSEPROCESS;
    16.   end;
    17.  
    18.   try
    19.     Win32check(ShellExecuteEx(ProcInfo));
    20.   finally
    21.     WaitForSingleObject(ProcInfo.hProcess, 1000);
    22.     if ProcInfo.hProcess <> 0 then CloseHandle(ProcInfo.hProcess);
    23.     Dispose(ProcInfo);
    24.  end;
    25.  
    26.   // ищем окно
    27.   WndApp := FindWindow(nil, 'Function results');
    28.   if WndApp <> 0 then
    29.   begin
    30.     // подчиняем найденное окно
    31.     Windows.SetParent(WndApp, self.Handle);
    32.     // убрать рамку и заголовок
    33.     Windows.SetWindowLongA(WndApp, GWL_STYLE, GetWindowLongA(WndApp, GWL_STYLE) and not (WS_Overlapped or Ws_caption or WS_ThickFrame));
    34.     // подвинем окно
    35.     Windows.SetWindowPos(WndApp, HWND_TOP, 8, 10, 480, 640, SWP_NOSIZE);
    36.     // восстановим размеры экрана
    37.     ResetScreen(true);
    38.     // показать окно с результатами
    39.     Windows.ShowWindow(WndApp, SW_SHOW);
    40. end;
    41.  
    42. end;
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Мне представляется такое. Пишем библу - прехватчик DD. Она шаманит под свои нужды (отключает полноэкранный режим, предоставляет свои поверхности.) И так 4 экземпляра. Есть главное приложение - сервер, которое получает данные от библ - прехватчиков и выводит данные как нужно. Наверно будет нужен более-менее приличный процессор. Но всё это изврат конечно. ^)
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Booster вполне нормальный вариант если его правильно реализовать. Нужно подменить первичную поверхность и выводить на внеэкранную . блиттить туда все ч поверхности от перехватчиков-длл как нужно и прорисовывать в приложении сервере уже внеэкранную эту на экран.