同期スクロールの例(リスト側) |
void CHogeList::OnSysCommand( UINT nID, LPARAM lParam ){ CListCtrl::OnSysCommand(nID, lParam); if((nID & SC_HSCROLL) == SC_HSCROLL){ CHogeManageView *pParent = (CHogeManageView*)GetParent(); if(pParent == NULL){ return; } CHogeList *tView1 = NULL; CHogeList *tView2 = NULL; CHogeList *pTarget = NULL; CHogeList *pFrom = NULL; tView1 = &(pParent->m_listTest); tView2 = &(pParent->m_listTest2); if(tView1 == this){ pTarget = tView2; pFrom = tView1; }else if(tView2 == this){ pTarget = tView1; pFrom = tView2; } SIZE size; int tx = pTarget->GetScrollPos(SB_HORZ); int fx = pFrom->GetScrollPos(SB_HORZ); size.cx = fx - tx; size.cy = 0; pTarget->Scroll(size); } } |
同期スクロールの例(親側) |
BOOL CHogeView::PreTranslateMessage( MSG* pMsg ){ SHORT sCtrl = GetKeyState(VK_CONTROL); switch(pMsg->message){ //--------------------------------------------------------------------- //キー入力制御 case WM_KEYDOWN: if((pMsg->wParam != VK_LEFT) && (pMsg->wParam != VK_RIGHT)){ break; } if(pMsg->hwnd == m_listTest.m_hWnd){ m_listTest2.PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam); return FALSE; }else if(pMsg->hwnd == m_listTest2.m_hWnd){ m_listTest.PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam); return FALSE; } break; //--------------------------------------------------------------------- //マウス左クリック制御 case WM_LBUTTONDOWN: TLPOS pos; LVHITTESTINFO lvHitTest; POINT point; point.x = LOWORD(pMsg->lParam); point.y = HIWORD(pMsg->lParam); lvHitTest.flags = LVHT_ABOVE ; lvHitTest.pt = point; if(pMsg->hwnd == m_listTest.m_hWnd){ /*位置を合わせる処理*/ }else if(pMsg->hwnd == m_listTest2.m_hWnd){ /*位置を合わせる処理*/ } break; } return FALSE; } |
nCodeに入ってくる値 | |
フラグ | 説明 |
SB_ENDSCROLL | スクロールの終了 |
SB_LEFT | 一番左にスクロール |
SB_RIGHT | 一番右にスクロール |
SB_LINELEFT | 1つ左にスクロール |
SB_LINERIGHT | 1つ右にスクロール |
SB_PAGELEFT | 1ページ左にスクロール |
SB_PAGERIGHT | 1ページ右にスクロール |
SB_THUMBPOSITION | 絶対位置へスクロール |
SB_THUMBTRACK | 指定位置へスクロール ボックスをドラッグ |
同期スクロールの例 |
void CHogeList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar); CHogeView *pParent = (CHogeView*)GetParent(); CHogeList *pList1 = NULL; CHogeList *pList2 = NULL; CHogeList *pTarget = NULL; CHogeList *pFrom = NULL; CScrollBar *pTargetBar = NULL; int toPos; int fromPos; if(pParent != NULL){ pList1 = &(pParent->m_List1); pList2 = &(pParent->m_List2); }else{ return; } if((pList1 != NULL) && (pList2 != NULL)){ int nPos1 = pList1->GetScrollPos(SB_HORZ); int nPos2 = pList2->GetScrollPos(SB_HORZ); CRect rect1; CRect rect2; pList1->GetWindowRect(&rect1); pList2->GetWindowRect(&rect2); //スクロール同期の準備 if(nPos1 != nPos2){ if(pList1 == this){ //上部のリストをスクロールした場合 pTarget = pList2; pFrom = pList1; toPos = nPos1; fromPos = nPos2; pTargetBar = pList2->GetScrollBarCtrl(SB_HORZ); }else if(pList2 == this){ //下部のリストをスクロールした場合 pTarget = pList1; pFrom = pList2; toPos = nPos2; fromPos = nPos1; pTargetBar = pList1->GetScrollBarCtrl(SB_HORZ); } //各種メッセージへの対応 switch(nSBCode){ case SB_THUMBTRACK: pTarget->Scroll(CSize(toPos - fromPos, 0)); pTarget->SetScrollPos(SB_HORZ, toPos, TRUE); pTarget->UpdateWindow(); break; case SB_ENDSCROLL: //本物の縦スクロールバーが表示された場合の対処 if(toPos != 0){ nSBCode = SB_LINERIGHT; } default: //メッセージ送信の準備 WPARAM wParam = MAKEWPARAM( nSBCode, nPos ); pTarget->SendMessage(WM_HSCROLL, (WPARAM)wParam, (LPARAM)pTargetBar); break; } } } } |