Solved

Checkboxes in CListCtrl via StateImages

Posted on 1997-11-05
3
435 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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Suggested Solutions

Introduction: Database storage, where is the exe actually on the disc? Playing a game selected randomly (how to generate random numbers).  Error trapping with try..catch to help the code run even if something goes wrong. Continuing from the seve…
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…
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.
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

735 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