CWnd 派生クラスでスクロールバーをつけるには?

解決


真実  2008-11-12 08:11:13  No: 69219

開発環境: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 がみつけられませんでした。

上記を実現できる方法について何かご存知の方はお教えいただけない
でしょうか。


Blue  2008-11-12 10:28:15  No: 69220

CWnd::ShowScrollBar
CWnd::SetScrollInfo

で設定できます。


真実  2008-11-27 06:58:45  No: 69221

レス遅くなってすみません。
Blueさん、ありがとうございました。
その方法でうまくいきました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加