|
|
2010/7/23(Fri) 19:44:42|NO.33864
HSP.3.21で、プラグインモジュールmod_menuの「メニュー」で、メニューを作成した後に
任意のメニュー項目の属性を変えるにはどうしたらいいんですか?
あと、addmenu命令の第4パラメータは全てで以下のしかないんですか?
(あるのだったら、それが載っているサイトなどを教えてくれると助かります。)
(↓組み合わせるのを除いて。)
0x0000:デフォルト表示
0x0003:灰色表示・選択不可
0x0008:アイテムにチェックマークを付ける
0x0010:ドロップダウンメニューまたはサブメニューを開くアイテムを追加
0x0800:セパレータ(区切り線)を表示
|
|
2010/7/23(Fri) 20:18:13|NO.33865
こんにちわ^^
作り直せばできますよ^^
#include "mod_menu.as"
#define CMD_A 1
#define CMD_B 2
#define CMD_D 3
#define CMD_QUIT 4
// メニューC直下のサブメニュー作成
newmenu hsubmenu2, 1
addmenu hsubmenu2, "メニューD(&D)", CMD_D
// サブメニュー作成
newmenu hsubmenu, 1
addmenu hsubmenu, "メニューA(&A)", CMD_A, 0x0003 // 灰色表示・選択不可
addmenu hsubmenu, "メニューB(&B)", CMD_B, 0x0008 // チェックマーク付き
addmenu hsubmenu, "メニューC(&C)", hsubmenu2, 0x0010 // サブメニューあり
addmenu hsubmenu, "", 0, 0x0800 // セパレータ
addmenu hsubmenu, "終了(&Q)", CMD_QUIT
// トップメニュー作成
newmenu hmenu, 0
addmenu hmenu, "メニュー(&M)", hsubmenu, 0x10
applymenu hmenu
wait 1000
// メニューC直下のサブメニュー作成
newmenu hsubmenu2, 1
addmenu hsubmenu2, "メニ8(&D)", CMD_D
// サブメニュー作成
newmenu hsubmenu, 1
addmenu hsubmenu, "メニュうー4(&A)", CMD_A, 0x0008 // 灰色表示・選択不可
addmenu hsubmenu, "メニ5ーんB(&B)", CMD_B, 0x0003 // チェックマーク付き
addmenu hsubmenu, "メ7ューCこ(&C)", hsubmenu2, 0x003 // サブメニューあり
addmenu hsubmenu, "", 0, 0x0800 // セパレータ
addmenu hsubmenu, "終u了(&Q)", CMD_QUIT
// トップメニュー作成
newmenu hmenu, 0
addmenu hmenu, "メニュー(&M)", hsubmenu, 0x10
applymenu hmenu
このスクリプトを参考にして作ったスクリプトを
「勝手に使わないで」などと書いて転載を禁止されるのはやめてくださいね^^
僕ちゃんはそういうのがだいっ嫌いです^^

| |
|
2010/7/23(Fri) 21:28:04|NO.33866
API の SetMenuItemInfo 命令と
MENUITEMINFO 構造体を使用すれば、メニューに関する色々な設定をすることが出来ますが
HSP からするのは少し面倒くさいです。
調べる気力がなければ、モジュールを使った方間違いなく早いです。
一応スクリプトの例を載せておきます。
NewMenu で作られた ハンドルは、CreateMenu CreatePopupMenu で作られたハンドルと同じものなので。
SetMenuItemInfo ほか さまざまなメニュー操作関数を使用することも出来ます、暇だったら調べてみたらいいと思います。
#include "user32.as"
// ウインドウメッセージ WM_COMMAND
#define WM_COMMAND $00000111
// MENUITEMINFO 構造体 の インデックスの定義。
#enum mii_cbSize = 0 // 構造体のサイズ
#enum mii_fMask // 取得または設定するメンバ
// fMaskの定数 の一部
#const MIIM_STRING $00000040 ; Windows 98/2000 以降: dwTypeData
#const MIIM_BITMAP $00000080 ; Windows 98/2000 以降: hbmpItem
#const MIIM_STATE $00000001 ; fState
#enum mii_fType // アイテムのタイプ
#enum mii_fState // アイテムの状態
// fState の定数の一部
#const MFS_CHECKED $00000008
#const MFS_DEFAULT $00001000
#enum mii_wID // アイテムID
#enum mii_hSubMenu // サブメニューのハンドル
#enum mii_hbmpChecked // チェック表示時のビットマップ
#enum mii_hbmpUnchecked // チェック非表示時のビットマップ
#enum mii_dwItemData // 任意の32ビット値
#enum mii_dwTypeData // アイテムの内容
#enum mii_cch // アイテムの文字列の長さ
#enum mii_hbmpItem // ビットマップハンドル
// hbmpItemの定数の一部
#const HBMMENU_POPUP_CLOSE $00000008 ; サブメニューの「閉じる」ボタン
#enum MENUITEMINFO_ELETOTAL ; total 12
// EnableMenuItemの定数
#define MF_BYCOMMAND $00000000
#define MF_GRAYED $00000001
// 作業用の構造体の定義
; 文字列を変更するための MENUITEMINFO 構造体
string = ""
dim mii_string , MENUITEMINFO_ELETOTAL
mii_string.mii_cbSize = MENUITEMINFO_ELETOTAL*4
mii_string.mii_fMask = MIIM_STRING
mii_string.mii_dwTypeData = varptr( string ) // メニューに表示する文字列
mii_string.mii_cch = strlen( string ) // 文字数
; ビットマップ を変更するための MENUITEMINFO 構造体
dim mii_bitmap , MENUITEMINFO_ELETOTAL
mii_bitmap.mii_cbSize = MENUITEMINFO_ELETOTAL*4
mii_bitmap.mii_fMask = MIIM_BITMAP
mii_bitmap.mii_hbmpItem = 0 // ビットマップのハンドル
; STATUS を変更するための MENUITEMINFO 構造体
dim mii_stat , MENUITEMINFO_ELETOTAL
mii_stat.mii_cbSize = MENUITEMINFO_ELETOTAL*4
mii_stat.mii_fMask = MIIM_STATE
mii_stat.mii_fState = 0 // STATUSのフラグ
;---------------------------------------
// メニューID
#enum MID_EXIT = 1
#enum MID_MODIFY
#enum MID_GAGAGA
#enum MID_AFTERGA
onexit *exit
oncmd gosub *msg_WM_COMMAND , WM_COMMAND
// メニューを作る
dim hMenu , 2
CreatePopUpMenu : hMenu(1) = stat
AppendMenu hMenu(1) , 0 , MID_GAGAGA , "GAGAGA(&G)"
AppendMenu hMenu(1) , 0 , MID_MODIFY , "色々変更(&M)"
AppendMenu hMenu(1) , 0x800 , 0,0
AppendMenu hMenu(1) , 0 , MID_EXIT , "終了する(&Q)"
CreateMenu : hMenu(0) = stat
AppendMenu hMenu , 0x10 , hMenu(1) , "メニュ(&M)"
SetMenu hwnd , hMenu
DrawMenuBar hwnd
mes "「 色々変更(&R) 」 のメニュー を選択してみて下さい"
stop
*msg_WM_COMMAND
wID = wParam & 0xFFFF ; loword
wNotifyCode = (wParam >> 16) & 0xFFFF ; hiword
hwndControl = lParam
switch wID
case MID_GAGAGA
dialog "が"
swbreak
case MID_EXIT
end
swbreak
case MID_MODIFY
// メニューGa の文字列を変更
string = "変更されました(&C)"
mii_string.mii_dwTypeData = varptr( string ) // メニューに表示する文字列
mii_string.mii_cch = strlen( string ) // 文字数
SetMenuItemInfo hMenu.1 , MID_GAGAGA , 0 , varptr( mii_string )
mii_stat.mii_fState = MFS_DEFAULT | MFS_CHECKED // STATUSのフラグ
SetMenuItemInfo hMenu.1 , MID_GAGAGA , 0 , varptr( mii_stat )
// 終了メニューの変更
string = "終了?(&Q)"
mii_string.mii_dwTypeData = varptr( string ) // メニューに表示する文字列
mii_string.mii_cch = strlen( string ) // 文字数
SetMenuItemInfo hMenu.1 , MID_EXIT , 0 , varptr( mii_string )
mii_bitmap.mii_hbmpItem = HBMMENU_POPUP_CLOSE
SetMenuItemInfo hMenu.1 , MID_EXIT , 0 , varptr( mii_bitmap )
string = "もう使えません(&Q)"
mii_string.mii_dwTypeData = varptr( string ) // メニューに表示する文字列
mii_string.mii_cch = strlen( string ) // 文字数
SetMenuItemInfo hMenu.1 , MID_MODIFY , 0 , varptr( mii_string )
DrawMenuBar hwnd
// 変更メニューを 無効化
EnableMenuItem hMenu.1 , MID_MODIFY , MF_BYCOMMAND | MF_GRAYED
swbreak
swend
return
*exit
DestroyMenu hMenu
end

| |
|
2010/7/24(Sat) 09:30:04|NO.33871
みなさん回答ありがとうございます。
>作り直せばできますよ^^
全ては書きかえられるのですね。
その点ではわかりました。ありがとうございます。
それでは、任意のだけを変えることはできないのでしょうか…?
>MENUITEMINFO 構造体を使用すれば、メニューに関する色々な設定をすることが出来ますが
>HSP からするのは少し面倒くさいです。
ソースを書いてくれてありがとうございます。
わざわざ書かせておいてこういうのも申し訳ないんですが、あらかじめ最初に
書いておけばよかったのですが、実は、チェックの入/切を変更したいんです。
あとからで申し訳ありません。
あなたのソースの
>mii_stat.mii_fState = MFS_DEFAULT | MFS_CHECKED // STATUSのフラグ
>SetMenuItemInfo hMenu.1 , MID_GAGAGA , 0 , varptr( mii_stat )
のところで変更しているんでしょうか?
これはソース上で定義されている定数ですよね?
ということは0にすれば普通の(デフォルト表示)になるんでしょうか?
|
|
2010/7/24(Sat) 15:12:02|NO.33873
はいそうです。
一応 MFS_UNCHECKED という定数が有りますが、それは 内部でゼロなので。
構造体の fStat のメンバの内容を [ 0x0 と 0x8 ] と切り替えて SetMenuItemInfo すれば、
チェック状態を切り替えることが出来ます。
一応 CheckMenuItem という関数もあります。
構造体をセットするのが面倒ならそれを使うという手もありますが、古い関数なので、
SetMenuItemInfo を使った方が良いみたいです。
#include "user32.as"
// ウインドウメッセージ WM_COMMAND
#define WM_COMMAND $00000111
// MENUITEMINFO 構造体 の インデックスの定義。
#enum mii_cbSize = 0 // 構造体のサイズ
#enum mii_fMask // 取得または設定するメンバ
// fMaskの定数 の一部
#const MIIM_STATE $00000001 ; fState
#enum mii_fType // アイテムのタイプ
#enum mii_fState // アイテムの状態
// fState の定数の一部
#const MFS_UNCHECKED $00000000
#const MFS_CHECKED $00000008
#enum mii_wID // アイテムID
#enum mii_hSubMenu // サブメニューのハンドル
#enum mii_hbmpChecked // チェック表示時のビットマップ
#enum mii_hbmpUnchecked // チェック非表示時のビットマップ
#enum mii_dwItemData // 任意の32ビット値
#enum mii_dwTypeData // アイテムの内容
#enum mii_cch // アイテムの文字列の長さ
#enum mii_hbmpItem // ビットマップハンドル
#enum MENUITEMINFO_ELETOTAL ; total 12
// CheckMenuItemの定数
#define MF_UNCHECKED $00000000
#define MF_CHECKED $00000008
#define MF_BYCOMMAND $00000000
// 作業用の構造体の定義
; STATUS を変更するための MENUITEMINFO 構造体
dim mii_stat , MENUITEMINFO_ELETOTAL
mii_stat.mii_cbSize = MENUITEMINFO_ELETOTAL*4
mii_stat.mii_fMask = MIIM_STATE
mii_stat.mii_fState = 0 // STATUSのフラグ
;---------------------------------------
// メニューID
#enum MID_EXIT = 1
#enum MID_MODIFY
#enum MID_GAGAGA
onexit *exit
oncmd gosub *msg_WM_COMMAND , WM_COMMAND
// メニューを作る
dim hMenu , 2
CreatePopUpMenu : hMenu(1) = stat
AppendMenu hMenu(1) , 0 , MID_GAGAGA , "check変更サンプル「SetMenuItemInfo使用」(&S)"
AppendMenu hMenu(1) , 0 , MID_MODIFY , "check変更サンプル「CheckMenuItem使用」(&C)"
AppendMenu hMenu(1) , 0x800 , 0,0
AppendMenu hMenu(1) , 0 , MID_EXIT , "終了する(&Q)"
CreateMenu : hMenu(0) = stat
AppendMenu hMenu , 0x10 , hMenu(1) , "メニュ(&M)"
SetMenu hwnd , hMenu
DrawMenuBar hwnd
mes "check変更には二つの方法が有ります。"
stop
*msg_WM_COMMAND
wID = wParam & 0xFFFF ; loword
wNotifyCode = (wParam >> 16) & 0xFFFF ; hiword
hwndControl = lParam
switch wID
case MID_GAGAGA
if mii_stat.mii_fState {
mii_stat.mii_fState = 0x0 // MFS_UNCHECKED
}else{
mii_stat.mii_fState = 0x8 // MFS_CHECKED
}
SetMenuItemInfo hMenu.1 , MID_GAGAGA , 0 , varptr( mii_stat )
DrawMenuBar hwnd
dialog "新しい方法です。新しく作るアプリケーションはこの方法を使って、ステータスを変えるべきです"
swbreak
case MID_MODIFY
if flg_CheckedMod {
flg_CheckedMod = 0x0 // MF_UNCHECKED
}else{
flg_CheckedMod = 0x8 // MF_CHECKED
}
CheckMenuItem hMenu.1 , MID_MODIFY , MF_BYCOMMAND | flg_CheckedMod
dialog "古い方法ですが、まだ使えるみたいです。"
swbreak
case MID_EXIT
end
swbreak
swend
return
*exit
DestroyMenu hMenu
end

| |
|
2010/7/24(Sat) 18:05:18|NO.33882
おおお!解決しました。ありがとうございます。
わざわざサンプルをまた書かせてしまってすいません。
この方法を私の作成しているソフトで使用したいのですが、どうしたらいいですか?
ReadMeとかに、「感謝:infoさん(HSP3掲示板にて)」とでも書いた方がいいでしょうか?
…
(もとの質問は解決しましたが、この質問をするので一応「未解決」にしておきます。
すいません。と、いうか、「解決」にすると、返信できなくなるんですか?この掲示板の
「使い方」を見てもわからなかったんですが…。)
|
|
2010/7/24(Sat) 21:34:13|NO.33901
そういうのが「恩着せがましい」っていうんだよ。
皆、ろくでもない実力で作った他人のソフトウェアに自分の名前を載せたくて教えてるわけじゃねぇんだよ。
礼を言う前にメニューAPIで他にどういったことが出来るのか調べて自分の「知識」にしろ。
|
|
2010/7/24(Sat) 21:54:28|NO.33904
>(もとの質問は解決しましたが、この質問をするので一応「未解決」にしておきます。
>すいません。と、いうか、「解決」にすると、返信できなくなるんですか?この掲示板の
>「使い方」を見てもわからなかったんですが…。)
他のスレを見てもらえるとわかるかもしれませんが、
「解決」にするのは、スレを立てた人で、
「解決」にしたあとでも、追記のレスを送信できますし、
またスレ主以外も、返信できます。
|
|
2010/7/25(Sun) 00:16:46|NO.33907
NO.33901が真理。
どや顔で、自分が作ったかのようにブログにのっけて
勝手に使わないで、とかやんなきゃいいの。常識的に相手の事を考えればトーゼン。
答えてくれた人は別に利益を求めてるわけじゃないの。
|
|
2010/7/25(Sun) 10:51:05|NO.33918
まさか感謝の意を表される事すら拒絶する人がいるとは思いませんでしたが
同じ事を言うにしてももう少し穏やかな言葉を選べないものでしょうか?
>掲示板は大勢の人が利用するものです。不快になるような発言や威圧的な態度は取らないでください。
>ReadMeとかに、「感謝:infoさん(HSP3掲示板にて)」とでも書いた方がいいでしょうか?
…
本人への確認もなく名前を載せるのは確かに問題もあると思うので
どうしても感謝の意を表したいのであれば
感謝:HSP3掲示板で助言して頂きました。
等や、多少堅苦しい表現にするなら
本ソフトの制作にあたってHSP3掲示板で御助言を頂きました方々の
ご厚意に感謝いたします。
というような記述で良いのではないかと思います。
|
|
2010/7/25(Sun) 19:31:26|NO.33940
他の方々の意見にも一理あると思いますが。
お礼の件は、全然大丈夫ですよ。
|
|
2010/7/25(Sun) 22:00:42|NO.33960
>No.33918
「ごめんなさい」とでも書いておきます。
「とでも」のニュアンスがよく分かる例文でした。
|
|
2010/7/26(Mon) 11:38:30|NO.33971
Re.NO.33901
別にどうしても感謝の気持ちを書きたいとかではなく(まあ、実際感謝してるんですが)、
著作権とかで問題が発生すると困るので書いてるんです。
実際に配布するときとかにはReadMeに、どこのホームページを参考にしたとか、だれに
アドバイスをもらったとか書いておかないと、他人が頑張ったのに自分で利益を独占してる
みたいでいやなんです。
Re.NO.33904
わかりました、
回答(? 返信?)ありがとうございました。
Re.NO.33907
>どや顔で、自分が作ったかのようにブログにのっけて
>勝手に使わないで、とかやんなきゃいいの。
?
ですから、他人から助言を受けたりしたのは書いてありますが…。
しかもそれは著作権の問題とかがからむと困るから書いているんです。
もし、「他人から助言を受けたりしたの」を書き忘れていたのがありましたらURLも報告し
て下さい。
Re.NO.33918
>本人への確認もなく名前を載せるのは確かに問題もあると思うので
NO.33882でinfoさんに聞きました。
↓で確認を得ました。
Re.NO.33940
わかりました。
Re.NO.33960
>「とでも」のニュアンス
引用を示す格助詞「と」+大まかな例示をする副助詞「でも」
|
|
2010/7/26(Mon) 12:04:05|NO.33972
>>本人への確認もなく名前を載せるのは確かに問題もあると思うので
>NO.33882でinfoさんに聞きました。
>↓で確認を得ました。
正しくは
『本人への確認(又は許可)が取れないままで名前を載せるのは』ですね
もしinfoさんが返答(許可)しなかった場合の対処法のつもりでした。
分かり難い文章でした、すみません。
ただ、NEW kerupaniさんはinfoさんだけに質問していたつもりだったのでしょうが
アンカーが無いと今回の様に全員に発言していると勘違いされてしまうので
そこは気をつけましょうね。
|
|
2010/7/26(Mon) 12:19:34|NO.33974
Re.NO.33972
>アンカーが無いと今回の様に全員に発言していると勘違いされてしまうので
NO.33882の質問のことですか。
すいません。
|
|