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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0217
begriffメニューバーのこと12解決


begriff

リンク

2008/2/17(Sun) 23:33:59|NO.13611

メニューバーを作るのを簡略化しようとしたのですが
結局変なものができました。
こういうのって実際使えるものですかね・使いたいものですか?
雑談ですが・・・

#module #uselib "user32.dll" #func global CreateMenu "CreateMenu" #func global CreatePopupMenu "CreatePopupMenu" #func global AppendMenu "AppendMenuA" int, int, int, str #func global SetMenu "SetMenu" int, int #func global DrawMenuBar "DrawMenuBar" int #func global PostMessage "PostMessageA" int, int, sptr, sptr #func global GetMenuItemRect "GetMenuItemRect" int, int, int, sptr #deffunc menubar str menu1 menu=menu1 b="" tag_(0)="" notesel menu sindo=1 CreateMenu id=stat hmenupar=id hmenu_(sindo)=id while(i<=notemax) noteget b,i koro=instr(b,0,":") if koro!-1{ kako=gen gen=0 tag="" if ":"=strmid(b,koro+1,1){ tag=strmid(b,koro+2,strlen(b)-koro-2) gosub *kai gen=1 }else:if ">"=strmid(b,koro+1,1){ gosub *kai gen=2 }else:if "<"=strmid(b,koro+1,1){ gosub *kai gen=3 }else:if "-"=strmid(b,koro+1,1){ gosub *kai gen=4 } if gen=1&&tugi=2{ tag_(sindo)=tag } if gen=1&&tugi!2{ l+ AppendMenu Hmenu_(sindo),0,l,tag } if gen=4&&tugi!2{ AppendMenu Hmenu_(sindo),$800,$0,"" } if gen=2&&kako=1{ sindo+ CreatePopupMenu id=stat hmenu_(sindo)=id } if gen=3{ sindo- if sindo<1:sindo=1:else{ AppendMenu Hmenu_(sindo),$10,hmenu_(sindo+1),tag_(sindo) } } } i+ wend SetMenu hwnd,hmenupar DrawMenuBar hwnd return *kai ii=i+1 tugi=0 while(ii<=notemax&&flag=0) noteget b,ii koro=instr(b,0,":") if koro!-1{ if ":"=strmid(b,koro+1,1){ flag=1 tugi=1 }else:if ">"=strmid(b,koro+1,1){ flag=1 tugi=2 }else:if "<"=strmid(b,koro+1,1){ flag=1 tugi=3 }else:if "-"=strmid(b,koro+1,1){ flag=1 tugi=4 } } ii+ wend flag=0 return #global #const global WM_COMMAND 0x0111 oncmd gosub *OnCommand, WM_COMMAND menu={" ::ファイル :> ::新規(&N)\t ::開く(&O)...\tCtrl+O ::上書き保存(&S)\tCtrl+S ::名前を付けて保存(&A)... :- ::ページ設定(&U)... ::印刷(P)...\tCtrl+P :- ::終了(&X)\tCtrl+Q :< ::編集 "} menubar menu stop *OnCommand l=wparam & 0xFFFF ;dialog ""+l return



この記事に返信する


begriff

リンク

2008/2/17(Sun) 23:45:05|NO.13612

使いたかったらご自由に使ってください

:: ・・・項目作ります
:> ・・・サブに行きます
:< ・・・サブから戻ります
:- ・・・横の棒

なんかインデントしてもしなくてもokぽいです
むちゃくちゃ書いてもある程度まで許容するっぽいです
(↑そういうふうに作ったから)



hirosenzm

リンク

2008/2/18(Mon) 20:05:07|NO.13618

メニューバーってウィンドウの上の[ファイル]とか[編集]とかいうやつですよね?
mod_menu.as使えばわかると思います。
サンプルにありますよ。



f

リンク

2008/2/18(Mon) 20:30:05|NO.13623

どう突っ込んだものやら(笑



begriff

リンク

2008/2/18(Mon) 21:45:15|NO.13627

作った本人としては ネタとして最高に面白いと思ったのですが^^
最初実用的なものを作ろうとしてたのですが・・・ 実用的ですよね・・・?
まぁ、なんか面白かったので上げてみました。



eller

リンク

2008/2/18(Mon) 22:50:50|NO.13629

これは面白いですね!
ジャンプする処理を自前で書く必要があるのが残念ではありますが、メニューバー作成の敷居をぐっと下げてくれる点や命令ひとつでガーッと作ってくれる点が嬉しいです。

> こういうのって実際使えるものですかね・使いたいものですか?
きっと自己流の改造をする(strmidを減らすとかwhileをrepeatにするとか)と思いますが、使ってみたいです。



begriff

リンク

2008/2/18(Mon) 22:56:33|NO.13631

まぁ非効率なところがチラホラと^^ 見え隠れしてますね



f

リンク

2008/2/18(Mon) 23:00:37|NO.13632

*無粋な一行削除(笑
モジュールの件を言うなら、これはイイんでね。便利良さそうに思われ。



begriff

リンク

2008/2/18(Mon) 23:03:18|NO.13633

類似品ですが、こんなのも (これは実用価値小

#module #deffunc tree str tv1,int sw_1,int sw_2 sw1=limit(sw_1,0,1)not(1) sw2=limit(sw_2,0,1)not(1) tv=tv1 b="" tag_(0)="" notesel tv winobj "SysTreeView32" ,"",0,0x50000000|$4|$2*sw1|$1*sw2 sindo=1 hid=objinfo(stat,2) htree_(sindo)=0 while(i<=notemax) noteget b,i koro=instr(b,0,":") if koro!-1{ kako=gen gen=0 tag="" if ":"=strmid(b,koro+1,1){ tag=strmid(b,koro+2,strlen(b)-koro-2) gen=1 }else:if ">"=strmid(b,koro+1,1){ gen=2 }else:if "<"=strmid(b,koro+1,1){ gen=3 } if gen=1{ tvins(0)=htree_(sindo),$FFFF0002,$0001 tvins(6)=varptr(tag) sendmsg hid,$1100,,varptr(tvins) htree=stat } if gen=2&&kako=1{ sindo+ htree_(sindo)=htree } if gen=3{ sindo- if sindo<1:sindo=1 } } i+ wend return #global syscolor 15 boxf objsize 300,300 pos 12,12 menu={" ::ファイル :> ::新規(&N)\t ::開く(&O)...\tCtrl+O ::上書き保存(&S)\tCtrl+S ::名前を付けて保存(&A)... :- ::ページ設定(&U)... ::印刷(P)...\tCtrl+P :- ::終了(&X)\tCtrl+Q :< ::編集 :> ::p :< "} tree menu,0,0 stop
同文法です



begriff

リンク

2008/2/18(Mon) 23:32:44|NO.13635

問題なのは 表示するだけだということなんですよ
というわけで、後々管理しづらい・・・



船丸

リンク

2008/2/20(Wed) 21:46:45|NO.13678

関係ないかもしれませんがデモの協力者にbegriffさんと乗せますので、
これをhsp3util2xt(自作モジュール)に吸収するのはOKですか?



begriff

リンク

2008/2/20(Wed) 22:22:36|NO.13680

はい 構いません。



MIZUSHIKI

リンク

2008/2/24(Sun) 16:47:15|NO.13739

ツリービューの方は、選択されたかどうか知るのにWM_NOTIFYを使います。

選択項目の取得をbegriffさんの手法と似たような感じでやってみました。
ツリービューを複数設置するときはhtree_txt,max_sindo,hid 辺りをIDごとに配列で管理してやればできそう。

#module #define TVM_GETNEXTITEM 0x110A #define TVM_SELECTITEM 0x110B #define TVGN_CARET 0x0009 #deffunc tree str tv1,int sw_1,int sw_2 sw1=limit(sw_1,0,1)not(1) sw2=limit(sw_2,0,1)not(1) tv=tv1 b="" tag_(0)="" notesel tv winobj "SysTreeView32" ,"",0,0x50000000|$4|$2*sw1|$1*sw2 htree_txt="" ;↓変更点の行末をコメントアウト max_sindo=1 ; sindo=0 ;最初に"ファイル"を選択しておくため0に変更 hid=objinfo(stat,2) htree_(sindo)=0 while(i<=notemax) noteget b,i koro=instr(b,0,":") if koro!-1{ kako=gen gen=0 tag="" if ":"=strmid(b,koro+1,1){ tag=strmid(b,koro+2,strlen(b)-koro-2) gen=1 }else:if ">"=strmid(b,koro+1,1){ gen=2 }else:if "<"=strmid(b,koro+1,1){ gen=3 } if gen=1{ tvins(0)=htree_(sindo),$FFFF0002,$0001 tvins(6)=varptr(tag) sendmsg hid,$1100,,varptr(tvins) htree=stat htree_txt+="::"+htree+"\n" ; if sindo=0 :htree_(0)=htree :sindo++ ;最初に"ファイル"を選択するため保存 } if gen=2&&kako=1{ sindo+ htree_(sindo)=htree htree_txt+=":>\n" ; if max_sindo<sindo :max_sindo=sindo ; } if gen=3{ sindo- if sindo<1:sindo=1 htree_txt+=":<\n" ; } } i+ wend sendmsg hid,TVM_SELECTITEM,TVGN_CARET,htree_(0) ;最初に"ファイル"を選択しておく return hid ; ;ツリービューの選択項目を取得 ;// 選択位置を配列で返します ;// 例:ファイル>上書き保存 ⇒ p1= 1,3,0 #deffunc TreeGetItem array p1 sendmsg hid, TVM_GETNEXTITEM, TVGN_CARET, 0 select_item=stat dim p1,max_sindo i=0 sindo=0 repeat getstr b,htree_txt,i :i+=strsize if strsize=0 :break koro=instr(b,0,":") if koro!-1{ kako=gen gen=0 tag="" if ":"=strmid(b,koro+1,1){ tag=strmid(b,koro+2,strlen(b)-koro-2) gen=1 }else:if ">"=strmid(b,koro+1,1){ gen=2 }else:if "<"=strmid(b,koro+1,1){ gen=3 } if gen=1{ p1(sindo)++ if select_item=int(tag) :break } if gen=2&&kako=1{ sindo+ } if gen=3{ p1(sindo)=0 sindo- if sindo<0:sindo=0 } } loop return #global syscolor 15 boxf objsize 300,300 pos 12,12 menu={" ::ファイル :> ::新規(&N)\t ::開く(&O)...\tCtrl+O :> ::abc ::d :< ::上書き保存(&S)\tCtrl+S ::名前を付けて保存(&A)... :- ::ページ設定(&U)... ::印刷(P)...\tCtrl+P :- ::終了(&X)\tCtrl+Q :< ::編集 :> ::p :< "} tree menu,0,0 hid=stat #define WM_NOTIFY 0x004E oncmd gosub *OnNotify,WM_NOTIFY stop *OnNotify dupptr nmhdr,lparam,12 ;//ツリービューの検知 if nmhdr = hid { ;通知コード switch nmhdr.2 case -402 ;TVN_SELCHANGED :選択アイテムが変更された TreeGetItem tv_item gosub *TreeSwitch swbreak swend } return *TreeSwitch switch tv_item(0) case 1 switch tv_item(1) case 0 :dialog "ファイル" :swbreak case 1 :dialog "ファイル>新規" :swbreak case 2 : switch tv_item(2) case 0 :dialog "ファイル>開く" :swbreak case 1 :dialog "ファイル>開く>abc" :swbreak case 2 :dialog "ファイル>開く>d" :swbreak swend swbreak case 3 :dialog "ファイル>上書き保存":swbreak case 4 :dialog "ファイル>名前を付けて保存":swbreak case 5 :dialog "ファイル>ページ設定":swbreak case 6 :dialog "ファイル>印刷":swbreak case 7 :dialog "ファイル>終了":swbreak swend swbreak case 2 switch tv_item(1) case 0 :dialog "編集" :swbreak case 1 :dialog "編集>p":swbreak swend swbreak swend return
敷居を低くするということを考えると、WM_NOTIFYもモジュールの中に入れて*TreeSwitchを呼ばせるほうが良かったかな。
でもそうすると、他のコントロールでWM_NOTIFYを使うときに大変ですよね。



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