• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 849
  • Last Modified:

MFC: Two listboxes with one scrollbar

Dear experts,

Could you please tell me how I could make two listboxes use one common scrollbar to move content of both vertically for my MFC application?
Thanks.
0
tantormedia
Asked:
tantormedia
  • 5
  • 4
  • 3
2 Solutions
 
Deepu AbrahamR & D Engineering ManagerCommented:
You may try overriding the WindowProc for the ListCtrl and capture VSCROLL and post the message to the other list box.
LRESULT CMyListCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_VSCROLL) {
::PostMessage(m_hwndList2, message, wParam, lParam);
}
return CListCtrl:::WindowProc(message, wParam, lParam);
}

Open in new window

0
 
tantormediaAuthor Commented:
Thank you for your answer. Could you please tell me how I can get m_hwndList2?
0
 
Deepu AbrahamR & D Engineering ManagerCommented:
You could create an object of your list control

Have a look at this:
http://www.functionx.com/visualc/controls/listbox.htm
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
tantormediaAuthor Commented:
This I understand. My question was about the window handle that is passed to PostMessage().
Also, my ListBox class should be generic, so I guess, I would have to pass the handle to the second Listbox to its constructor...
0
 
Deepu AbrahamR & D Engineering ManagerCommented:
HWND m_hwndList2 = NULL;
m_hwndList2 = m_MyList2.m_hWnd;
0
 
sarabandeCommented:
tantormedia, deepuabrahamk speeks of a list control while you were talking of list boxes.

nevertheless, you can do the parallel scrolling with listboxes as well:

  - derive a own listbox class CMyListBox from CListBox
  - exchange CListBox in dialog header by CMyListBox
  - add a function CMyListBox::PreTranslateMessage  to CMyListBox like

BOOL CMyListBox::WindowProc(MSG* pMsg)
{
    if(pMsg->message==WM_VSCROLL) {
         CMyDialog* pDlg = (CMyDialog*)GetParent();

         pDlg->m_listbox2.PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
    }
    return FALSE;   // not handled cause the scrolling must be done by CListBox
}

using a list control in report style would allow you to have two text columns (and line number column if you want). so you automatically have one scrollbar for both text files.

Sara

0
 
tantormediaAuthor Commented:
Thank you for your answers.
Sara, your code for WindowProc() is very similar to DeepuAbrahamK's. Is there any real difference?

Thanks.
0
 
sarabandeCommented:
i made a mistake. the function is

BOOL CMyListBox::PreTranslateMessage(MSG* pMsg)

not WindowProc.

you also must find out whether the 'this' is m_listbox1 or m_listbox2 in order to post the message to the other control. also you need to add code to prevent from infinite messages for example by saving the last message.

BOOL CMyListBox::PreTranslateMessage(MSG* pMsg)
{
    static UINT lastListbox = 0;
    static MSG lastMsg = { 0 };

   
    if(pMsg->message==WM_VSCROLL) {
         CMyDialog* pDlg = (CMyDialog*)GetParent();
         if (pDlg->GetDlgItem(IDC_LIST1) == this)
         {
             if (memcmp(pMsg, &lastMsg) != 0)
                 pDlg->m_listbox2.PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
          }
         else /* if (pDlg->GetDlgItem(IDC_LIST2) == this) */
         {
             if (memcmp(pMsg, &lastMsg) != 0)
                 pDlg->m_listbox1.PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
          }
          memcpy(&lastMsg, pMsg, sizeof(MSG));
    }
    return FALSE;   // not handled cause the scrolling must be done by CListBox
}


Sara
0
 
sarabandeCommented:
the PreTranslateMessage and WindowProc both will be called from message loop so that you can hook with them into message processing.

for your purpose the one is as good as the other. but you should use the CWnd member functions rather than pure WINAPI as deepuabrahamk posted. The CWnd is baseclass of CListBox and has the window handle as a member.

Sara
0
 
tantormediaAuthor Commented:
Strange, but it doesn't work. WM_VSCROLL is not caught.

Sara, could you please answer also my question there:
http://www.experts-exchange.com/Programming/Languages/CPP/Q_26820685.html#a34897334

Thanks.
0
 
sarabandeCommented:
then try the WindowProc.

i mean to remember that PreTranslateMessage only was called for dialog windows.

unfortunately there are also two different techniques for scrollbar. one is the built-in scroll bar of a normal control window. another is a separate scroll bar window attached to a control. i mean listbox has the first and list control the second.

Sara
0
 
tantormediaAuthor Commented:
Thanks.
0

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

  • 5
  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now