HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1121
ゆうやんウィンドウの中央にメッセージボックスを表示させたい5解決


ゆうやん

リンク

2020/11/21(Sat) 19:24:15|NO.91827

ディスプレイ画面中央ではなく、ウィンドウの中央にメッセージボックスを表示させたいのですが、HSPではできないのでしょうか?
dialog命令とWin32APIのMessageBox関数だとディスプレイ画面中央にメッセージボックスが表示されます。

一応、ネット調べましたが、HSPでウィンドウ中央にメッセージボックスを表示させる方法が全く見つからなかったので、わかる方がいたら教えてほしいです。
https://www.ipentec.com/document/csharp-show-message-box-in-center-of-owner-window

#include "user32.as" MessageBox hwnd,"","",64



この記事に返信する


とあるプログラマ

リンク

2020/11/21(Sat) 23:32:29|NO.91828

【前提条件】
コールバック関数を扱うので modclbk3.hsp が必要です。
もし無ければhsp36b6以降ならHSP標準に同梱されてるようなので、そこから引っこ抜いたりしてください。

https://www.onionsoft.net/wp/archives/2144


フックを使わないとできないようです。

詳しい解説等は以下のサイトに書かれているので、もし知りたければ読んでみてください。
https://www.ipentec.com/document/csharp-show-message-box-in-center-of-owner-window

以下のコードは上のサイトの内容をHSP用に移植してみたものです。

#include "user32.as" #include "kernel32.as" #define global NULL $00000000 #define global WH_CBT 5 #define global MB_ICONINFORMATION $00000040 #define global MB_OK $00000000 #define global HCBT_ACTIVATE $00000005 #define global SWP_NOSIZE $00000001 #define global SWP_NOZORDER $00000004 #define global SWP_NOACTIVATE $00000010 // ================================================================ // 流れとしては // // 1. ボタンを押す // 2. *ShowDialog へ飛ぶ // 3. フックが作成される // 4. MessageBox 関数が呼び出される // 5. MessageBox のダイアログがアクティブになる(表示される)直前に、フックに基づき *CBTProc が呼び出される // 6. *CBTProc で位置を調整する // 7. MessageBoxのダイアログがアクティブになる(表示される) // ================================================================ // modclbk3が必要です。 #include "modclbk3.hsp" // CBTProcコールバック関数作成 newclbk3 hCBTProc, 3, *CBTProc if (hCBTProc == NULL) : dialog "エラー1" : end // ボタン表示 objsize 140, 20 button gosub "ダイアログ表示", *ShowDialog stop *ShowDialog // スレッド識別子取得 threadId = GetCurrentThreadID() // フック作成 hHook = SetWindowsHookEx(WH_CBT, hCBTProc, hInstance, threadId) if (hHook == NULL) : dialog "エラー2" : return // 標準の MessageBox 関数でダイアログ表示 MessageBox hwnd, "Hot Soup Processor", "HSP", MB_ICONINFORMATION | MB_OK return *CBTProc // (ヘルプからコピペ) // lparam には引数の配列へのメモリアドレスが、 // wparam には配列の要素数が格納されているので // このようにして引数を受け取る dupptr msg, lparam, wparam * 4, 4 _nCode = msg.0 _wparam = msg.1 // HCBT_ACTIVATEの場合:対象となるウィンドウのハンドル _lparam = msg.2 // HCBT_ACTIVATEの場合:CBTACTIVATESTRUCT構造体へのハンドル (今回は使わない) if (msg == HCBT_ACTIVATE) { // ダイアログウィンドウの四隅の座標を取得 dim dlgRect, 4 GetWindowRect _wparam, varptr(dlgRect) // 表示するべき座標を算出 x = ginfo_wx1 + (ginfo_sizex - (dlgRect.2 - dlgRect.0)) / 2 y = ginfo_wy1 + (ginfo_sizey - (dlgRect.3 - dlgRect.1)) / 2 // 位置を設定する SetWindowPos _wparam, NULL, x, y, NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE // フックを解除する (絶対!!!) UnhookWindowsHookEx hHook } // 次のフックを呼ぶ (絶対!!!) return CallNextHookEx(hHook, _nCode, _wparam, _lparam)



とあるプログラマ

リンク

2020/11/21(Sat) 23:33:39|NO.91829

スレッド全然見てなくて同じURL貼ってしまいました… 申し訳ありません。



TOMATO

リンク

2020/11/22(Sun) 00:20:38|NO.91830

MessageBoxの高機能版であるTaskDialog系APIには
指定したウィンドウの中央に表示する機能があります。

以下のモジュールが必要です。
https://hsp.moe/#taskdialog


#include "modTaskDialog.as" // ウィンドウの中央に変更する _hwnd@mtd = hwnd dwFlags@mtd = TDF_POSITION_RELATIVE_TO_WINDOW // 選択肢はいくつでも増やせます。選択IDの初期値は 101 になっています。 // 必要ない項目は "" にすることで非表示になります。以下は フッターを非表示にしています。 DialogVistaEx "タイトル","メイン","説明を書く","","はい\nいいえ", 3, 4 // 選択肢判断 switch stat case 101 : mes "はいが選択されました" : swbreak case 102 : mes "いいえが選択されました" : swbreak case 2 : mes "×ボタンが押されました" : swbreak default : mes "想定外の選択" : swbreak swend stop



TOMATO

リンク

2020/11/22(Sun) 00:32:00|NO.91831

ちなみに、Windows 付属の ペイント、メモ帳、ワードパットなどは、
保存確認時のメッセージボックスに MessageBox ではなく TaskDialog を使っているようです。



ゆうやん

リンク

2020/11/29(Sun) 13:06:52|NO.91869

返信が遅くなってすいません。
両方ともうまくいきました。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.