Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年07月07日] [更新 2013年11月11日] Delphi サンプルプログラム集
SystemParametersInfo 関数サンプル
S05_メニュー関係
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
S05_SystemParametersInfo_Menu.zip [1,632 KB] 2013年11月11日版 (EXE 同梱)







01_メニューバーのメニューの右寄せ左寄せ


メニューバーのメニューの左寄せと右寄状態の取得と設定です.アプリケーションで制御している場合は,このサンプルの設定が反映されるとは限りません.


表1
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParamは第 3 引数

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMENUDROPALIGNMENT 取得
uiParam は 0
pvParam は BOOL 型変数へのポインタ
右寄せの場合は 0 以外の値,左寄せの場合は 0
SPI_SETMENUDROPALIGNMENT 設定
uiParam を 1 にすると右寄せ,0 にすると左寄せ
pvParam は nil


図1
起動すると現在の設定を表示
図2
左寄せ表示 (デフォルト)
  • マウス右ボタンをクリックした位置から右側に表示される
図3
右寄せ表示
  • マウス右ボタンをクリックした位置から左側に表示される

リスト1
メニューバーのメニューの右寄せ左寄せ
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Boolean;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  A : Integer;
begin
  SystemParametersInfo(SPI_GETMENUDROPALIGNMENT,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  SystemParametersInfo(SPI_SETMENUDROPALIGNMENT,
                       Ord(CheckBox1.Checked),
                       nil,
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  SystemParametersInfo(SPI_SETMENUDROPALIGNMENT,
                       Ord(OrignalValue),
                       nil,
                       SPIF_SENDCHANGE);
  FormCreate(nil);
  Screen.Cursor := crDefault;
end;

end.




02_メニューのフェードアニメーション


メニューのフェードアニメーションの有効性の取得と設定のサンプルです.
フェードアニメーションが無効の時,メューはスライドアニメーション形式で表示されます.有効とするには SET_MENUANIMATION でメニューのアニメーション表示を有効にしておく必要があります.
これもアプリケーションで制御している場合があります.


表2
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第3引数

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMENUFADE 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効となっている場合は 1,無効の場合は 0
SPI_SETMENUFADE 設定
uiParam は 0
pvParam を 0 以外の値にすると有効,0 にすると無効


図4
起動すると現在の設定を表示

リスト2
メニューのフェードアニメーション
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    MasterFlag   : Boolean;
    OrignalValue : Boolean;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  //アニメーションの増田フラグの状態を取得
  SystemParametersInfo(SPI_GETMENUANIMATION, 
                       0,
                       @MasterFlag, 
                       0);
  CheckBox1.Checked := MasterFlag;

  //メニューのフェードアニメーションの設定状態を取得
  SystemParametersInfo(SPI_GETMENUFADE, 
                       0,
                       @OrignalValue, 
                       0);
  CheckBox2.Checked := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  NewMasterFlag : Integer;
  NewValue      : Integer;
begin
  Screen.Cursor := crHourGlass;

  //アニメーションのマスターフラグを設定
  NewMasterFlag := Ord(CheckBox1.Checked);
  SystemParametersInfo(SPI_SETMENUANIMATION, 
                       0,
                       Pointer(NewMasterFlag), 
                       SPIF_SENDCHANGE);

  //メニューのフェードアニメーションを設定
  NewValue := Ord(CheckBox2.Checked);
  SystemParametersInfo(SPI_SETMENUFADE, 
                       0,
                       Pointer(NewValue), 
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  V : Integer;
begin
  Screen.Cursor := crHourGlass;

  //アニメーションのマスターフラグを元に戻す
  V := Ord(MasterFlag);
  SystemParametersInfo(SPI_SETMENUANIMATION, 
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

  //メニューのフェードアニメーションの設定を元に戻す
  V := Ord(OrignalValue);
  SystemParametersInfo(SPI_SETMENUFADE, 
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

  FormCreate(nil);
  Screen.Cursor := crDefault;
end;

end.




03_サブメニュー ( ショートカットメニュー ) 表示までの時間


マウスカーソルをサブメニューの項目に合わせた後,ショートカット (サブメニュー) を表示するまでの時間の取得と設定のサンプルコードです.


表3
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMENUSHOWDELAY 取得
uiParam は 0
pvParam は DWORD 型変数へのポインタ
この変数に待ち時間がミリ秒単位の値で格納される
SPI_SETMENUSHOWDELAY 設定
uiParam に待ち時間ミリ秒を DWORD 値で指定
pvParam は nil


図5
起動すると現在の設定を表示

リスト3
サブメニューの表示までの時間
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  with SpinEdit1 do begin
    MaxValue := 2000;
    MinValue := 1;
  end;

  //現在の設定値読出し
  SystemParametersInfo(SPI_GETMENUSHOWDELAY,
                       0,
                       @OrignalValue,
                       0);

  SpinEdit1.Value := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  NewValue : Integer;
begin
  Screen.Cursor := crHourGlass;

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETMENUSHOWDELAY,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);
  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  SystemParametersInfo(SPI_SETMENUSHOWDELAY,
                       OrignalValue,
                       nil,
                       SPIF_SENDCHANGE);
  FormCreate(nil);

  Screen.Cursor := crDefault;
end;

end.