Activity.onPrepareDialog

Activity.onCreateDialogはダイアログ生成時に呼ばれるが、Activity.onPrepareDialogはダイアログを表示する前の準備段階で呼ばれる。

Activity  |  Android Developers

onCreateDialogは生成時の1回だけだが、onPrepareDialogは何度も表示する度にその前の呼ばれる。

今回はIDだけにする。

onCreateDialogで、onCreateDialogが呼ばれたことをToastで表示。

onPrepareDialogでも、onPrepareDialogが呼ばれたことをToastで表示。
idの値も一緒に。

button1を押すと、

onCreateDialog
onCreateDialog

onCreateDialogの後に、

onPrepareDialog
onPrepareDialog

onPrepareDialogが来る。

button2でも、

messageが2
messageが2

messageが2用のonCreateDialogの後に、

messageが2のonPrepareDialog
messageが2のonPrepareDialog

messageが2のonPrepareDialogが来る。

もう1回、button1を押すと、

今度はonPrepareDialogだけ
今度はonPrepareDialogだけ

今度はonPrepareDialogだけ。

button2も、

2のonPrepareDialogだけ
2のonPrepareDialogだけ

2のonPrepareDialogだけ。

Sample/android/Activity/onPrepareDialog/src/Activity at master · bg1bgst333/Sample · GitHub

AlertDialog.Builder.setMessage

AlertDialog.Builder.setMessageでダイアログの本文をセットする。

AlertDialog.Builder  |  Android Developers

キー"message"の値もダイアログの本文としてセットする。

messageをセットするようにすると、

button1 clicked!
button1 clicked!

"button1 clicked!"となったり、

button2 clicked!
button2 clicked!

"button2 clicked!"となったりする。

Sample/android/AlertDialog.Builder/setMessage/src/AlertDialog.Builder at master · bg1bgst333/Sample · GitHub

AlertDialog.Builder.setTitle

AlertDialog.Builder.setTitleでダイアログのタイトルをセットできる。

AlertDialog.Builder  |  Android Developers

キー"title"の値をダイアログのタイトルとしてセットする。

どちらのダイアログもtitleをセットするようにしている。
button1だと、

dialog1
dialog1

となるし、
button2だと、

dialog2
dialog2

となる。

Sample/android/AlertDialog.Builder/setTitle at master · bg1bgst333/Sample · GitHub

Activity.onCreateDialog(id, args)

Activity.showDialogで渡されたID(id)とBundle(args)はActivity.onCreateDialogに渡される。

Activity  |  Android Developers

Bundleで渡す引数を増やしてみる。

"title"に加えて、"message"も渡す。

キー"message"の値もトーストで表示。
button1を押すと、

title
title

titleの後に、

message
message

messageも表示される。
button2だと、

title
title

このあとに、

message
message

こうなる。

Sample/android/Activity/onCreateDialog_id_args/src/Activity at master · bg1bgst333/Sample · GitHub

Activity.showDialog(id, args)

Activity.showDialogは引数としてID以外に、Bundleを渡すことで追加の引数を渡すことができる。

Activity  |  Android Developers

IDとBundleは、onCreateDialogに渡され、そこで処理することで振る舞いを切り替えることができる。

activity_main.xmlで、

Buttonを2つ用意しておく。

MainActivity.javaは、

押すButtonごとに渡すIDや、Bundleのキー"title"に対応する値が"dialog1", "dialog2"だったりする。

onCreateDialogに渡され、振る舞いも変わってくる。

最初buttonが2つ。
最初buttonが2つ。

最初buttonが2つ。
button1を押すと、

dialog1のほうになる。
dialog1のほうになる。

dialog1のほうになる。
button2を押すと、

dialog2のほうになる。
dialog2のほうになる。

dialog2のほうになる。

Sample/android/Activity/showDialog_id_args/src/Activity at master · bg1bgst333/Sample · GitHub

SetWindowRgn

SetWindowRgnを使うとウィンドウの指定のリージョンの部分のみ表示するようになる。
つまりウィンドウを非矩形なリージョンの形にできるということ。

SetWindowRgn function (winuser.h) - Win32 apps | Microsoft Docs

SetWindowRgnに指定したリージョンはシステム管理となるため、解放してはいけない。
とはいえ個別のリージョンは解放したいので、空のリージョンを作ってそれに結合リージョンをコピーし、それをウィンドウにセットという形にする。

WM_CREATEで、

hRgn1とNULLを指定して、RGN_COPYでCombineRgnすると、hRgn3にリージョンがコピーされる。
hRgn1とhRgn2は解放可能だが、hRgn3は解放してはいけない。
この状態でhRgn3でSetWindowRgn。

WM_PAINTで、

ウィンドウに画像を描画すると、

非矩形ウィンドウが宙に浮いている
非矩形ウィンドウが宙に浮いている

非矩形ウィンドウが宙に浮いている。

Sample/winapi/SetWindowRgn/SetWindowRgn/src/SetWindowRgn at master · bg1bgst333/Sample · GitHub

Aoi32(0, 0, 6, 6/Osaki #65) -入力内容が変更されている状態でメニューアイテムの"開く"を選択された時の挙動.

変更状態で"開く"を押すと、結構ややこしいことになるので、その部分の処理を書いた。

変更されている場合は、保存するかどうかダイアログを表示し、"はい"なら保存、"いいえ"なら保存しない、"キャンセル"ならその先の処理をしない、という分岐をする必要がある。
そして、その後、ファイルを開く処理をしないといけない。

アプリを起動
アプリを起動

アプリを起動。

新規に入力
新規に入力

新規に入力。

開く
開く

開く。

変更状態だとダイアログ表示
変更状態だとダイアログ表示

変更状態だとダイアログ表示。

"はい"でtest1.txtで保存
"はい"でtest1.txtで保存

"はい"でtest1.txtで保存。

そのあとすかさず開くダイアログなのでtest1.txtを開く
そのあとすかさず開くダイアログなのでtest1.txtを開く

そのあとすかさず開くダイアログなのでtest1.txtを開く。

newtest1.txtが表示
newtest1.txtが表示

newtest1.txtが表示。

今度は新規ではなくnewtest1.txtをこのまま編集
今度は新規ではなくnewtest1.txtをこのまま編集

今度は新規ではなくnewtest1.txtをこのまま編集。

開く
開く

開く。

"はい"でnewtest1.txtを保存
"はい"でnewtest1.txtを保存

"はい"でnewtest1.txtを保存。

"開く"ではtest2.txt
"開く"ではtest2.txt

"開く"ではtest2.txt。

test2.txtが開かれる
test2.txtが開かれる

test2.txtが開かれる。

test2.txtを編集
test2.txtを編集

test2.txtを編集。

"いいえ"の場合
"いいえ"の場合

"いいえ"の場合。

未保存状態で"開く"が出てnewtest1.txtを選択
未保存状態で"開く"が出てnewtest1.txtを選択

未保存状態で"開く"が出てnewtest1.txtを選択。

newtest1.txtになる
newtest1.txtになる

newtest1.txtになる。
ちなみにtest2.txtを開いたら、

元に戻ってる
元に戻ってる

元に戻ってる。
保存してないので。

また新規の編集
また新規の編集

また新規の編集。

今度は"キャンセル"の場合
今度は"キャンセル"の場合

今度は"キャンセル"の場合。

未保存状態でここに戻る
未保存状態でここに戻る

未保存状態でここに戻る。

今度は"はい"を選択
今度は"はい"を選択

今度は"はい"を選択。

"名前を付けて保存"ダイアログでキャンセルの場合
"名前を付けて保存"ダイアログでキャンセルの場合

"名前を付けて保存"ダイアログでキャンセルの場合。

これもさっきのところに戻る
これもさっきのところに戻る

これもさっきのところに戻る。

"いいえ"の場合は
"いいえ"の場合は

"いいえ"の場合は。

"名前を付けて保存"は出ないが"開く"は出る。
"名前を付けて保存"は出ないが"開く"は出る。

"名前を付けて保存"は出ないが"開く"は出る。
ここでキャンセルを押すと、

やはりここに戻ってくる
やはりここに戻ってくる

やはりここに戻ってくる。
これで"開く"と"名前を付けて保存"の基本的な動作はいったん完了かな。

-入力内容が変更されている状態でメニューアイテムの"開く"を選択された時の挙動. · bg1bgst333/Aoi32@82d6109 · GitHub