FrontPage  Index  Search  Changes  RSS  wikifarm  Login

MessageBox.rb

概要

windows専用ですが、Apolloには依存しない、メッセージボックスです。


実行見本:

require "Win32API/MessageBox"
ret = Win32API::MessageBox.ask("セーブしますか?","保存確認")
p ret #=> :yes, :no

で下のメッセージがでます。

戻り値は押したボタンに対応するシンボルが返ります。

1.jpg

コメントがありましたらどうぞ

  • 2009-05-02 (Sat) 21:56:14 jmedotwr : oiUvDYYBX
(comment plugin is disabled).

説明・使い方

3番目の引数にシンボルの配列を入れると、様々なタイプのメッセージボックスを出すことができます。


require "Win32API/MessageBox"

msg = <<MMMM
コンピュータのハードディスクを初期化します。
初期化するとすべてのデータが失われます。

本当に良いんですか?

尚、キャンセルはできません。
MMMM

ret = Win32API::MessageBox.ask(msg,"初期化確認",[:ok, :icon_warning])
p ret #=> :ok

2.jpg

第三引数に利用可能なシンボルは、デタラメなシンボルを入れて実行すると、次のようなエラーメッセージで、利用可能なシンボルの一覧を返しますので、参考にしてください。

undefined symbol ':xx' in [:abort_retry_ignore,
  :cancel_try_continue, :default_button_2,
  :default_button_3, :default_button_4, :help,
  :icon_information, :icon_question, :icon_stop,
  :icon_warning, :ok, :ok_cancel, :retry_cancel,
  :set_foreground, :set_topmost, :yes_no,
  :yes_no_cancel] (RuntimeError)

これらのうち、

  1. 次のものは、表示するボタンを指定します。
    1. :abort_retry_ignore,
    2. :cancel_try_continue,
    3. :ok,
    4. :ok_cancel,
    5. :retry_cancel,
    6. :yes_no,
    7. :yes_no_cancel
  2. 次のものは、どのボタンをデフォルトにするかを指定します。
    1. :default_button_2,
    2. :default_button_3,
    3. :default_button_4,
  3. ヘルプは使えないでしょう・・
    1. :help,
  4. 次のものはアイコンを指定します。
    1. :icon_information,
    2. :icon_question,
    3. :icon_stop,
    4. :icon_warning,
  5. 次のものは、他の窓に隠されないようにします。
    1. :set_foreground,
    2. :set_topmost,

内容については、WindowsのAPIの説明をご覧ください。( http://yokohama.cool.ne.jp/chokuto/urawaza/api/MessageBox.html の説明などはいかがか?)


つぎのようなメソッドが用意されていますが、デフォルトが異なるだけです。

  1. Win32API::MessageBox.say ・・ 「ok」ボタンのみ
  2. Win32API::MessageBox.ask ・・ 「はい」と「いいえ」
  3. Win32API::MessageBox.ask3 ・・ 「はい」「いいえ」「キャンセル」

Win32API::MessageBox.call も使えますが・・


ソース:

MessageBox.rb

require "Win32API"

# cf. →G:/apollo/tkUtils/win32/api/MessageBox.rb

class Win32API

  MessageBox = Win32API.new( 'user32' , 'MessageBox' , %w(N P P N) , "N" )

  ##	http://yokohama.cool.ne.jp/chokuto/urawaza/api/MessageBox.html
  ##	1 (IDOK)		[OK]
  ##	2 (IDCANCEL)	[キャンセル]
  ##	3 (IDABORT)		[中止]
  ##	4 (IDRETRY)		[再試行]
  ##	5 (IDIGNORE)	[無視]
  ##	6 (IDYES)		[はい]
  ##	7 (IDNO)		[いいえ]
  ##	10 (IDTRYAGAIN)	[もう一度]
  ##	11 (IDCONTINUE)	[継続]

  MessageBox_ReturnHash = {
      1=>:ok,
      2=>:cancel,
      3=>:abort,
      4=>:retry,
      5=>:ignore,
      6=>:yes,
      7=>:no,
      10=>:try_again,
      11=>:continue
    }

  ##	http://yokohama.cool.ne.jp/chokuto/urawaza/api/MessageBox.html
  ##	表示するボタンの種類を指定します。これには以下の値のいずれかを指定できます。
  ##	0x00000000 (MB_OK)					[OK]
  ##	0x00000001 (MB_OKCANCEL)			[OK][キャンセル]
  ##	0x00000002 (MB_ABORTRETRYIGNORE)	[中止][再試行][無視]
  ##	0x00000003 (MB_YESNOCANCEL)			[はい][いいえ][キャンセル]
  ##	0x00000004 (MB_YESNO)				[はい][いいえ]
  ##	0x00000005 (MB_RETRYCANCEL)			[再試行][キャンセル]
  ##	0x00000006 (MB_CANCELTRYCONTINUE)	Windows 2000/XP: [キャンセル][もう一度][継続]
  ##	0x00004000 (MB_HELP)				Windows 9x/NT4.0 以降: [ヘルプ]
  ##		このボタンまたは [F1] キーが押されると、オーナーウィンドウに WM_HELP メッセージが送られます。
  ##
  ##	さらにアイコンフラグとして以下の値のいずれかを組み合わせて指定することができます。
  ##	0x00000010 (MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND)	停止のアイコン
  ##	0x00000020 (MB_ICONQUESTION)							疑問符のアイコン
  ##	0x00000030 (MB_ICONEXCLAMATION, MB_ICONWARNING)			感嘆符のアイコン
  ##	0x00000040 (MB_ICONINFORMATION, MB_ICONASTERISK)		吹き出しに「i」のアイコン
  ##
  ##	デフォルトボタンを指定するのに、以下のいずれかの値を組み合わせることができます。
  ##	これらのいずれも指定しなかった場合には、最初のボタンがデフォルトになります。
  ##	0x00000000 (MB_DEFBUTTON1)		最初のボタンをデフォルトにする
  ##	0x00000100 (MB_DEFBUTTON2)		2番目のボタンをデフォルトにする
  ##	0x00000200 (MB_DEFBUTTON3)		3番目のボタンをデフォルトにする
  ##	0x00000300 (MB_DEFBUTTON4)		4番目のボタンをデフォルトにする
  ##
  ##	他にも以下の値を組み合わせることができます。
  ##	0x00010000 (MB_SETFOREGROUND)		フォアグラウンドにする
  ##	0x00040000 (MB_TOPMOST)				最前面ウィンドウ(他のウィンドウに隠れない)にする

  MessageBox_TypeHash = {
      0 => :ok,
      1 => :ok_cancel,
      2 => :abort_retry_ignore,   #=> :retry
      3 => :yes_no_cancel,
      4 => :yes_no,
      5 => :retry_cancel,         #=> :retry
      6 => :cancel_try_continue,  #=> :try_again
      0x4000 => :help,
      0x10   => :icon_stop,
      0x20   => :icon_question,
      0x30   => :icon_warning,
      0x40   => :icon_information,
      0x100  => :default_button_2,
      0x200  => :default_button_3,
      0x300  => :default_button_4,
      0x10000 => :set_foreground,
      0x40000 => :set_topmost,
    }
  MessageBox_TypeHash_Rev = MessageBox_TypeHash.invert

class << MessageBox
  def type_conv(type)
    case type
    when Symbol
      return(MessageBox_TypeHash_Rev[type] or
          raise "undefined symbol ':#{type}' in #{MessageBox_TypeHash_Rev.keys.sort_by{|s|s.to_s}.inspect}")
    when Array
      return type.inject(0){|ans,val| ans + type_conv(val)}
    else # Numeric
      return type
    end
  end
  def say( msg , caption='' , type=0 )  #   OK
    type = type_conv(type)
    MessageBox_ReturnHash[ret=call( 0, msg , caption , type )]||ret
  end
  def ask( msg , caption='' , type=4 )  # 6:はい、7:いいえ
    say( msg , caption , type )
  end
  def ask3( msg , caption='' , type=3 )  # 6:はい、7:いいえ キャンセル
    say( msg , caption , type )
  end
end

end

if __FILE__ == $0

# autoload sample
class Win32API
  autoload :MessageBox, "win32api/MessageBox"
end

msg =<<MMMM
this
is
very
very
long
lined
and
very  long long long long long long long long long long long long long long long long long long long long long
message
MMMM

p Win32API::MessageBox.ask(msg,"my caption",[:abort_retry_ignore,:icon_warning,:default_button_2,:set_topmost])

##  error massage sample.
## undefined symbol ':warning' in [:abort_retry_ignore, :cancel_try_continue, :default_button_2,
##  :default_button_3, :default_button_4, :help, :icon_information, :icon_question, :icon_stop,
##  :icon_warning, :ok, :ok_cancel, :retry_cancel, :set_foreground, :set_topmost, :yes_no,
##  :yes_no_cancel] (RuntimeError)

end

Last modified:2009/05/02 21:56:14
Keyword(s):
References: