Scrolling Lists of Edit controls
Ross Cutler -- rgc@cs.umd.edu Monday, August 19, 1996 Environment: Windows NT 4.0, Visual C++ 4.2 I need to create a control that looks like a scrollable list of CEdit controls (along with labels) in a dialog box. The number of edit controls and the label contents need to be programable. The number of rows will be almost always be small (< 8). Does anyone have a suggestion of a way to do this? Thanks. Ross.
Kostya Sebov -- sebov@is.kiev.ua Friday, August 23, 1996 [Mini-digest: 8 responses] > Environment: Windows NT 4.0, Visual C++ 4.2 > > I need to create a control that looks like a scrollable list of CEdit > controls (along with labels) in a dialog box. The number of edit controls > and the label contents need to be programable. The number of rows will > be almost always be small (< 8). > > Does anyone have a suggestion of a way to do this? Thanks. Ross. > If the view class is Ok then you may create CFormView-derived class based on dialog template consisting of max number of rows (8?). Then in OnInitialUpdate or OnUpdate (whatever is more appropriate) show/hide extra labels/edits and SetScrollSizes to adjust the scrolling range. If you really need control you can use CListCtrl whith in-place label editing enabled if you can survive with edit fields FOLLOWED by the labels. Or implement two-columned listbox (using LVS_USETABSTOPS style or something alike) and roll your own in-place editing (there must be an article on the MSDN devoted to such in-place editing -- didn't check, just heard). --- Kostya Sebov. ---------------------------------------------------------------------------- Tel: (38 044) 266-6387 | Fax: (38 044) 266-6195 | E-mail: sebov@is.kiev.ua -----From: John SimmonsHow about building a dialog template that has (for the sake of example) 5 static text controls in a column, 5 edit controls in a colum , and then a scrollbar. Next, build a linked list of structs that hold descriptions and edit field contents, and use the scrollbar to update the fields in the dialog. 2nd Idea - put a listbox on the dialog with an edit control beside it. Fill the list box with the descriptions and update the edit control based on which description is selected. /=========================================================\ | John Simmons (Redneck Techno-Biker) | | jms@connectnet.com | | Home Page | | www2.connectnet.com/users/jms/ | |---------------------------------------------------------| | ViewPlan, Inc. home page (my employer) | | www.viewplan.com/index.html | |---------------------------------------------------------| | IGN #12 American Eagle Motorsports Zerex Ford | | Teammates - Steve Stevens (#13 Hooters Ford and | | 1995 IGN Points Champ) | | Pat Campbell (#14 Dr. Pepper Ford) | | American Eagle Motorsports Team Page | | www2.connectnet.com/users/jms/ignteam | | Hawaii Multi-Player Nickname: AEMwest | |---------------------------------------------------------| | Competitor - Longest Signature File On The Net | \=========================================================/ -----From: Paul Roub I'm doing something similar -- one scrollable pane in a splitter window, which holds different controls at different times, depending on tree selections in another window. Again, the number and types vary dynamically with the data. Anyway, I just derived from CScrollView and set about creating and destroying the controls on the heap as needed. It's working very well for me. -paul -- // Paul Roub, Galacticomm Technical Operations // proub@gcomm.com // (954)583-5990 -----From: Brian_Dormer@ftdetrck-ccmail.army.mil There was an article a few months ago in Microsoft Systems Journal that did exactly this. Their web site is at : http://www.mfi.com You can download the source to their class there. You might also be able to order a back-issue if you want the explaination - but once you have the source, you should be all set. bd -----From: Steve Mark FWIW I did this but not using a control. I dynamically create edit controls and put them on a CFormView-derived class. Each control has the same ID (e.g. ID_EDIT_BOX) and I keep an array matching CWnd*'s to identifying information about each control. When the user does something with a control I do a table lookup into the array and then I know which control the user is accessing. In fact, it is database-table-based and can handle several different kind of controls, allowing for runtime and modular changes of the screen layout. --------------------------------------------------------------------- | Steven Mark | On-The-Mark Systems | Custom Software | | Tel: 510.648.9514 | 3494 Camino Tassajara Rd. | Analysis | | Fax: 510.648.9507 | Suite 239 | Design | | http://www.otms.com | Danville, CA 94506 | Implementation | --------------------------------------------------------------------- -----From: "Greg Tighe" If you have a limit on the number of edit controls you will need you can: 1) Use the ResourceView to create a dialog with the maximum number of edit controls with labels (be sure to give the static text controls unique ID if you want to programmatically set the label text.) Set this dialog's style to 'Child' and enable the vertical and/or scrollbar options. 2) You can vary the number of edit controls in use by showing the ones you want and hiding the ones you don't 3) You will need to handle WM_VSCROLL/WM_HSCROLL messages to scroll the controls in your dialog. ScrollWindow() works well for this. To use this dialog as a control in another dialog: 1) Add a member variable of type CMyScrollingEditControlDlgControl to your dialog. 2) In the parent dialog's OnInitDialog() method you will need to call CMyScrollingEditControlDlgControl::Create(). 3) Move/size the control to the desired location within the parent dialog. 4) You may need to reflect some WM_COMMAND messages from the control back to the parent dialog (especially IDOK and IDCANCEL messages.) If you allow a totally arbitrary number of edit controls within the scrolling dialog control then you will need to dynamically Create() CStatic and CEdit controls within your scrolling dialog. Hope this helps some. -Greg Tighe Applied Intelligent Systems, Inc. Ann Arbor, MI gdt@aisinc.com -----From: ppbillc@srv2.sj.ablecom.net If you make the listbox the parent of the CEdit's during the Create phase. Then add a numer of strings to the listbox corresponding to each line of the text in the edit you create. The edits will 'magically' appear in the listbox. Bill -----From: "Ramos-Bonilla, Ibsen" Hi Ross, If I what you're asking is what I did just a couple of months ago, then you're in luck, if not sorry. What I did is the following: STEP #1: Create your dialog box (CMyDialog) and add a picture box where you want your scrollable list to appear and give it and ID (ID_MY_PIC). Here is my header file: class CMyDialog : public CDialog { // Construction public: CMyDialog(CWnd* pParent = NULL); // standard constructor CRect m_rectFrame, m_rectView; // (m_rectFrame = picture box, m_rectView = CFormView); .............. }; Here is my implementation file: #include "stdafx.h" #include "MyApp.h" #include "MyDialog.h" #include "MyScrollList.h" BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); // get a pointer to a new frame and view for the scrollable list CFrameWnd* pScrollListFrame = new CFrameWnd; CMyScrollList* pScrollListView = new CMyScrollList; // set the frame coordinates CWnd* pScrollListWnd = GetDlgItem(IDC_MY_PIC); pScrollListWnd->GetWindowRect(&m_rectFrame); ScreenToClient(&m_rectFrame); // create the scroll list frame pScrollListFrame->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, m_rectFrame, this, NULL, 0, NULL); // set the view coordinates m_rectView.SetRect(0, 0, m_rectFrame.right - 24, m_rectFrame.bottom - 108); // (set these coordinates depending on the size of your scroll list form). // create the scroll list view pCriteriaView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP, m_rectView, pScrollListFrame, IDD_SCROLL_LIST, NULL); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } STEP #2: Create a CFormView (IDD_SCROLL_LIST) that contains all of your CEdit controls and labels. Make it's Style = Child, no title. Here is my header file: class CMyScrollList : public CFormView { friend class CMyDialog; //<-very important !!!!! protected: CMyScrollList(); // protected constructor used by dynamic creation DECLARE_DYNCREATE(CMyScrollList) // Form Data public: //{{AFX_DATA(CMyScrollList) enum { IDD = IDD_SCROLL_LIST}; // NOTE: the ClassWizard will add data members here //}}AFX_DATA ................ }; With this setup, you can continuously, keep on adding new controls to the CFormView, without having to change your Dialog box. Well, let me know if that helped in any way..................!!!!!! Have fun.....
| Вернуться в корень Архива |