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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0602
たかオーナードローコンボボックスとカスタムボタンの描画2解決


たか

リンク

2019/6/2(Sun) 11:11:05|NO.87541

下記を参考にしながら,オーナードローコンボボックスを活用して,カラー塗りつぶしcomboxを作成
しました。
http://lhsp.s206.xrea.com/hsp_object5.html

そこに,画像を表示するobjimageを追加しようとしました。
しかし,objimageにマウスカーソルを合わせるまで指定イメージが反映されません。
一度指定イメージが反映されると,以降はマウスカーソルを外しても反映されたままになります。

マウスカーソルをobjimageに合わせることなく,初期から指定イメージがobjimageに反映される方法
をご示唆いただけたら幸いです。

ソースコードは下記です。
(掲示板用に,objimageでの表示内容は,画像ファイルの代わりに背景を使用しています)

/*------------------------------------------------------------------ ■カラー塗りつぶしのcombox ・下記参考 ▼オーナードローコンボボックス設置モジュール 色選択コンボボックス サンプルソース by Kpan http://lhsp.s206.xrea.com/ (Let's HSP!) ダウンロード http://lhsp.s206.xrea.com/hsp_object5.html ▼winobjフォント指定 http://lhsp.s206.xrea.com/hsp_object3.html ------------------------------------------------------------------*/ ; 項目内の描画で使用するWindwos APIヘッダー #include "gdi32.as" #include "user32.as" ; オーナードローコンボボックス設置モジュール #module #deffunc comboxOD int p1, int p2, int p3 winobj "combobox", "", , $50000000 | $3 | $10, p2 idObject = stat hObject = objinfo (idObject, 2) sendmsg hObject, $153, , p3 sendmsg hObject, $153, -1, p3 repeat p1 sendmsg hObject, $143 loop return idObject #global #define ODS_SELECTED 1 ; ウィンドウメッセージWM_DRAWITEM oncmd gosub *drawitem, $2B ; RECT構造体 dim RECT, 4 ; 項目に表示する四角形の塗りつぶし色(16進数カラーコード) fill_color = $0055ff;$(Blue)(Green)(Red) ; 項目に表示する文字列 dim text_list, 11 text_list = "全体", "1班", "2班", "3班", "4班", "5班", "6班", "7班", "8班", "9班", "10班" ; ウィンドウ設定 screen 0 cls 3 ; カスタムボタン用の準備(本来は,ここで画像を読み込む) color 255,100,100 boxf 0,0,150,40 ; オーナードローコンボボックスを設置(comboxOD p1=項目数, p2=オブジェクトの横幅, p3=高さ) pos 50, 50:comboxOD 11, 150, 40 idcomboxOD=stat;statにオブジェクトIDが返る hCombox = objinfo (idcomboxOD, 2) ; コンボボックス内のフォント指定 font "MS ゴシック", 30 ;HSPのBMSCR構造体からフォントハンドルを取得 mref BMSCR, 67 hFont = BMSCR(38) ;フォント反映 (WM_SETFONT) sendmsg hCombox, $30, hFont ; 項目の選択 (CB_SETCURSEL) sendmsg hCombox, $14E, 0;第3パラのwparam値にインデックス番号(0〜)を指定 ; チェックボタン objimage 0,0,0,0,0,0,0;カスタムボタン(本来は,画像でカスタムボタン) pos 250, 50:objsize 150,40:button "ちぇっく", *check objimage -1;カスタムボタン無効化 stop *drawitem ; DRAWITEMSTRUCT構造体 dupptr DRAWITEMSTRUCT, lparam, 48 if DRAWITEMSTRUCT(5) = hCombox {;本オブジェクトが操作された場合 ;テキスト色 GetSysColor 14 SetTextColor DRAWITEMSTRUCT(6), stat if DRAWITEMSTRUCT(4) & ODS_SELECTED {;選択状態 outline_draw=1;外枠の描画ON } else {;通常状態 outline_draw=0;外枠の描画OFF } if DRAWITEMSTRUCT(2) > -1 {;選択が有効な場合 SetBkMode DRAWITEMSTRUCT(6), 1 RECT = DRAWITEMSTRUCT(7), DRAWITEMSTRUCT(8), DRAWITEMSTRUCT(9), DRAWITEMSTRUCT(10);DRAWITEMSTRUCT(7)〜(10)に描画領域の左上XY,右下XYの座標が返る ;四角形塗りつぶしの描画 CreateSolidBrush fill_color hBrush = stat FillRect DRAWITEMSTRUCT(6), varptr (RECT), hBrush DeleteObject hBrush if outline_draw=1 {;外枠の描画ONの場合 ;塗りつぶされた四角形の外枠の描画 GetStockObject 14 FrameRect DRAWITEMSTRUCT(6), varptr (RECT), stat } ;テキスト文字列の描画 RECT = DRAWITEMSTRUCT(7) + 30, DRAWITEMSTRUCT(8), DRAWITEMSTRUCT(9), DRAWITEMSTRUCT(10) DrawText DRAWITEMSTRUCT(6), text_list(DRAWITEMSTRUCT(2)), -1, varptr (RECT), $4 | $20 } } return 1 *check ;選択項目のインデックス番号を取得 (CB_GETCURSEL) sendmsg hCombox, $147 mes stat;statにインデックス番号(0〜)が返ります。 stop



この記事に返信する


MillkeyStars

リンク

2019/6/2(Sun) 22:39:12|NO.87544

普通に、HSPで処理されるはずのobjimage(オーナードロー)までを処理しようとしているからでは?

コンボボックスのオーナードローは主側が行い、ボタンのオーナードローは HSP側が行うはずなのに、*drawitem 内でどっちも処理しちゃっているのが原因かと。
HSPに任せる場合、*drawitem を抜ける際の return 値を設定しないでください。

*drawitem ; DRAWITEMSTRUCT構造体 dupptr DRAWITEMSTRUCT, lparam, 48 if DRAWITEMSTRUCT(5) = hCombox {;本オブジェクトが操作された場合 ;テキスト色 GetSysColor 14 SetTextColor DRAWITEMSTRUCT(6), stat if DRAWITEMSTRUCT(4) & ODS_SELECTED {;選択状態 outline_draw=1;外枠の描画ON } else {;通常状態 outline_draw=0;外枠の描画OFF } if DRAWITEMSTRUCT(2) > -1 {;選択が有効な場合 SetBkMode DRAWITEMSTRUCT(6), 1 RECT = DRAWITEMSTRUCT(7), DRAWITEMSTRUCT(8), DRAWITEMSTRUCT(9), DRAWITEMSTRUCT(10);DRAWITEMSTRUCT(7)〜(10)に描画領域の左上XY,右下XYの座標が返る ;四角形塗りつぶしの描画 CreateSolidBrush fill_color hBrush = stat FillRect DRAWITEMSTRUCT(6), varptr (RECT), hBrush DeleteObject hBrush if outline_draw=1 {;外枠の描画ONの場合 ;塗りつぶされた四角形の外枠の描画 GetStockObject 14 FrameRect DRAWITEMSTRUCT(6), varptr (RECT), stat } ;テキスト文字列の描画 RECT = DRAWITEMSTRUCT(7) + 30, DRAWITEMSTRUCT(8), DRAWITEMSTRUCT(9), DRAWITEMSTRUCT(10) DrawText DRAWITEMSTRUCT(6), text_list(DRAWITEMSTRUCT(2)), -1, varptr (RECT), $4 | $20 } return 1 //主側が処理した通知(return 値あり) } return //return で値を設定しない場合、hsp側が処理しなさいという丸投げ



たか

リンク

2019/6/3(Mon) 00:37:23|NO.87547

MillkeyStars様

ご指摘ありがとうございます。大変勉強になりました。
ご提示いただいたプログラムで構想通りの動きを確認することができました。
ありがとうございました。



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