Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

Перенос главной формы приложения на другой монитор   Найти похожие ветки 

 
Skyle ©   (2007-12-06 07:18) [0]

Решил тут приделать в программу фенечку такую: кнопку нажимаешь и окно переносится на следующий монитор. Если два одинаковых монитора с одинаковым разрешением на двухголовой карте, то всё работает. А если две карты, разные мониторы, разные разрешения, то не работает: при переносе на меньший монитор (не primary) программа на нём не видна, приходится активировать в таскбаре чтобы появилась. Вроде изменение размеров учел...

И ещё: при таком переносе если на другом мониторе минимизируешь окно, оно минимизируется на тот монитор, на котором было запущено изначально.

Соответственно вопрос: что надо посмотреть (ключевые слова) чтобы грамотно сделать перенос окна, что я упустил.

Код следующий:

procedure TfBaseMain.acChangeMonitorExecute(Sender: TObject);
var
 R : TRect;
 WndHandle : THandle;

 procedure GetNewMonitorRect(var R : TRect);
 var
   hOldMon, hMon : HMONITOR;
   MI : TMonitorInfo;
   RM : TRect;
   H, W, I : Integer;
 begin
   hMon := 0;

   hOldMon := MonitorFromWindow(WndHandle, MONITOR_DEFAULTTONEAREST);
   for I := 0 to Screen.MonitorCount - 1 do
     if Screen.Monitors[I].Handle = hOldMon then
     begin
       //Следующий монитор будет дальше (по циклу)
       hMon := Screen.Monitors[(I + 1) mod Screen.MonitorCount].Handle;
       Break;
     end;

   if hMon = 0 then
     Exit; //Паранойя

   W := R.Right - R.Left;
   H := R.Bottom - R.Top;

   MI.cbSize := SizeOf(MI);
   GetMonitorInfo(hMon, @MI);

   RM := MI.rcWork;

   R.Left := RM.Left + (RM.Right - RM.Left - W) div 2;
   R.Top := RM.Top + (RM.Bottom - RM.Top - H) div 2;
   R.Right := R.Left + W;
   R.Bottom := R.Top + H;
 end;

begin
 inherited;
 WndHandle := Application.MainForm.Handle;
 GetWindowRect(WndHandle, R);
 GetNewMonitorRect(R);
 SetWindowPos(WndHandle, 0, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, SWP_NOZORDER);
end;


Пробовал добавлять в конце
 SetWindowPos(Application.Handle, 0, R.Left, R.Top, 0, 0, SWP_NOSIZE);не помогает - всё равно минимизируется на primary монитор.


 
Skyle ©   (2007-12-06 14:25) [1]

Мой вопрос неинтересен, плохо сформулирован или просто глуп?


 
KSergey ©   (2007-12-06 14:28) [2]

> Skyle ©   (06.12.07 14:25) [1]
> Мой вопрос неинтересен, плохо сформулирован или просто глуп?

Вероятно это просто новая довольно тема.
Хотя, уверен, когда-нибудь и это будет так же как и запуздырить туда где все знают :)


 
Skyle ©   (2007-12-06 14:36) [3]

> KSergey ©   (06.12.07 14:28) [2]
Ну ладно, будем первопроходцами :)


 
Koss   (2007-12-06 23:47) [4]

мне эта тема офигенно интересна ибо я вообще не предстовляю каким образом можно отобразить окно на другом мониторе      буду очень презнателен если подкинеш мне инфы по теме.


 
Skyle ©   (2007-12-07 07:23) [5]


> Koss   (06.12.07 23:47) [4]

Код в [0] рабочий, основан на примере из MSDN. Есть просто несколько некрасивостей, которые я и пытаюсь победить.



Страницы: 1 вся ветка

Текущий архив: 2007.12.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
2-1197020808
Кевларвестов Семен
2007-12-07 12:46
2007.12.30
Передача между variant ами значения 0000 как строки


15-1193772243
Marser
2007-10-30 22:24
2007.12.30
ADSL-модем. "шо это было?!"(с)


15-1196074479
No_Dead
2007-11-26 13:54
2007.12.30
Логика БД


5-1164714160
Hollander
2006-11-28 14:42
2007.12.30
Проблема с SelAttributes


6-1176785568
mail
2007-04-17 08:52
2007.12.30
Получение инфы с удалённого сервера MySql