|
|
|
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
| |
|
2008/2/17(Sun) 23:45:05|NO.13612
使いたかったらご自由に使ってください
:: ・・・項目作ります
:> ・・・サブに行きます
:< ・・・サブから戻ります
:- ・・・横の棒
なんかインデントしてもしなくてもokぽいです
むちゃくちゃ書いてもある程度まで許容するっぽいです
(↑そういうふうに作ったから)
|
|
2008/2/18(Mon) 20:05:07|NO.13618
メニューバーってウィンドウの上の[ファイル]とか[編集]とかいうやつですよね?
mod_menu.as使えばわかると思います。
サンプルにありますよ。
|
|
2008/2/18(Mon) 20:30:05|NO.13623
どう突っ込んだものやら(笑
|
|
2008/2/18(Mon) 21:45:15|NO.13627
作った本人としては ネタとして最高に面白いと思ったのですが^^
最初実用的なものを作ろうとしてたのですが・・・ 実用的ですよね・・・?
まぁ、なんか面白かったので上げてみました。
|
|
2008/2/18(Mon) 22:50:50|NO.13629
これは面白いですね!
ジャンプする処理を自前で書く必要があるのが残念ではありますが、メニューバー作成の敷居をぐっと下げてくれる点や命令ひとつでガーッと作ってくれる点が嬉しいです。
> こういうのって実際使えるものですかね・使いたいものですか?
きっと自己流の改造をする(strmidを減らすとかwhileをrepeatにするとか)と思いますが、使ってみたいです。
|
|
2008/2/18(Mon) 22:56:33|NO.13631
まぁ非効率なところがチラホラと^^ 見え隠れしてますね
|
|
2008/2/18(Mon) 23:00:37|NO.13632
*無粋な一行削除(笑
モジュールの件を言うなら、これはイイんでね。便利良さそうに思われ。
|
|
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
同文法です
|
|
2008/2/18(Mon) 23:32:44|NO.13635
問題なのは 表示するだけだということなんですよ
というわけで、後々管理しづらい・・・
|
|
2008/2/20(Wed) 21:46:45|NO.13678
関係ないかもしれませんがデモの協力者にbegriffさんと乗せますので、
これをhsp3util2xt(自作モジュール)に吸収するのはOKですか?
|
|
2008/2/20(Wed) 22:22:36|NO.13680
はい 構いません。
|
|
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を使うときに大変ですよね。
| |
|