Metasequoia BBS

| New message | Normal | Tree |
Status
Tag
Keyword
[8175] MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / sss
[Request,SDK,widget] Response
MQWidgetBaseの位置の獲得方法について教えてください。
MQWindowBaseにはGetPosX/GetPosYなどがあるようですが、MQWidgetBaseには見当たりません。
MQTreeListBox/MQListBox/MQScrollBoxなどスクロールするものでスクロール位置を獲得する方法を教えてください。
またスクロールしたことを検出することは可能でしょうか?
2019-04-08 22:34
[8176] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / Administrator
>MQWidgetBaseの位置の獲得方法について教えてください。
>MQWindowBaseにはGetPosX/GetPosYなどがあるようですが、MQWidgetBaseには見当たりません。

MQWidgetBase::ClientToClient()で親ウィジェットや所属するウィンドウに対する相対的な位置を取得することができます。

>MQTreeListBox/MQListBox/MQScrollBoxなどスクロールするものでスクロール位置を獲得する方法を教えてください。

直接のスクロール位置ではありませんが、リストの先頭の項目に対してGetItemRect()で割り出すことは可能です。

>またスクロールしたことを検出することは可能でしょうか?

イベントは通常必要と考えられる程度のものに絞っているので、スクロールの検出を行うAPIは提供しておりません。
2019-04-09 10:06
[8178] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / sss
Tag has been changed from [Question,SDK,widget] to [Request,SDK,widget].
>イベントは通常必要と考えられる程度のものに絞っているので、スクロールの検出を行うAPIは提供しておりません。
MQTreeListBoxの横にMQPaintBoxを置いて、MQTreeListBoxの項目位置にあわせてMQPaintBoxの中の項目もスクロールするようなウィジェットを作っています。
現状は33msのTimerイベントでスクロール位置が変わったときにイベント発行という方法で代替していますが、
それでは無駄なのでできればスクロール位置が変わっときにイベント発行できる機能(ScrollChangedEventとか)が作れるなら実装して欲しい次第です
(何かサポート外のイベントを実装するたびにTimerイベントで実装すると無駄な負荷が増えると思いますし)
2019-04-10 14:53
[8179] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / sss
すいません。
あとMQTreeListBoxの項目が開いたとき/閉じたときも検出できるようになるとありがたいです。
2019-04-10 15:11
[8180] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / Administrator
ツリーリストの項目ごとに何か別の要素を付加して表示したい場合、DrawItemイベントが利用可能ですが、こちらで対応できませんか?
例えば次のようにイベント関数を実装すると、文字の前にアイコンなどを描画することができるようになります。
BOOL SamplePluginWindow::TreeListDrawItem(MQWidgetBase *sender, MQDocument doc, MQTreeListBoxDrawItemParam& param)
{
    int pad = (int)ceil(param.Height * 0.2);
    int size = param.Height - pad*2;
    param.Canvas->SetColor(255,0,0,255);
    param.Canvas->FillRect(param.X + pad, param.Y + pad, size, size);
    param.X += size + pad*2;
    param.Width -= size + pad*2;
    return FALSE; // Continue to draw a text.
}
2019-04-10 16:23
[8181] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / sss
縦スクロールは同期したいですが、横スクロールは別に動かしたいので、その方法では実現できません
2019-04-10 17:02
[8184] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / Administrator
それではDrawItemかPaintイベント内で横スクロール用ウィジェットのRepaintを呼ぶというのはどうでしょうか?
ツリーリストのスクロールや開閉時には必ず再描画が発生するので、それに連動して再描画しておけば無駄も生じず実用上困ることはないと思います。
2019-04-11 17:57
[8185] Re: MQWidgetBaseの位置、MQTreeListBoxなどのスクロール位置について / sss
それだと現状のスクロール位置と開閉状態を監視しているのと大差ないかと…
それにDrawItemやPaintの動作が変わった場合、動作しなくなってしまいます。

他のGUIライブラリなどではリストの内のスクロール検出イベントなどがあるのは普通ですが…
まぁ現状動作していますし、実装が面倒臭いというならば、このままで結構です。
2019-04-11 18:54