Вопрос Как сделать аналог combobox'a выбора доступных разрешений экрана?

Andreo Fadio

Старожил
В системе Windows есть combobox с доступными для пользователя разрешениями экрана, как получить такое же на inno setup без заполнения от руки параметров и в последствие при выбора пункта из этого combobox передать выбранное значение.

Если такое можно, просьба поделиться примером :$
 

Avengerz13

Участник
@Andreo Fadio,
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
const
  CCHFORMNAME = 32;
  CCHDEVICENAME = 32;  
type
  TDeviceMode = record
    dmDeviceName: array[0..CCHDEVICENAME - 1] of Char;
    dmSpecVersion: Word;
    dmDriverVersion: Word;
    dmSize: Word;
    dmDriverExtra: Word;
    dmFields: DWORD;
    dmOrientation: Smallint;
    dmPaperSize: Smallint;
    dmPaperLength: Smallint;
    dmPaperWidth: Smallint;
    dmScale: Smallint;
    dmCopies: Smallint;
    dmDefaultSource: Smallint;
    dmPrintQuality: Smallint;
    dmColor: Smallint;
    dmDuplex: Smallint;
    dmYResolution: Smallint;
    dmTTOption: Smallint;
    dmCollate: Smallint;
    dmFormName: array[0..CCHFORMNAME - 1] of Char;
    dmLogPixels: Word;
    dmBitsPerPel: DWORD;
    dmPelsWidth: DWORD;
    dmPelsHeight: DWORD;
    dmDisplayFlags: DWORD;
    dmDisplayFrequency: DWORD;
    dmICMMethod: DWORD;
    dmICMIntent: DWORD;
    dmMediaType: DWORD;
    dmDitherType: DWORD;
    dmICCManufacturer: DWORD;
    dmICCModel: DWORD;
    dmPanningWidth: DWORD;
    dmPanningHeight: DWORD;
  end;
  TDeviceFilter = record
    Width: DWORD;
    Height: DWORD;
    BitDepth: DWORD;
  end;

function EnumDisplaySettings(lpszDeviceName: string; iModeNum: DWORD;
  var lpDevMode: TDeviceMode): BOOL;
  external 'EnumDisplaySettings{#AW}@user32.dll stdcall';

procedure InitializeWizard;
var
  ModeIndex: DWORD;
  ModeExists: Boolean;
  FilterIndex: Integer;  
  DisplayPage: TWizardPage;
  DisplayCombo: TNewComboBox;
  DisplayModes: array of TDeviceFilter;
  DisplaySettings: TDeviceMode;
begin
  DisplayPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');
  DisplayCombo := TNewComboBox.Create(WizardForm);
  DisplayCombo.Parent := DisplayPage.Surface;
  DisplayCombo.Style := csDropDownList;
  DisplayCombo.Width := 200;

  ModeIndex := 0;
  while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
  begin    
    with DisplaySettings do
    begin
      Inc(ModeIndex);
      if (dmBitsperPel <> 16) and (dmBitsperPel <> 32) then
        Continue;

      ModeExists := False;
      for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
      begin
        if (DisplayModes[FilterIndex].Width = dmPelsWidth) and
          (DisplayModes[FilterIndex].Height = dmPelsHeight) and
          (DisplayModes[FilterIndex].BitDepth = dmBitsperPel) then
        begin
          ModeExists := True;
          Break;
        end;
      end;

      if not ModeExists then
      begin        
        SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
        with DisplayModes[GetArrayLength(DisplayModes) - 1] do
        begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          BitDepth := dmBitsperPel;
          DisplayCombo.Items.Add(Format('%dx%d %d bpp', [Width, 
            Height, BitDepth]));
        end;      
      end;
    end;    
  end;
end;
 
Последнее редактирование:

Avengerz13

Участник
@Andreo Fadio, можешь использовать DisplayCombo.Text

Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
const
  CCHFORMNAME = 32;
  CCHDEVICENAME = 32; 
type
  TDeviceMode = record
    dmDeviceName: array[0..CCHDEVICENAME - 1] of Char;
    dmSpecVersion: Word;
    dmDriverVersion: Word;
    dmSize: Word;
    dmDriverExtra: Word;
    dmFields: DWORD;
    dmOrientation: Smallint;
    dmPaperSize: Smallint;
    dmPaperLength: Smallint;
    dmPaperWidth: Smallint;
    dmScale: Smallint;
    dmCopies: Smallint;
    dmDefaultSource: Smallint;
    dmPrintQuality: Smallint;
    dmColor: Smallint;
    dmDuplex: Smallint;
    dmYResolution: Smallint;
    dmTTOption: Smallint;
    dmCollate: Smallint;
    dmFormName: array[0..CCHFORMNAME - 1] of Char;
    dmLogPixels: Word;
    dmBitsPerPel: DWORD;
    dmPelsWidth: DWORD;
    dmPelsHeight: DWORD;
    dmDisplayFlags: DWORD;
    dmDisplayFrequency: DWORD;
    dmICMMethod: DWORD;
    dmICMIntent: DWORD;
    dmMediaType: DWORD;
    dmDitherType: DWORD;
    dmICCManufacturer: DWORD;
    dmICCModel: DWORD;
    dmPanningWidth: DWORD;
    dmPanningHeight: DWORD;
  end;
  TDeviceFilter = record
    Width: DWORD;
    Height: DWORD;
    BitDepth: DWORD;
  end;

var
  ModeIndex: DWORD;
  ModeExists: Boolean;
  FilterIndex: Integer; 
  DisplayPage: TWizardPage;
  DisplayCombo: TNewComboBox;
  DisplayModes: array of TDeviceFilter;
  DisplaySettings: TDeviceMode;

function EnumDisplaySettings(lpszDeviceName: string; iModeNum: DWORD;
  var lpDevMode: TDeviceMode): BOOL;
  external 'EnumDisplaySettings{#AW}@user32.dll stdcall';

procedure DisplayComboChange(Sender: TObject);
begin
  MsgBox(DisplayCombo.Text, mbInformation, MB_OK);
end;

procedure InitializeWizard;
begin
  DisplayPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');
  DisplayCombo := TNewComboBox.Create(WizardForm);
  DisplayCombo.Parent := DisplayPage.Surface;
  DisplayCombo.Style := csDropDownList;
  DisplayCombo.Width := 200;
  DisplayCombo.OnChange := @DisplayComboChange;

  ModeIndex := 0;
  while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
  begin   
    with DisplaySettings do
    begin
      Inc(ModeIndex);
      if (dmBitsperPel <> 16) and (dmBitsperPel <> 32) then
        Continue;

      ModeExists := False;
      for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
      begin
        if (DisplayModes[FilterIndex].Width = dmPelsWidth) and
          (DisplayModes[FilterIndex].Height = dmPelsHeight) and
          (DisplayModes[FilterIndex].BitDepth = dmBitsperPel) then
        begin
          ModeExists := True;
          Break;
        end;
      end;

      if not ModeExists then
      begin       
        SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
        with DisplayModes[GetArrayLength(DisplayModes) - 1] do
        begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          BitDepth := dmBitsperPel;
          DisplayCombo.Items.Add(Format('%dx%d %d bpp', [Width,
            Height, BitDepth]));
        end;     
      end;
    end;   
  end;
end;
 
Сверху