Отправляет email-рассылки с помощью сервиса Sendsay

Школа программирования

  Все выпуски  

Школа программирования Виртуальный рабочий стол


Недавно нужно было написать проект для компьютера с двумя мониторами, но у меня только один:) Под линуксом давно есть решение - виртуальный рабочий стол. Например, разрешение вашего монитора 640 на 480, а виртуальный рабочий стол делается 1024 на 768 и вы возите мышкой и играете калейдоскоп:).
Под виндой есть похожая штука, но не такая удобная. Сделать нормальный большой виртуальный стол можно несколькими платными и бесплатными программами, но не удобные они:( Более или менее мне подошла бесплатная программа sdesk_1.66s. Автор ее, кажется, забросил, но она по наворотам удобнее даже платных:) При запуске она делает виртуальный стол, вы можете увеличить его размеры, что я и сделал:) Если зажать ctrl и alt и понажимать стрелки, то будет грубое перемещение по виртуальному столу, если зажать ctrl, alt и shift и нажимать стрелки, то перемещение будет плавным. Еще можно настроить, чтобы на плашке, которая показывает ваш виртуальный стол и открытие окна на нем, при нажатии кнопки мыши вы перемещались в выбранную область виртуального рабочего стола. Почему то нет, или я не нашел, как сделать так, чтобы перемещаться по виртуальному рабочему стол просто перемещая мышь. 
Есть еще одна засада:) По умолчанию все программы имеют максимальный размер, равный физическому размеру экрана, поэтому даже с виртуальным рабочем столом не будут растягиваться на два экрана. Решается это или обработкой сообщения WM_GETMINMAXINFO вот так (для mdi или sdi)

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
     // TODO: Add your message handler code here and/or call default
    
     lpMMI->ptMaxSize.x = 40000;
     lpMMI->ptMaxTrackSize.x = 40000;

     lpMMI->ptMaxSize.y = 40000;
     lpMMI->ptMaxTrackSize.y = 40000;


     CFrameWnd::OnGetMinMaxInfo(lpMMI);
}  

или так (для диалога)
void CTestsize2Dlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
     // TODO: Add your message handler code here and/or call default
    
      lpMMI->ptMaxSize.x = 40000;
     lpMMI->ptMaxTrackSize.x = 40000;

     lpMMI->ptMaxSize.y = 40000;
     lpMMI->ptMaxTrackSize.y = 40000;  


     CDialog::OnGetMinMaxInfo(lpMMI);
}


Это решает проблему растягивания по горизонтали, но по вертикали нужно написать еще что-то, так как при таком коде после отпускания клавиши мыши размер уменьшается. Где-то сидит обработчик того, что заголовок окна должен быть виден всегда:)

Можно конечно написать dll, которая будет перехватывать это сообщение от всех открытых окон и сама его обрабатывать - это наверно лучше всего - такой подход был в какой-то платной программе создания виртуального рабочего стола:)

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

В избранное