Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年07月07日] [更新 2013年11月11日] Delphi サンプルプログラム集
   
SystemParametersInfo 関数サンプル
S08_UI 効果関係
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
[04] Windows XP(SP2) + Delphi 6 Pro (EXEWindows 2000 以前で有効)
S08_SystemParametersInfo_UIEffect.zip [5,234 KB] 2013年11月11日版(EXE同梱)







UI 効果関係 概要


UI 効果関係のフラグ,設定と取得のサンプルです.
MSDN オンラインの記事では メニューのアニメーション (マスタフラグ) を有効しないとアニメーション関係は機能しないとありますが,筆者が確認したところでは,このフラグの設定に関係なく機能しているようです.ただし 全ての UI 効果の設定 のフラグが有効になっていないと機能しないようです.
テストの際にマスタフラグの設定も同時にするようにしました.以下のサンプルコードはそのままの状態になっています.




01_メニューのアニメーション ( マスタフラグ )


実際にはこのフラグの値とは関係なしに,以下のアニメーション効果の設定は有効になるようです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMENUANIMATION 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETMENUANIMATION 設定
uiParam は 0
pvParam を 0 以外の値にすると有効.0 の時は無効


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

リスト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);
begin
  SystemParametersInfo(SPI_GETMENUANIMATION,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

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

  SystemParametersInfo(SPI_SETMENUANIMATION,
                       0,
                       Pointer(Ord(CheckBox1.Checked)),
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

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

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

end.




02_コンボボックスのスライドオープン


コンボボックスのスライドオープンの設定と取得のサンプルです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETCOMBOBOXANIMATION 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効であれば 0 以外.無効の場合は 0
SPI_SETCOMBOBOXANIMATION 設定
uiParma は 0
pvParam を 0 以外の値にすると有効.0 にすると無効


図2
起動すると現在の設定を表示
  • コンボボックスはテスト用

リスト2
コンボボックスのスライドオープン
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: TCheckBox;
    ComboBox1: TComboBox;
    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
  with ComboBox1.Items do begin
    Add('東京都');
    Add('埼玉県');
    Add('千葉県');
    Add('栃木県');
    Add('神奈川県');
    Add('茨城県');
    Add('群馬県');
    Add('新潟県');
    Add('長野県');
    Add('山梨県');
    Add('新潟県');
  end;
  ComboBox1.ItemIndex := 0;

  //アニメーションのマスタフラグの状態を取得
  SystemParametersInfo(SPI_GETMENUANIMATION, 
                       0,
                       @MasterFlag,
                       0);
  CheckBox1.Checked := MasterFlag;

  //コンボボックスのスライドオープンの設定状態を取得
  SystemParametersInfo(SPI_GETCOMBOBOXANIMATION,
                       0,
                       @OrignalValue, 
                       0);
  CheckBox2.Checked := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//  SPI_SETMENUANIMATIONの値に関係なく動作するようである
//=============================================================================
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_SETCOMBOBOXANIMATION,
                       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_SETCOMBOBOXANIMATION,
                       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_GETCURSORSHADOW 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETCURSORSHADOW 設定
uiParma は 0
pvParam を 0 以外の値にすると有効.0 にすると無効


図3
起動すると現在の設定を表示
図4
左が影あり.右が影なし

リスト3
カーソルの影効果
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);
begin
  SystemParametersInfo(SPI_GETCURSORSHADOW,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

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

  SystemParametersInfo(SPI_SETCURSORSHADOW,
                       0,
                       Pointer(Ord(CheckBox1.Checked)),
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

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

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

end.




04_ウィンドウのタイトルバーのグラデーション効果


この設定が有効なのは Windows 95, 98, 2000 です.折角コードを作成したので掲載します.
Windows 7 + Delphi 2010 で作成した EXE ファイルは,Windows 2000 では正常動作しません.
Windows XP(SP3) の Delphi 6 でコンパイルして実行しました.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETGRADIENTCAPTIONS 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETGRADIENTCAPTIONS 設定
uiParam は 0
pvParam を 0 以外にすると有効.0 にすると無効


図5
起動すると現在の設定を表示
図6
グラデーションなしの場合

リスト4
ウィンドウのタイトルバーのグラデーション効果
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: 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_GETGRADIENTCAPTIONS,
                       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_SETGRADIENTCAPTIONS,
                       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_SETGRADIENTCAPTIONS,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.




05_ホットトラッキング効果


カーソルを特定の項目に重ねたときに,その項目が強調表示される機能の取得と設定のサンプルコードです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETHOTTRACKING 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETHOTTRACKING 設定
uiParam は 0
pvParamを 0 以外にすると有効.0 にすると無効


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

リスト5
ホットトラッキング効果
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: 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_GETHOTTRACKING,
                       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_SETHOTTRACKING,
                       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_SETHOTTRACKING,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.




06_リストボックスのスムーズスクロール


リストボックスのスムーススクロールの取得と設定のサンプルです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETLISTBOXSMOOTHSCROLLING 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETLISTBOXSMOOTHSCROLLING 設定
uiParamは 0
pvParamを 0 以外にすると有効.0 にすると無効


図8
起動すると現在の設定を表示
  • リストボックスはテスト用

リスト6
リストボックスのスムーズスクロール
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: TCheckBox;
    ListBox1: TListBox;
    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
  with ListBox1.Items do begin
    Add('東京都');
    Add('埼玉県');
    Add('千葉県');
    Add('栃木県');
    Add('神奈川県');
    Add('茨城県');
    Add('群馬県');
    Add('新潟県');
    Add('長野県');
    Add('山梨県');
    Add('新潟県');
  end;
  ListBox1.ItemIndex := 0;

  //アニメーションのマスタフラグの状態を取得
  SystemParametersInfo(SPI_GETMENUANIMATION, 
                       0,
                       @MasterFlag,
                       0);
  CheckBox1.Checked := MasterFlag;

  //リストボックスのスムーズスクロールの設定状態を取得
  SystemParametersInfo(SPI_GETLISTBOXSMOOTHSCROLLING,
                       0,
                       @OrignalValue, 
                       0);
  CheckBox2.Checked := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//  SPI_SETMENUANIMATIONの値に関係なく動作するようである
//=============================================================================
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_SETLISTBOXSMOOTHSCROLLING,
                       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_SETLISTBOXSMOOTHSCROLLING,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.




07_選択項目のフェード効果


この機能を有効にすると,メニュー項目を選択後,メニューが消えた後,ほんの短い間だけそのメニュー項目が画面に残り,フェードアウトしていくようになります.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETSELECTIONFADE 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETSELECTIONFADE 設定
uiParamは 0
pvParam を 0 以外にすると有効.0 の時は無効


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

リスト7
選択項目のフェード効果
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: 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_GETSELECTIONFADE,
                       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_SETSELECTIONFADE,
                       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_SETSELECTIONFADE,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.




08_ツールチップアニメーション効果


ツールチップのアニメーション効果の取得と設定のサンプルコードです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETTOOLTIPANIMATION 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETTOOLTIPANIMATION 設定
uiParamは 0
pvParam を 0 以外にすると有効.0 の時は無効


図10
起動すると現在の設定を表示
図11
ツールチップの例

リスト8
ツールチップアニメーション効果
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: 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_SETTOOLTIPANIMATION,
                       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_SETTOOLTIPANIMATION,
                       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_SETSELECTIONFADE,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.




09_ツールチップフェードアニメーション効果


ツールチップのフェードアニメーションの設定と取得のサンプルです.この機能を有効にするには,ツールチップのアニメーションを有効にしておく必要があります.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETTOOLTIPFADE 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETTOOLTIPFADE 設定
uiParam は 0
pvParam を 0 以外にすると有効.0 の時は無効


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

リスト9
ツールチップフェードアニメーション効果
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox2: TCheckBox;
    CheckBox1: 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_GETTOOLTIPFADE,
                       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_SETTOOLTIPFADE,
                       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_SETTOOLTIPFADE,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.




10_全ての UI 効果の設定


このフラグを使用すると,このページのアニメーション機能をまとめてオン・オフできますが,有効にできるのは各々の機能が有効に設定されているフラグだけです.また,このフラグが有効になっていないと他の各フラグは機能しません.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETUIEFFECTS 取得
uiParam は 0
pvParam は BOOL 型変数のポインタ
有効な場合は 0 以外の値が,無効の場合は 0
SPI_SETUIEFFECTS 設定
uiParam は 0
pvParam を 0 以外にすると有効.0 の時は無効


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

リスト10
全ての UI 効果の設定
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;
    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);
begin
  //全てのUI効果の設定状態を取得
  SystemParametersInfo(SPI_GETUIEFFECTS,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//  ここで設定しても各々のUI効果の既存値には変更ないようだ
//  ただしここでの設定は,実際の動作に反映される
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  NewValue : Integer;
begin
  Screen.Cursor := crHourGlass;

  //全てのUI効果の設定
  NewValue := Ord(CheckBox1.Checked);
  SystemParametersInfo(SPI_SETUIEFFECTS,
                       0,
                       Pointer(NewValue), 
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

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

  //全てのUI効果の設定を元に戻す
  V := Ord(OrignalValue);
  SystemParametersInfo(SPI_SETUIEFFECTS,
                       0,
                       Pointer(V), 
                       SPIF_SENDCHANGE);

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

end.