Solved

Checkboxes in CListCtrl via StateImages

Posted on 1997-11-05
3
431 Views
Last Modified: 2013-11-20
I'm looking for a solution:
I intend to implement a CListCtrl (Reportstyle) with Checkboxes at the head of each line (like CCheckBox).
I've created two state icons (checked, unchecked). But the problem that occured was that if I try to click on the checkbox nothing changed respectively the state of another line which was selected changed. Furthermore I don't only want to change thy state but to open an dialog at a double click to get more information from the user.
Thus my accurate questions:
- How can I include the checkbox range into the selection?
- How can I change the state of the checkbox by a single click on the checkbox field (like the CListBox behaviour)?
- How can I effectively open an dialog by a double click (Override WM_...)?
- How can I simply implement a functionality for exchanging two lines? I've tried this but every time the selection of the line I wanted to go down or up was gone.

I would be very grateful if if you could could show me the source code for a 3 row Control like discribed above.
Thank in advance.
0
Comment
Question by:trouvain
3 Comments
 
LVL 8

Expert Comment

by:gelbert
ID: 1309387
Take a look at samples\mfc\general\rowlist. To open dialog overide handle of WM_LBUTTONDBLCLK in your CListCtrl derived class and create and open dialog inside this function.
0
 
LVL 10

Accepted Solution

by:
RONSLOW earned 200 total points
ID: 1309388
I have code that does all this for a list control

Probably a bit much to put up in detail here.

To add checkboxes...

void CMyListCtrl::AddExStyle(DWORD dwNewStyle) {
      DWORD dwStyle = GetExStyle();
      dwStyle |= dwNewStyle;
      SetExStyle(dwStyle);
}

void CMyListCtrl::RemoveExStyle(DWORD dwDelStyle) {
      DWORD dwStyle = GetExStyle();
      dwStyle &= ~dwDelStyle;
      SetExStyle(dwStyle);
}

void CMyListCtrl::EnableCheckboxes(bool enable) {
      if (enable) {
            AddExStyle(LVS_EX_CHECKBOXES);
      } else {
            RemoveExStyle(LVS_EX_CHECKBOXES);
      }
}

To detect a checkbox change...

void CMyListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) {
      NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
      UINT changes = (pNMListView->uNewState)^(pNMListView->uOldState);
      if (changes & LVIS_STATEIMAGEMASK) {
            UINT checkstate = ((pNMListView->uNewState&LVIS_STATEIMAGEMASK) >> 12)-1;
            CheckStateChanged(pNMListView->lParam,checkstate);
      }
      *pResult = true;
}

where CheckStateChanged is a member function that gets called whenever a check state is changed

for double click...

ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)

int CMyListCtrl::HitTestMessage() const {
      const MSG * pMsg = GetCurrentMessage();
      CPoint pt = pMsg->pt;
      ScreenToClient(&pt);
      return HitTest(pt);
}

void CMyListCtrl::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult) {
      m_clickitem = -1;
      int item = HitTestMessage(&col,NULL,&flag);
      if (item >= 0) {
            // handle double click (eg call dialog)
      }
      *pResult = 0;
}

exchanging two lines looses selection...

void CMyListCtrl::PreSubclassWindow() {
      CListCtrl::PreSubclassWindow();
      // .. other stuff
      ModifyStyle(0,LVS_SHOWSELALWAYS);
}

Hope this helps.

0
 

Author Comment

by:trouvain
ID: 1309389
Thsnx but you could be more specific
0

Featured Post

ScreenConnect 6.0 Free Trial

Check out the updates in one game-changing release, ScreenConnect 6.0, based on partner feedback. New features include a redesigned UI that improves session organization and overall user experience. See the enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
cat dog challenge 18 124
mixString challenge 36 121
Installing Microsoft R server on REDHAT or SUSE Linux 4 137
firstChar challenge 13 115
Introduction: Dialogs (2) modeless dialog and a worker thread.  Handling data shared between threads.  Recursive functions. Continuing from the tenth article about sudoku.   Last article we worked with a modal dialog to help maintain informat…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question