Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2023, 15:53   #1
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию перевернуть второй экран

всем добра .


всю голову сломал как перевернуть второй экран? на 90 и 180 градусов. основной я разобрался

Код:
procedure ChangeOrientation(NewOrientation:DWORD);
var
  dm      : TDeviceMode;
  dwTemp  : DWORD;
  dmDisplayOrientation : DWORD;
begin
   ZeroMemory(@dm, sizeof(dm));
   dm.dmSize   := sizeof(dm);
   if EnumDisplaySettings(nil, DWORD(ENUM_CURRENT_SETTINGS), dm) then
   begin
      Move(dm.dmScale,dmDisplayOrientation,SizeOf(dmDisplayOrientation));
      // swap width and height
      if Odd(dmDisplayOrientation)<>Odd(NewOrientation) then
      begin
       dwTemp := dm.dmPelsHeight;
       dm.dmPelsHeight:= dm.dmPelsWidth;
       dm.dmPelsWidth := dwTemp;
      end;

      if dmDisplayOrientation<>NewOrientation then
      begin
        Move(NewOrientation,dm.dmScale,SizeOf(NewOrientation));
        if (ChangeDisplaySettings(dm, 0)<>DISP_CHANGE_SUCCESSFUL) then
         RaiseLastOSError;
      end;
   end;
end;
AppData вне форума Ответить с цитированием
Старый 22.06.2023, 17:25   #2
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

Код:
ChangeDisplaySettingsEx('\\.\DISPLAY2'
не совсем помогает. как быть - уважаемые программисты, помогите
AppData вне форума Ответить с цитированием
Старый 23.06.2023, 06:27   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Узнать количество подключенных мониторов
Код:
GetSystemMetrics( SM_CMONITORS );
Это на включение второго монитора, но может как-то поможет.
Код:
ChangeDisplaySettingsEx( PChar( @Display.DeviceName[0] ), DevMode, 0, CDS_UPDATEREGISTRY or CDS_NORESET, nil );
ChangeDisplaySettingsEx( nil, PDevMode( nil )^, 0, 0, nil );
Shouldercannon вне форума Ответить с цитированием
Старый 23.06.2023, 13:21   #4
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

нашел продолжение, но как перевернуть второй экран ни слова ни намека

Код:
const
  EDD_GET_DEVICE_INTERFACE_NAME = 1;
  ENUM_REGISTRY_SETTINGS = DWORD(-2);

procedure TForm1.Button1Click(Sender: TObject);
var
  Display: TDisplayDevice;
  DevMode: TDevMode;
begin
  // выключить второй монитор
  Display.cb := SizeOf(TDisplayDevice);
  EnumDisplayDevices(nil, 1 {второй монитор, для первого ноль},
    Display, EDD_GET_DEVICE_INTERFACE_NAME);
  ZeroMemory(@DevMode, SizeOf(TDevMode));
  DevMode.dmSize := SizeOf(TDevMode);
  DevMode.dmBitsPerPel := 32;
  DevMode.dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT or
    DM_DISPLAYFREQUENCY or DM_DISPLAYFLAGS or DM_POSITION;
  ChangeDisplaySettingsEx(PChar(@Display.DeviceName[0]),
    DevMode, 0, CDS_UPDATEREGISTRY or CDS_NORESET, nil);
  ChangeDisplaySettingsEx(nil, PDevMode(nil)^, 0, 0, nil);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Display: TDisplayDevice;
  DevMode: TDevMode;
begin
  // включить второй монитор
  Display.cb := SizeOf(TDisplayDevice);
  EnumDisplayDevices(nil, 1 {второй монитор, для первого ноль},
    Display, EDD_GET_DEVICE_INTERFACE_NAME);
  EnumDisplaySettings(PChar(@Display.DeviceName[0]),
    ENUM_REGISTRY_SETTINGS, DevMode);
  DevMode.dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT or
    DM_DISPLAYFREQUENCY or DM_DISPLAYFLAGS or DM_POSITION;
  ChangeDisplaySettingsEx(PChar(@Display.DeviceName[0]),
    DevMode, 0, CDS_UPDATEREGISTRY or CDS_NORESET, nil);
  ChangeDisplaySettingsEx(nil, PDevMode(nil)^, 0, 0, nil);
end;
AppData вне форума Ответить с цитированием
Старый 23.06.2023, 22:43   #5
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
Восклицание

уважаемые программисты, помогите с задачей. пивко уже не помогает. не могу решить задачу. очень нужно. на вас надежда:confuse d:
AppData вне форума Ответить с цитированием
Старый 25.06.2023, 13:01   #6
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

добавил

Код:
var
Display: TDisplayDevice;

if EnumDisplaySettings(PChar(Display.DeviceName[2]), DWORD(ENUM_CURRENT_SETTINGS), dm) then
не помогло **((

Код:
const
  DM_DISPLAYORIENTATION = $00800000;
  ENUM_CURRENT_SETTINGS =-1;
  DMDO_DEFAULT : DWORD  = 0;
  DMDO_90      : DWORD  = 1;
  DMDO_180     : DWORD  = 2;
  DMDO_270     : DWORD  = 3;

procedure ChangeOrientation(NewOrientation:DWORD);
var
  dm      : TDeviceMode;
  dwTemp  : DWORD;
  dmDisplayOrientation : DWORD;
  Display: TDisplayDevice;
begin
   ZeroMemory(@dm, sizeof(dm));
   dm.dmSize   := sizeof(dm);
   if EnumDisplaySettings(PChar(Display.DeviceName[1]), DWORD(ENUM_CURRENT_SETTINGS), dm) then
   begin
      Move(dm.dmScale,dmDisplayOrientation,SizeOf(dmDisplayOrientation));
      // swap width and height
      if Odd(dmDisplayOrientation)<>Odd(NewOrientation) then
      begin
       dwTemp := dm.dmPelsHeight;
       dm.dmPelsHeight:= dm.dmPelsWidth;
       dm.dmPelsWidth := dwTemp;
      end;

      if dmDisplayOrientation<>NewOrientation then
      begin
        Move(NewOrientation,dm.dmScale,SizeOf(NewOrientation));
        if (ChangeDisplaySettings(dm, 0)<>DISP_CHANGE_SUCCESSFUL) then
         RaiseLastOSError;
      end;
   end;
end;
AppData вне форума Ответить с цитированием
Старый 25.06.2023, 16:10   #7
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

что я делаю не так?

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMonInfo = record
    h:  THandle;
    dc: HDC;
    r:  TRect;
  end;

var
  Form1: TForm1;
  MonList: array of TMonInfo;

implementation

{$R *.dfm}

const
  DM_DISPLAYORIENTATION = $00800000;
  ENUM_CURRENT_SETTINGS =-1;
  DMDO_DEFAULT : DWORD  = 0;
  DMDO_90      : DWORD  = 1;
  DMDO_180     : DWORD  = 2;
  DMDO_270     : DWORD  = 3;

procedure ChangeOrientation(NewOrientation:DWORD; h:PwideChar);
var
  dm      : TDeviceMode;
  dwTemp  : DWORD;
  dmDisplayOrientation : DWORD;
begin
   ZeroMemory(@dm, sizeof(dm));
   dm.dmSize   := sizeof(dm);
   if EnumDisplaySettings(h, DWORD(ENUM_CURRENT_SETTINGS), dm) then
   begin
      Move(dm.dmScale,dmDisplayOrientation,SizeOf(dmDisplayOrientation));
      if Odd(dmDisplayOrientation)<>Odd(NewOrientation) then
      begin
       dwTemp := dm.dmPelsHeight;
       dm.dmPelsHeight:= dm.dmPelsWidth;
       dm.dmPelsWidth := dwTemp;
      end;

      if dmDisplayOrientation<>NewOrientation then
      begin
        Move(NewOrientation,dm.dmScale,SizeOf(NewOrientation));
        if (ChangeDisplaySettings(dm, 0)<>DISP_CHANGE_SUCCESSFUL) then
         RaiseLastOSError;
      end;
   end;
end;

function EnumDisplayMonitors(dc: HDC; rect: PRect; EnumProc: pointer; lData: LPARAM): BOOL; stdcall; external user32;
function MonitorEnumProc(hMonitor: THandle; hdcMonitor: HDC; lprcMonitor: DWORD; dwData: LPARAM): BOOL; stdcall;
type PRect = ^TRect;
var c: integer;
begin
  c := High(MonList)+1; SetLength(MonList, c+1);
  MonList[c].h := hMonitor;
  MonList[c].dc := hdcMonitor;
  MonList[c].r := PRect(lprcMonitor)^;
  result := true;
end;


procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
  h: HWND;
begin
  memo1.Clear;
  for i := 0 to High(MonList) do
  with MonList[i] do
  begin
    memo1.Lines.Add('Monitor #' + IntToStr(i));
    memo1.Lines.Add('hMon:  ' + IntToHex(h, 0));
    memo1.Lines.Add('HDC:   ' + IntToHex(dc, 0));
    memo1.Lines.Add('Left:  ' + IntToStr(r.Left));
    memo1.Lines.Add('Top:   ' + IntToStr(r.Top));
    memo1.Lines.Add('Right: ' + IntToStr(r.Right));
    memo1.Lines.Add('Bott:  ' + IntToStr(r.Bottom));
    memo1.Lines.Add('');
  end;

  ChangeOrientation( DMDO_180, PwideChar(h) );
  Sleep(1000);
  ChangeOrientation( DMDO_DEFAULT, PwideChar(h) );
end;

initialization
  EnumDisplayMonitors(0, nil, Addr(MonitorEnumProc), 0);
finalization

end.
AppData вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Среди трех точек с координатами (x1,y1), (x2,y2), (x3,y3) определить количество точек, лежащих во второй четверти и вывести на экран их координаты. Viktoria_ Паскаль, Turbo Pascal, PascalABC.NET 3 20.02.2018 00:07
Перевернуть число. MAKEDON Общие вопросы C/C++ 3 23.04.2017 15:16
вывод на второй экран lekanni C# (си шарп) 5 05.04.2013 17:34
Перевернуть строку Манжосов Денис :) Общие вопросы Delphi 13 03.12.2008 04:37
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27