|
|
2006/7/16(Sun) 16:08:23|NO.1367
何度もすいません。
メニューバーを、GRAYED(0x0001)やDISABLEにした時、
クリックができないようになりますが、
一応クリックはできるようで、一度クリックをすると、
スクリプトが停止してしまい困っています。
(ウィンドウ外をクリックした時と同じ様な動作)
完全に無効にする方法はどなたかご存じではないでしょうか?
お返事お待ちしております。よろしくお願いします。
(SetMenuでInVisibleにすると、変化が激しいので避けたいのですが)
|
|
2006/7/17(Mon) 02:08:29|NO.1370
完全に無効というかメニューループに制御をもっていかれなければ良いのでしょう?
質問の趣旨からみると副作用があるかもしれませんが。
(メニューが有効のときもメニュー選択中にスクリプトが停止しない)
HSP3付属のサンプルを改造。
#include "user32.as"
; メニューアイテムIDを定義
#enum global NULL=0 ; NULL
#enum CMD_OPEN ; [開く]アイテムのID
#enum CMD_SAVE ; [保存]アイテムのID
#enum CMD_QUIT ; [終了]アイテムのID
#enum CMD_MESS ; [表示]アイテムのID
; メッセージ割り込み
oncmd gosub *OnCommand, 0x0111
onexit gosub *OnExitMess
; ポップアップメニューの作成
; [ファイル]メニュー
CreatePopupMenu : hfilemenu=stat ; サブメニュー作成
AppendMenu hfilemenu, 0, CMD_OPEN, "開く(&O)" ; 開く
AppendMenu hfilemenu, 0, CMD_SAVE, "保存(&S)" ; 保存
AppendMenu hfilemenu, 0x800, NULL, "" ; セパレータ
AppendMenu hfilemenu, 0, CMD_QUIT, "終了(&Q)" ; 終了
; メニューバーの作成
CreateMenu : hmenu=stat ; メニュー作成
AppendMenu hmenu, 0x10, hfilemenu, "ファイル(&F)" ; ファイル
EnableMenuItem hmenu, 0, 0x401
dim mii, 7
GetMenuInfo hmenu, varptr(mii)
mii(0)=28, 0x10
mii(2)|=0x40000000; MNS_MODELESS
SetMenuInfo hmenu, varptr(mii)
SetMenu hwnd, hmenu ; メニュー割り当て
DrawMenuBar hwnd
repeat
wait 3
color 255, 255, 255 : boxf 0, 0, 639, 31
color 0, 0, 0 : pos 320,0 : mes cnt
loop
stop
; メッセージの処理
*OnCommand
switch (wparam & 0xFFFF)
case CMD_OPEN ; 開く
dialog "*", 16
if stat = 1 {
dialog refstr + "を開きました", 0, "テスト"
}
swbreak
case CMD_SAVE ; 保存
dialog "*", 17
if stat = 1 {
dialog refstr + "を保存しました", 0, "テスト"
}
swbreak
case CMD_QUIT ; 終了
; ( Send だと終了できないので注意 )
PostMessage hwnd, 0x0010, 0, 0
swbreak
case CMD_MESS ; 表示
dialog "メニュー作成のテストです", 0, "メッセージ表示"
swbreak
default
swbreak
swend
return
*OnExitMess
dialog "終了しますか?", 2, "確認"
if stat = 6 {
end
}
return

| |
|
2006/7/17(Mon) 13:31:53|NO.1374
どうもありがとうございます。
>制御をもっていかれなければ良いのでしょう?
はい!その通りです。
ポイントは、
dim mii, 7
GetMenuInfo hmenu, varptr(mii)
mii(0)=28, 0x10
mii(2)|=0x40000000; MNS_MODELESS
SetMenuInfo hmenu, varptr(mii)
ですよね?
これが何をやっているのか分かりませんが、
ちょくとさんのページにMenuInfoのことが詳しく載っていたので、
それを参考にしてみます。
いただいたスクリプトは、メニューに関係なく、ループしていました。
こんなの作ってみたいです。
どうもありがとうございました(^^)/
|
|
2006/7/17(Mon) 15:20:41|NO.1376
> ちょくとさんのページにMenuInfoのことが詳しく載っていたので、
MENUITEMINFO と MENUINFO は違いますよ。
|
|
2006/7/19(Wed) 14:49:27|NO.1428
あっ、はい。そうですね。ありがとうございます。
GetMenuInfoとSetMenuInfoを調べてみます。
よく分からなかったので、MSDNに行ってみましたが、
BOOL SetMenuInfo(
HMENU hmenu, // メニューのハンドル
LPCMENUINFO lpcmi // 1 つの MENUINFO 構造体へのポインタ
);
分からない・・・(><)
構造体についても分からないことだらけなので、調べてみます。
とにかく、制御をもっていかれないようにする・制御をもっていけるようにする、
の2つができないとメニューバーを付けれないので(^^;
|
|
2006/7/20(Thu) 03:02:00|NO.1442
前のスクリプトに少し間違い(今回の場合は問題にならなかったと思いますが)
があったので修正、と別方向でのアプローチ。
#include "user32.as"
; メニューアイテムIDを定義
#enum global NULL=0 ; NULL
#enum CMD_OPEN ; [開く]アイテムのID
#enum CMD_SAVE ; [保存]アイテムのID
#enum CMD_QUIT ; [終了]アイテムのID
#enum CMD_MESS ; [表示]アイテムのID
; メッセージ割り込み
oncmd gosub *OnCommand, 0x0111
onexit gosub *OnExitMess
; ポップアップメニューの作成
; [ファイル]メニュー
CreatePopupMenu : hfilemenu=stat ; サブメニュー作成
AppendMenu hfilemenu, 0, CMD_OPEN, "開く(&O)" ; 開く
AppendMenu hfilemenu, 0, CMD_SAVE, "保存(&S)" ; 保存
AppendMenu hfilemenu, 0x800, NULL, "" ; セパレータ
AppendMenu hfilemenu, 0, CMD_QUIT, "終了(&Q)" ; 終了
; メニューバーの作成
CreateMenu : hmenu=stat ; メニュー作成
AppendMenu hmenu, 0x10, hfilemenu, "ファイル(&F)" ; ファイル
;EnableMenuItem hmenu, 0, 0x401
//*/
oncmd gosub *on_wmsyscommand, 0x0112
f_enablemenu=1
objsize 128, 24
chkbox "メニュー有効", f_enablemenu
/*/
; 少し修正版
dim mi, 7; 変数名は mii でなく mi のほうが適切(実質どうでもよい)
mi(0)=28, 0x10; ← GetMenuInfo の前に設定しておく必要があった。
GetMenuInfo hmenu, varptr(mi)
mi(0)=28, 0x10; (← SetMenuInfo の前にも改めて設定しておく必要がある。)
mi(2)|=0x40000000; MNS_MODELESS
SetMenuInfo hmenu, varptr(mi)
//*/
SetMenu hwnd, hmenu ; メニュー割り当て
DrawMenuBar hwnd
repeat
wait 3
color 255, 255, 255 : boxf 0, 0, 639, 31
color 0, 0, 0 : pos 320,0 : mes cnt
loop
stop
; メッセージの処理
*OnCommand
switch (wparam & 0xFFFF)
case CMD_OPEN ; 開く
dialog "*", 16
if stat = 1 {
dialog refstr + "を開きました", 0, "テスト"
}
swbreak
case CMD_SAVE ; 保存
dialog "*", 17
if stat = 1 {
dialog refstr + "を保存しました", 0, "テスト"
}
swbreak
case CMD_QUIT ; 終了
; ( Send だと終了できないので注意 )
PostMessage hwnd, 0x0010, 0, 0
swbreak
case CMD_MESS ; 表示
dialog "メニュー作成のテストです", 0, "メッセージ表示"
swbreak
default
swbreak
swend
return
*OnExitMess
dialog "終了しますか?", 2, "確認"
if stat = 6 {
end
}
return
*On_wmsyscommand
wpsc=wparam & 0xFFF0
lpcp=lparam & 0xFFFF, (lparam>>16) & 0xFFFF
/*/
; 以下でごちゃごちゃやっているのはメニュー無効時でも
; ウィンドウメニュー(タイトルバー左端のアイコンをクリックか alt + space)は
; 生かそうとあがいた結果(不完全)
GetSystemMetrics 4 : cyca=stat
mref bmscr, 96+ginfo_intid
dim rect, 4
GetWindowRect bmscr(13), varptr(rect)
if ((wpsc=0xF090) & (rect(1)+cyca < lpcp(1))) | ((wpsc=0xF100) & (lpcp(0)!=' ')) {
/*/
if (wpsc=0xF090) | (wpsc=0xF100) {
//*/
if (f_enablemenu) : else : return 0
}
return

| |
|
2006/7/20(Thu) 11:11:00|NO.1443
色々考えて下さって、どうもありがとうございますっ(^^/
0x0112については、調べてみたものの良く理解できなかったです・・・。
ですが考えていただいたスクリプトで色々やってみたところ、
メニューをクリックした時に送られてくるメッセージのようですねっ(違うかも(^^;
しかもON/OFFまで考えていただいて・・・m<_ _>m嬉しいですっ。
一応、現在はループフラグを無理矢理つかって、問題を回避していました。
これなら簡単だし、毎回ON/OFFをせずに(
EnableMenuItem
GetMenuInfo
SetMenuInfo
を使わずに)できるので、短く済みそうです。
分からないのは、
wpsc=0xF090
の部分なんですが、この0xF090が何なのか・・・というより、
これはどこを調べれば分かるのでしょうか(??
いろいろ検索してみたんですが・・(><;
他にもメッセージがあると思うので、知っておきたいです。
よろしくお願いします。キーワードとかでもいいんです・・・。
#
メニューバーを付けてから、WinSEでは動作がとても遅くなりました。
これはuser32.dll のせいでしょうか?
(ステータスバーも付けたので、comctl32,shell32かも)
あたしのパソコンはWinMEですが、全然問題なく動きます(^^
WinXPでも問題ないようです。
分かる範囲で結構ですので、時間ありましたら是非教えて下さいっ!
|
|
2006/7/21(Fri) 03:11:07|NO.1457
> 0x0112については、調べてみたものの良く理解できなかったです・・・。
> ですが考えていただいたスクリプトで色々やってみたところ、
> メニューをクリックした時に送られてくるメッセージのようですねっ(違うかも(^^;
0x0112 は WM_SYSCOMMAND メッセージを意味しています。
多くの場合このメッセージはウィンドウ自体に関する操作
(閉じる、最大化、最小化、移動、サイズ変更、メニューを開くなど)が
行われようとする直前にウィンドウに送られてきます。
このメッセージを oncmd gosub で捕らえて状況に応じて return 0 (戻り値 0)で
戻ることにより操作を無効化することができます。
(場合によっては危険です。例えば『閉じる』の操作を無効化するとタイトルバーの
閉じるボタンを押してもウィンドウが閉じずプログラムを終了できなくなります。
CTRL+ALT+DEL に頼ることになるでしょう・・・)
> wpsc=0xF090
> の部分なんですが、この0xF090が何なのか・・・というより、
> これはどこを調べれば分かるのでしょうか(??
答える前にそれ関係でさらに修正。*On_wmsyscommand 内の if を以下のように。
if (wpsc=0xF090) | (wpsc=0xF100) | (wpsc=0xF160) {
WM_SYSCOMMAND メッセージでは wparam に操作の種類を示す値が代入されます。
0xF090 は SC_MOUSEMENU 、マウス操作によってメニューが開かれようとしている、
0xF100 は SC_KEYMENU 、キーボード操作によってメニューが開かれようとしている、
0xF160 は SC_DEFAULT 、メニューのデフォルトアイテムが開かれようとしている
(メニューの上でダブルクリックした場合)、です。
ただし WM_SYSCOMMAND では wparam の最下位4ビットはシステムが使用して
不定なので事前に & 0xFFF0 で除去しています。
(さらに詳細な情報は MSDN で調べてください。)
> EnableMenuItem
> を使わずに)できるので、短く済みそうです。
EnableMenuItem は使っておいたほうが良いです。
サンプルプログラムで Enable... を使っていない状態でメニューを無効化して
ALT + F を押してみてください。
> メニューバーを付けてから、WinSEでは動作がとても遅くなりました。
> これはuser32.dll のせいでしょうか?
これは私には良くわからないです。メニューにそこまで極端な OS 依存の問題が
あるとは思えませんのでほかが原因ではないでしょうか?

| |
|
2006/7/21(Fri) 04:07:53|NO.1458
早いお返事ありがとうございます(^^
>oncmd gosub で捕らえて状況に応じて return 0 (戻り値 0)で
>戻ることにより操作を無効化することができます。
これは理解できましたっ。有効・無効の判定が唯一ここだけだったので。
>例えば『閉じる』の操作を無効化するとタイトルバーの
>閉じるボタンを押してもウィンドウが閉じずプログラムを終了できなくなります。
はい・・(涙)何回か試してみて、現在でもそうなってます(><;
>0xF090 は SC_MOUSEMENU 、マウス操作によってメニューが開かれようとしている、
>0xF100 は SC_KEYMENU 、キーボード操作によってメニューが開かれようとしている、
>0xF160 は SC_DEFAULT 、メニューのデフォルトアイテムが開かれようとしている
どうもありがとうございますっ!
>(さらに詳細な情報は MSDN で調べてください。)
調べてみました。情報が溢れていますねここは。
ちょっと前まではさっぱり分からなかったですけど、今ならなんとなく・・です(^^¥
PostMessage hwnd, 0x0010, 0, 0
とかの副産物もありましたし。
>EnableMenuItem は使っておいたほうが良いです。
ほんとですね∑( ̄▽ ̄)。気づきもしませんでしたぁ。
こんな穴があったなんて・・。さっそく直してみます。
>> これはuser32.dll のせいでしょうか?
>極端な OS 依存の問題があるとは思えません
そうなんですかぁ・・。これからも色々実験して何が原因かを調べたいと思います。
お忙しい中、スクリプトを含めた様々な情報をありがとうございます。
(いつも夜中の3時前後に返信してもらってますよね☆)
これだけの情報があれば、試行錯誤してなんとかやっていけそうですっ(嬉
#メニューバーだけでも難しいもんですね♪
|
|