ダイアログ上のリストコントロールのスクロールを同期させるには

解決


ベル  2012-02-26 14:10:55  No: 73207  IP: 192.*.*.*

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にアクセスすればいいでしょうか。

編集 削除
仲澤@失業者  2012-02-27 10:10:50  No: 73208  IP: 192.*.*.*

方法論的には誤りはありません。
実際に同様の実装をしたことがありますが、
特に問題なく動きます。
各リストコントロールのオブジェクトが
正しく取得できていない、等の部分を疑ってみてはどうでしょう。

編集 削除
ベル  2012-02-27 21:23:25  No: 73209  IP: 192.*.*.*

回答ありがとうございます。
アクセスは、出来るようになりました。

そのあとのスクロールの同期で、Scroll関数を使用して、GetScrollPosで取得した値を代入して見ましたが、うまく同期してくれませんでした。
代入する値としてどういれればいいでしょうか。

また、他にいいソースがあれば助言お願いします。

編集 削除
仲澤@失業者  2012-02-28 15:14:34  No: 73210  IP: 192.*.*.*

参考になるかどうかわかりませんが、次のように実装しました。

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()でスクロールします。
兄弟にはデルタ値を渡せば十分ですね。

編集 削除
ベル  2012-03-03 00:14:16  No: 73211  IP: 192.*.*.*

ありがとうございます。
参考になりました。

編集 削除