開発環境:WindowsXPsp2 VC++.NET2003 MFC
行ごとに高さが異なるリストボックスのようなものが欲しくて
自作しているのですが、スクロールバーをつける方法について
悩んでいます。
現在のところ、リソースエディタでダイアログにピクチャ
コントロールを貼り付けて、ダイアログの OnInitDialog 内で
動的サブクラス化して自作クラスに紐づけています。
// 実装イメージ
class CMyList : public CWnd
...
CMyList m_list;
CXxxxDialog::OnInitDialog()
{
m_list.SubclassWindow( GetDlgItem( IDC_STATIC1 )->GetSafeHwnd() );
}
当初、リストボックスをオーナードローすればいいかと思い、
CListBox 派生クラスを用いていましたが、AddString する前に
OnMeasureItem が一回だけ呼ばれますが、AddString 以降に
呼ばれない仕様のようなので、この方法は
断念しました。
そこで、CWnd 派生にして OnPaint ですべて自前描画しています。
この方法である程度自分がやりたいことが実現できそうでしたので、
次はスクロールバー、というところで行き詰ってしまいました。
MSDN をみると、
(1) WS_XXX でスクロールバーを指定するか
(2) CreateWindow して SB_CTL を使うか、
(3) スクロールバーを描画できる API があるので WM_PAINT で自分で描画しろ
のいずれかの方法があるとありました。
ところが、(1) は、CreateWindow を使用せず動的サブクラス化して
いるので使用できないようです。
(2) の方法について、CMyList クラスに CScrollBar のオブジェクトを
持たせてみましたが、結びつける方法がわかりませんでした。
(OnEraseBlgnd などのタイミングで CScrollBar::SetParent(this) を
呼び出したらアサートしました。)
(3) 「スクロールバーを描画できる API がある」とのことですが、
実際の API がみつけられませんでした。
上記を実現できる方法について何かご存知の方はお教えいただけない
でしょうか。
CWnd::ShowScrollBar
CWnd::SetScrollInfo
で設定できます。
レス遅くなってすみません。
Blueさん、ありがとうございました。
その方法でうまくいきました。
ツイート | ![]() |