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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0924
葡萄色トラックバーのカスタムドロー2解決


葡萄色

リンク

2015/9/24(Thu) 22:26:52|NO.71918

ごんばんは。
現在制作中のソフトでカスタムドローのトラックバーを作っているのですが、描画が上手くいきません。
具体的にどんな感じの描画をしているかというと、トラックバーのチャンネル(?)の部分をつまみの右と左で違う色に塗り分けるような感じです。
以下がそのスクリプトです。

#include "user32.as" #include "gdi32.as" #define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16) #define CDDS_PREPAINT 0x00000001 #define CDDS_ITEMPREPAINT 0x00010001 #define CDRF_NOTIFYITEMDRAW 0x00000020 #define CDRF_SKIPDEFAULT 0x00000004 onexit *exit ; ブラシ破棄用 oncmd gosub *notify, $4E ; コントロール描画用 oncmd gosub *StaticControl, $138 ; 背景描画用 dim RECT, 4 ; トラックバー用ブラシ作成 CreateSolidBrush RGB($00, $00, $00) ; 背景用ブラシ hBrush.0 = stat CreateSolidBrush RGB($CC, $FF, $CC) ; チャンネル用ブラシ1 hBrush.1 = stat CreateSolidBrush RGB($30, $30, $30) ; チャンネル用ブラシ2 hBrush.2 = stat winobj "msctls_trackbar32", "", , $50000000 | $10, 400 hTrackbar = objinfo_hwnd(stat) sendmsg hTrackbar, $408, true, 384 ; TBM_SETRANGEMAX stop *notify ; NMHDR構造体 dupptr NMHDR, lparam, 12 if NMHDR.0 = hTrackbar { if NMHDR.2 = -12 { ; NMCUSTOMDRAW構造体 dupptr NMCUSTOMDRAW, lparam, 60 ; CDDS_PREPAINTステージ if NMCUSTOMDRAW.3 = CDDS_PREPAINT { return CDRF_NOTIFYITEMDRAW } ; CDDS_ITEMPREPAINTステージ if NMCUSTOMDRAW.3 = CDDS_ITEMPREPAINT { ; TBCD_THUMB if NMCUSTOMDRAW.9 = 2 { ; つまみ部分描画 RECT.0 = NMCUSTOMDRAW.5 RECT.1 = NMCUSTOMDRAW.6 RECT.2 = NMCUSTOMDRAW.7 RECT.3 = NMCUSTOMDRAW.8 FillRect NMCUSTOMDRAW.4, varptr(RECT), hBrush.1 return CDRF_SKIPDEFAULT } if NMCUSTOMDRAW.9 = 3 { ; チェンネル部分描画 RECT.0 = NMCUSTOMDRAW.5 RECT.1 = NMCUSTOMDRAW.6 RECT.2 = NMCUSTOMDRAW.7 RECT.3 = NMCUSTOMDRAW.8 FillRect NMCUSTOMDRAW.4, varptr(RECT), hBrush.2 sendmsg hTrackbar, $400 RECT.0 = NMCUSTOMDRAW.5 RECT.1 = NMCUSTOMDRAW.6 RECT.2 = NMCUSTOMDRAW.5 + stat RECT.3 = NMCUSTOMDRAW.8 FillRect NMCUSTOMDRAW.4, varptr(RECT), hBrush.1 return CDRF_SKIPDEFAULT } } } } return *StaticControl if lParam = hTrackbar { ; 背景部分描画 SetBkColor wParam, RGB($00, $00, $00) return hBrush.0 } return *exit ; ブラシ破棄 DeleteObject hBrush.0 DeleteObject hBrush.1 DeleteObject hBrush.2 end
実行してみてつまみを動かしてみると一見正常に描画されているようなのですが、つまみを速く動かすと左側の部分が途切れ途切れになってしまいます。
どうやらつまみの周辺しか描画されてないように見えます。
原因がよく分からず困っています。カスタムドローをまともにやったのは初めてなので。
説明が少なくて分かりにくいとは思いますが、よろしくお願いします。

・参考URL
http://lhsp.s206.xrea.com/hsp_object7.html#1
http://lhsp.s206.xrea.com/misc/customdraw.html



この記事に返信する


774

リンク

2015/9/24(Thu) 22:47:34|NO.71920

システムデフォルトの挙動として、必要最低限な領域のみ再描画しているのではないかと思います。
InvalidateRect API等で全体を強制的に再描画させてみてはどうでしょうか。

蛇足ですが、oncmd辺りを使ってトラックバーぽいものを描いちゃった方が楽かも知れません。



葡萄色

リンク

2015/9/24(Thu) 23:21:20|NO.71922

そんな便利な関数があるとは。。。
774さんの仰る通りInvalidateRectで再描画させたところ、上手く反映させるとことができました。
ありがとうございます。

あれ?解決ボタンが無い?と思ったら投稿の際、間違えて「仲間に入れて!」カテゴリを選んでしまった様です。
というわけで、この投稿をもって解決とします。



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