CListCtrl Question
Gary_Shank@dublin.sterling.com
Saturday, April 01, 1995
I'm trying to implement a simple "report-type" CListCtrl inside a
CScrollView for a 32bit MDI application using MSVC 2.1 and NT 3.51.
So far, I've got the column headers the way I want and I'm getting
data to show up in the list items....but.....I'm not getting a full
selection highlight bar across all columns and I'm only able to select
in the first column. And how do I get double-click events from the
mouse when positioned on an item line? I've looked at the ListView
sample on the developer CD (which is how I got to where I'm at now)
but I can't find any other examples.
My CListCtrl class was created with the following:
WS_VISIBLE | WS_CHILD | LVS_NOSORTHEADER | LVS_REPORT | LVS_SINGLESEL;
My column mask is:
LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
My item mask is:
LVIF_STATE;
The functionality I'm looking for is just like a normal listbox except
for the resizable columns/headers.
Gary
Hector Fabio RESTREPO -- restrepo@di.epfl.ch
Friday, September 13, 1996
Environment: VC++ 4.0, Windows NT 3.51
I am writing an application where one of the windows displays the
information contained in a memory. The information on the window
looks like :
Address LB HB Data
----------------------------------
0000 0 0 0x2345
0001 1 1 0x1234
0002 0 1 0xAD12
and so ...
To do it, I am using a CListCtrl in report view and it works ok, but
now I need to modify the SubItems.
How can I modify a subItem when the user double-clicks on it?
By modify I mean the user be able to edit the SubItem text in place.
If it isn't possible, I think I must use a dialog.
thanks,
---
Hector Fabio Restrepo
Laboratoire de Systemes Logiques
Ecole Polytechnique Federal de Laussane - Suisse
e-mail: restrepo@lslsun.epfl.ch
murugesh@mail.cswl.com
Sunday, September 15, 1996
Hai,
There are two options
1. Its little bit difficult to achieve this through listcontrol. It is
easy to do by poping up a dialog to edit the content.
2. Instead of using the listview control u can use the grid control.
To edit the content u can create a edit box on the fly over the
particular cell or u can popup a dialog to edit the content.
Regards
Murugesh SS
Murugesh@cswl.com
______________________________ Reply Separator _________________________________
Subject: ClistCtrl Question
Author: mfc-l@netcom.com at internet
Date: 9/14/96 11:11 PM
Environment: VC++ 4.0, Windows NT 3.51
I am writing an application where one of the windows displays the
information contained in a memory. The information on the window
looks like :
Address LB HB Data
----------------------------------
0000 0 0 0x2345
0001 1 1 0x1234
0002 0 1 0xAD12
and so ...
To do it, I am using a CListCtrl in report view and it works ok, but
now I need to modify the SubItems.
How can I modify a subItem when the user double-clicks on it?
By modify I mean the user be able to edit the SubItem text in place.
If it isn't possible, I think I must use a dialog.
thanks,
---
Hector Fabio Restrepo
Laboratoire de Systemes Logiques
Ecole Polytechnique Federal de Laussane - Suisse
e-mail: restrepo@lslsun.epfl.ch
LeRoy Baxter -- lbaxter@transport.com
Saturday, September 14, 1996
I did what you want to do using a regular, owner-draw listbox
and instantiating an edit box for the fields (sub items). When
the focus first moves to the listbox, you unhide the edit control,
fill it with the text of the first field and move it so it covers the
field. As the user tabs to the next field, you save any edits,
load the text for the next field, and move the edit control - etc.
you have to handle up arrows, down arrows, and tabbing
from the listbox.
Short of buying a custom grid control, this is about the only
way to accomplish what you are asking.
Hector Fabio RESTREPO[SMTP:restrepo@di.epfl.ch] wrote:
>Environment: VC++ 4.0, Windows NT 3.51
>
>I am writing an application where one of the windows displays the
>information contained in a memory. The information on the window
>looks like :
>
>Address LB HB Data
>----------------------------------
>0000 0 0 0x2345
>0001 1 1 0x1234
>0002 0 1 0xAD12
>and so ...
>
>
>To do it, I am using a CListCtrl in report view and it works ok, but
>now I need to modify the SubItems.
>
>How can I modify a subItem when the user double-clicks on it?
>
>By modify I mean the user be able to edit the SubItem text in place.
>If it isn't possible, I think I must use a dialog.
>
>thanks,
>
>---
>Hector Fabio Restrepo
>Laboratoire de Systemes Logiques
>Ecole Polytechnique Federal de Laussane - Suisse
>e-mail: restrepo@lslsun.epfl.ch
>
GoroKhM1 -- gorokhm1@SMTP.ATG-NET.COM
Monday, September 16, 1996
[Mini-digest: 4 responses]
That question was recently discussed. You can't edit directly a subitem.
The only way is to create edit box and place it precisely on a place
where you want to change data. You have to care about List sizing,
scrolling, etc.
Mark
______________________________ Reply Separator _________________________________
Subject: ClistCtrl Question
Author: mfc-l@netcom.com at INTERNET
Date: 9/14/96 3:39 PM
Environment: VC++ 4.0, Windows NT 3.51
I am writing an application where one of the windows displays the
information contained in a memory. The information on the window
looks like :
Address LB HB Data
----------------------------------
0000 0 0 0x2345
0001 1 1 0x1234
0002 0 1 0xAD12
and so ...
To do it, I am using a CListCtrl in report view and it works ok, but
now I need to modify the SubItems.
How can I modify a subItem when the user double-clicks on it?
By modify I mean the user be able to edit the SubItem text in place.
If it isn't possible, I think I must use a dialog.
thanks,
---
Hector Fabio Restrepo
Laboratoire de Systemes Logiques
Ecole Polytechnique Federal de Laussane - Suisse
e-mail: restrepo@lslsun.epfl.ch
-----From: Sumit Chawla
Environment: VC++ 4.0, Windows NT 3.51
Modifying a subitem is not really diificult but it ia a bit tedious.
Here's what I do (this may not be the best way to do it though):
1. Create an edit control as a member of CListCtrl derived class and
set its font to match that of the list control. Do not show the
edit control initially.
2. OnLButtonDblClk calculate the rect of the subitem and use this rect
to display the edit control. Set the text of the edit control using
the subitem text.
3. Use the EN_KILLFOUCUS notification from the edit control to update
the changed text.
Hope this helps
Sumit Chawla
schawla@csci.csc.com
-----From: Roger Onslow/Newcastle/Computer Systems Australia/AU
Hector,
Basic method would be as follows:
You can detect a click in the list control.
You then need to determine which column it is in
(need to loop thru columns and add up column widths and compare to x-coord of
click)
Also need to determin which column it is in
(do hit test on copy of click point with x set to 1 so it is in label area,
then can find item)
Determine the rect that corresponds to the row/column cell
Create an edit box and place it over the cell
Copy from sub-item in the cell to the edit control
Let user edit the edit control
Copy value from edit into sub-item in the cell
Alternative:
Put edit fields for the sub-items on your dialog/window
As you move thru the list control, copy the subitem values for the current row
into the edit boxes
If the user changes an edit box, copy it into the sub-item for the current row.
Perhaps add a "Modify" button to the dialog/window to apply changes
Can also use this to provide for adding new values.
Yet another way:
Detect double click (or right click) on a row.
Pop-up a dialog that allows you to edit all values for the row
When dialgo returns IDOK, copy result back into the list control
Roger Onslow
-----From: Dave_Rabbers@Quinton-Eng.CCMAIL.CompuServe.COM
I assume you are using report mode.
The CListCtrl only supports in-place editing the left most column. It is fairly
easy, but a bit involved, to in-place edit any column.
I'm giving you the following steps from memory, so if I've left anything out, I
apologize. It will probably be obvious to you when you do this.
First you have to capture the double-click mouse message.
Then determine which row and column was clicked. There are methods on CListCtrl
to do this.
Next, determine the size of the item you wish to edit, or perhaps the size you
wish to allow editing. Also determine the upper left corner of the element you
want to edit (take a look at the current top-most element number in your
calculations). This is the most involved step.
Construct your own edit box at this location, of the size you determine (make
sure you allow for an edit box bigger than the text area, since edit boxes have
borders).
Initialize the edit box with the current data item value (if desired) from the
CListCtrl.
Capture the enter key stroke on the edit box. I think you have to do this with
a WM_KEYDOWN or WM_KEYUP.
Update the CListCtrl data item from the CEdit value.
A bit messy and involved. Sure would be nice if MS did this for you.
Other alternatives:
Look at the grid control that ships with MFC in the component gallery.
Look at grid controls from other companies. There are several that are more
like a VB grid control, more like what you want.
But it can be done in VC++.
Norman C. Byers -- nbyers@intxxnet.com
Wednesday, September 18, 1996
Concerning in-place editing with a CListCtrl. Other than
using a 3rd party spreadsheet or grid control you can use
the CTreeCtrl to create a simple single or dual column list
with in-place editing. I'm not altogether sure it is less
work than overlaying the edit control as the CTreeCtrl
carries its own burden of complexity.
--
II*
| Вернуться в корень Архива
|