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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0710
はりおUser32.DLL TrackPopupMenuExによるメニューバーの作成がうまくいかない2解決


はりお

リンク

2020/7/10(Fri) 21:05:00|NO.90956

リストボックスにて、計算結果を表示するプログラムを作成しています。
リストボックスの項目の上で右クリックした時にメニューバーを表示するように
作りましたが、メニューバーのどの項目を選んだか(変数:menuid)がうまく取得
出来なくなってしまいました。
以下に考えたソースを提示致します。
(いろんな掲示板で教えて頂いたものが詰まっています。すみません。)


#uselib "user32.dll" #func CreatePopupMenu "CreatePopupMenu" #func TrackPopupMenuEx "TrackPopupMenuEx" int,int,int,int,int,nullptr #func AppendMenu "AppendMenuA" int,int,int,sptr #func DestroyMenu "DestroyMenu" int #func ScreenToClient "ScreenToClient" int,var #func ClientToScreen "ClientToScreen" int,var #cfunc ChildWindowFromPoint "ChildWindowFromPoint" int,int,int #define LB_GETTEXT 0x189 #define LB_GETITEMHEIGHT $000001A1 #define LB_GETCOUNT $0000018B onexit *exit objsize ginfo_winx sdim output,65536 output = {" ABC9(W300) 183.0 123.85 130.98 26.41 -44.16 DEF18(E110) 180.0 126.68 133.81 28.65 -42.57 GHI8(E130) 172.0 134.85 141.98 34.30 -37.49 "} /* output = {" ABC9(W300) 183.0 123.85 130.98 26.41 -44.16 DEF18(E110) GHI8(E130) "} */ listbox a,100,output listboxid = stat hList = objinfo(listboxid,2) await // postされたフォント設定メッセージがリストボックスに適用されるのを待つためメッセージループを回しておく。しないと常にheight=18 sendmsg hList, LB_GETITEMHEIGHT, 0,0 : height = stat sendmsg hList, LB_GETCOUNT, 0,0 : items = stat // 項目数を取得 endline = height * items CreatePopupMenu : hpop = stat AppendMenu hpop , 0, 1, "メニュー [1]" AppendMenu hpop , 0, 2, "メニュー [2]" AppendMenu hpop , 0, 3, "メニュー [3]" oncmd gosub *onContextMenu, $7B ;WM_CONTEXTMENU oncmd gosub *onParentNotify, $210 ;WM_PARENTNOTIFY stop *onParentNotify if (wparam&0xFFFF) = $204 { ;WM_RBUTTONDOWN Point = lParam&0xFFFF, lParam>>16&0xFFFF if ChildWindowFromPoint(hWnd, Point, Point.1) = hList { ClientToScreen hWnd, Point ScreenToClient hList, Point SendMsg hList, $201, 1, Point|Point.1<<16 ;WM_LBUTTONDOWN SendMsg hList, $202, 0, Point|Point.1<<16 ;WM_LBUTTONUP } } return *onContextMenu point = ginfo_mx,ginfo_my ScreenToClient hList,point if ( wparam == hList ) && ( point.1 <= endline ) { TrackPopupMenuEx hpop,$182,ginfo_mx,ginfo_my,hWnd : menuid = stat if ( menuid != 0 ) { sdim buf sendmsg hList,LB_GETTEXT,a,varptr(buf) dialog "メニュー項目:"+menuid+"\n項目名:"+buf+"\n項目番号:"+a goto *exit } } return *exit DestroyMenu hpop end

ワタシの環境では実行後にDEF18(E110)の上で右クリックしてメニュー3を選択すると

メニュー項目 : 842280224 項目名 : DEF18(E110)...... 項目番号 : 1
となってしまいます。
本来であれば

メニュー項目 : 3
となって欲しいのですが、うまくいきません。
いろいろと調べている中で、
output変数の長さが関係している?ような気もします。
コメントアウトしているoutput変数の定義を有効にすると
問題無く動きます。こうなってしまう原因分かる方いらっしゃいますでしょうか?
また、解決策分かる方いらっしゃいましたらご指導是非ともよろしくお願い致します。

以上、長文になってしまい、すみません。



この記事に返信する


とあるプログラマ

リンク

2020/7/10(Fri) 21:37:59|NO.90957

73行目あたりの sdim buf でバッファ確保サイズが指定されていないため取得する文字列に対してバッファ不足に陥ってるのが原因かと思います。

ここで sdim buf, 65536 のように取得する文字列以上のバッファを確保する必要があります。(sdimでサイズ指定をしないとデフォルトでは64バイトしか確保されません)



はりお

リンク

2020/7/10(Fri) 21:47:38|NO.90959

とあるプログラマ さん

素早い返答ありがとうございます。
指摘頂いた所直したところ、きちんと取得出来ました、
指導頂きありがとうございました!!



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