hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
小ワザ/モーダルダイアログ - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

モーダルダイアログ

モーダルダイアログとはダイアログボックスのひとつでダイアログボックスを閉じるまでは他のウィンドウに 制御を移さないものをさす。
またOS自体に処理を移さないものを特に「システムモーダルダイアログ」と呼ぶ。

ダイアログの情報はダイアログリソースとして実行ファイルに組み込まれ、アプリケーションがダイアログを呼び出すときはこのリソースを元にダイアログを作成します。
なのでHSPでは外部DLLなどを利用しないと本当のダイアログボックスは無理っぽい?
そこでウィンドウ制御のみで実現する擬似モーダルダイアログのサンプル。背景を塗りつぶせばそれなりに見えるはずです。

標準的なモーダルダイアログボックスの特徴をリストアップ。

  • サイズが固定
  • 最大化、最小化ボタンがない
  • 自身を含むアプリケーションの他のウィンドウにフォーカスを当てられない
  • 別のアプリケーションにはフォーカスを当てられる
  • モーダルダイアログが開いているときに、別アプリの窓にいったんフォーカスを当てた後、自身のアプリをアクティブにするとモーダルダイアログにフォーカスが当たっている
  • タスクバーにアイコンが表示されない

サンプル

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    ;
    ; 擬似モーダルダイアログボックス for HSP 3.0a
    ;                              written by kz3
    ;                           advised by はぁ?
 
    #uselib "user32.dll"
    #func   EnableWindow    "EnableWindow"      int,int
    #cfunc  GetWindowLong   "GetWindowLongA"    int,int
    #func   SetWindowLong   "SetWindowLongA"    int,int,int
    #func   SetWindowPos    "SetWindowPos"      int,int,int,int,int,int,int
 
    ; Window Style
    #define WS_MINIMIZEBOX      $00020000
    #define WS_MAXIMIZEBOX      $00010000
    #define WS_THICKFRAME       $00040000
 
    ; GetWindowLong()
    #define GWL_STYLE           (-16)
    #define GWL_HWNDPARENT      (-8)
 
    ; SetWindowPos()
    #define SWP_NOSIZE          $0001
    #define SWP_NOMOVE          $0002
    #define SWP_NOZORDER        $0004
    #define SWP_FRAMECHANGED    $0020
 
    onexit goto *destroy
 
    screen 0, 640, 480
    title strf("メインウィンドウ(ID%d)",ginfo(3))
    button goto "OPTION", *OpenModalDlg
    hwnd_main = hwnd
 
    screen 2, 300, 300,4+2
    title strf("擬似モーダルダイアログ(ID%d)",ginfo(3))
    button goto "OK", *ok
    hwnd_dlg = hwnd
 
    style = GetWindowLong(hwnd_dlg, GWL_STYLE)
    style = style & (WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_THICKFRAME) ^ style
    SetWindowLong hwnd_dlg, GWL_STYLE, style
    SetWindowLong hwnd_dlg, GWL_HWNDPARENT, hwnd_main
    SetWindowPos hwnd_dlg, 0, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED
 
    stop
 
 *OpenModalDlg
    gsel 0
    mainx = ginfo.4: mainy = ginfo.5
    mainw = ginfo.10: mainh = ginfo.11
    EnableWindow hwnd_main, 0
 
    gsel 2
    width ,, mainx+(mainw-ginfo.10)/2, mainy+(mainh-ginfo.11)/2
    gsel 2,1
 
    stop
 
 *ok
    gsel 2,-1
    EnableWindow hwnd_main, 1
    gsel 0,1
    stop
 
 *destroy
    if (iparam = 0) & (wparam = 2) : goto *ok
    end

ウィンドウハンドルはシステム変数hwndで参照できるがこれは現在の描画先ウィンドウのハンドルなので、ダイアログを作成したあと閉じる際に元のウィンドウを有効にするために元のウィンドウのハンドルが必要なので、ダイアログを表示する前にhwnd_mainのように保存しておかなければならない。

いや保存しなくてもgselで任意のウィンドウのハンドルを使用できます。でも保存しておいたほうが分かりやすいです。

コメント

  • こんなの作り方知らなかった。 いつも変数に1をたてて、ifで親に戻らないようにしてた。 -- hiroki? 2005-10-14 08:11:52 (金)
  • まぁ本家BBSからネタをパクったんですけどね^^;一応「サンプル」として! -- kz3 2005-10-14 08:13:21 (金)
  • あんまりリソースに詳しくないので間違っていたら指摘お願いします。 -- kz3 2005-10-14 09:59:33 (金)
  • こんなのモーダルとは言わない。ID0とID2間に他のウインドウが入ってしまう。知ったかもほどほどにwww -- はぁ?? 2005-11-01 23:46:35 (火)
  • 他のウィンドウとはHSP以外のウィンドウですか?それはシステムモーダルではないから割り込んでしまうのでは・・・。HSPの他のウィンドウIDが割り込んでしまうというのならばそれは増えたIDの制御をしていないからでわ・・・。まぁ擬似ですよ擬似^^; -- kz3 2005-11-02 00:01:57 (水)
  • あ、タスクアイコンからだと操作できてしまう・・・ -- kz3 2005-11-02 00:06:14 (水)
  • 今、HSPで確認できないから分からない。 とほほほほほ -- hiroki? 2005-11-02 07:31:10 (水)
  • あっ書き込むところ間違えた。 -- hiroki? 2005-11-02 07:32:27 (水)
  • 確かにこれはモーダルじゃないな^^;親子関係がなってない・・・知ったかというか早まったねorzよし、書き直そう^^ -- kz3 2005-11-02 08:41:53 (水)
  • どうだ、はぁ?さん^^;ウィンドウの概観以外はこれでなんとかモーダルと呼べるようになったかと・・・。タスクバーにもアイコン出ません^^ -- kz3 2005-11-02 12:35:20 (水)
  • タイトルバーにアイコンが出ているのが気になりますが。。。 -- kz3 2005-11-02 12:49:03 (水)
  • 今、アイコンも消すようにしています。 -- kz3 2005-11-02 13:15:10 (水)
  • システムメニューのでるアイコンの正式名称は「コントロールメニューボックス」というそうです。 -- kz3 2005-11-02 13:15:15 (水)
  • ダイアログっぽくメインウィンドウの中央表示を入れてみる。まだコントロールメニューボックスが消せません;; -- kz3 2005-11-02 22:26:18 (水)
  • あれ・・・はぁ?さんからのコメント期待してたのに・・・。 -- kz3 2005-11-03 08:39:49 (木)
  • 通りすがりの者じゃないの -- hiroki? 2005-11-03 11:49:56 (木)
  • でもはぁ?さんのおかげでまとめることができた^^ -- kz3 2005-11-03 12:13:46 (木)
  • でも大抵のソフトではタイトルバーにアイコンがついていないのもあるし…。 [a2] -- GOMEKIT? 2013-09-15 (日) 20:04:14

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2013-09-15 (日) 20:04:14 (83d)