vc++.10 Windows7 MFC
ダイアログ上に二つリストコントロールがあり、リストコントロールAのスクロールバー動作時に、リストコントロールBのスクロールバーの同期を取りたいと考えています。
CListCtrlを継承したクラスCの作成を行い、コントロール変数Aに対して、クラスCを関連付けて、スクロールイベントの受信までは出来ました。
リストAのスクロールの値は、クラスC::関数で操作出来そうですが以下の方法でリストBの操作を行おうとするとAssertが発生してしまいます。
C{CListCtrl *pListB;
----------------------
C c;
c.pListB &m_listb;
または
CListCtrl *listB = (CListCtrl*)GetDlgItem(IDC_LISTB);
のようにポインタ取得して、クラスCで呼び出しました。
どのようにリストBにアクセスすればいいでしょうか。
方法論的には誤りはありません。
実際に同様の実装をしたことがありますが、
特に問題なく動きます。
各リストコントロールのオブジェクトが
正しく取得できていない、等の部分を疑ってみてはどうでしょう。
回答ありがとうございます。
アクセスは、出来るようになりました。
そのあとのスクロールの同期で、Scroll関数を使用して、GetScrollPosで取得した値を代入して見ましたが、うまく同期してくれませんでした。
代入する値としてどういれればいいでしょうか。
また、他にいいソースがあれば助言お願いします。
参考になるかどうかわかりませんが、次のように実装しました。
1.MyListA MyListB が同期スクロールするものとします。
2.互いに、互いのポインタを保持するものとします。
3.MyListA::OnVScroll(UINT code, UINT pos, CScrollBar* bar)
{
CListCtrl::OnVScroll( code, pos, bar);//自派生元の処理
m_list_b->OnScroll_by_Brother( code, pos, bar);//兄弟に通告
}
4.MyListB::OnScroll_by_Brother(UINT code, UINT pos, CScrollBar* bar)
{//兄弟からの通告
if( nSBCode == SB_THUMBTRACK){
UINT n = GetTopIndex();
UINT Sub = nPos - n;
Scroll( CSize( 0, 一行の高さ * Sub));
}
else{
CListCtrl::OnVScroll( code, pos, bar);//自派生元の処理
}
}
つまり、同等コードを呼び合う形です。
ただし、SB_THUMBTRACKだけはうまくいかないので
CListCtrl::Scroll()で必要な分スクロールさせます。
マウスホイールについても同様の形で実装します。
この場合当然、CListCtrl::Scroll()でスクロールします。
兄弟にはデルタ値を渡せば十分ですね。
ありがとうございます。
参考になりました。
ツイート | ![]() |