ClistBox - MeasureItem Message
Raja Segar -- rsz@pc.jaring.my Friday, October 04, 1996 Environment: Win95, Visual C++ 4.0 I just want to clarify some thing.. Correct me if i'm wrong:- a) If a CListBox has the style OwnerDrawFixed it is supposed to receive MeasureIitem message once. b) If a CListBox has the style OwnerDrawVariable it receives MeasureItem message for every entry in the list box. My problem is when the style is OwnerDrawFixed I can't get MeasureItem at all but when it's OwnerDrawVariable the MeassageItem handler get hit everytime a entry is added which is what is expected. Am i missing something here regarding the OwnerDrawFixed Style Please Help if Possible. Bye & thanks in advance. ( _ \/ __)(_ ) ) /\__ \ / /_ (_)\_)(___/(____)@pc.jaring.my
Gerry Sweeney -- gerry@hornbill.com Monday, October 07, 1996 Environment: Win95, Visual C++ 4.0 I have just found this in the MFC Help.. <---------- snip ----------> For self-drawing list boxes and combo boxes, you must override MeasureItem and DrawItem. You must specify the OWNERDRAWVARIABLE style in the dialog template (LBS_OWNERDRAWVARIABLE and CBS_OWNERDRAWVARIABLE respectively). The OWNERDRAWFIXED style will not work with self-drawing items since the fixed item height is determined before self-drawing controls are attached to the list box. (The Win 3.1 member functions CListBox::SetItemHeight and CComboBox::SetItemHeight can be used to get around this limitation.) <--------- snip -----------> Even with this documentation I find this hard to believe. In an app I have (log file viewer) written using MFC for NT 3.51 & 95. I have a view class which creates a CListBox with the following styles:- if(!m_listBox.Create( WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT, r, this, 5000)) In this app, 'OnMeasureItem' gets called once and once only when the list box is created. I have another application which is a 16bit app using VCv1.52 and this has a dialog box with three owner drawn listboxes. Again these have the OWNERDRAWFIXED style. See the Dilaog resource below:- IDD_HDMAILADDRDLG DIALOG DISCARDABLE 30, 40, 285, 154 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Maill Address Book" FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_SEARCH,5,12,114,12,ES_AUTOHSCROLL LISTBOX IDC_ADDRESSLIST,5,39,114,91,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Details",IDC_DETAILS,5,135,40,15 PUSHBUTTON "To ->",IDC_ADDTOLIST,124,38,36,13 PUSHBUTTON "Remove",IDC_REMOVETO,124,52,36,13 LISTBOX IDC_TOLIST,165,39,114,41,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Cc ->",IDC_ADDCCLIST,124,87,36,13 PUSHBUTTON "Remove",IDC_REMOVEFROM,124,101,36,13 LISTBOX IDC_CCLIST,165,88,114,41,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Cancel",IDCANCEL,198,135,40,15 DEFPUSHBUTTON "OK",IDOK,240,135,40,15 LTEXT "Mail Address List",IDC_STATIC,5,29,80,8 LTEXT "Search",IDC_STATIC,5,3,113,8 END In this instance the 'OnMeasureItem' member of the DialogBox class gets called three times. One for each list box as the dialog box is created. Armed with my debuger and working code I have proved this and I can only assume that the snipet of help file above is wrong. Hope this helps. Gerry Sweeney Hornbill Systems Ltd ----------------------------------------------------------------- >I just want to clarify some thing.. Correct me if i'm wrong:- > a) If a CListBox has the style OwnerDrawFixed it is supposed to receive > MeasureIitem message once. > b) If a CListBox has the style OwnerDrawVariable it receives > MeasureItem message for every entry in the list box. >My problem is when the style is OwnerDrawFixed I can't get MeasureItem >at all but when it's OwnerDrawVariable the MeassageItem handler get hit >everytime a entry is added which is what is expected. >Am i missing something here regarding the OwnerDrawFixed Style >Please Help if Possible. >Bye & thanks in advance. >( _ \/ __)(_ ) > ) /\__ \ / /_ > (_)\_)(___/(____)@pc.jaring.my
C. Zhang -- cz17309@goodnet.com Tuesday, October 08, 1996 Gerry Sweeney wrote: > > Environment: Win95, Visual C++ 4.0 > > I have just found this in the MFC Help.. > > <---------- snip ----------> > For self-drawing list boxes and combo boxes, you must override MeasureItem > and DrawItem. You must specify the OWNERDRAWVARIABLE style in the dialog > template (LBS_OWNERDRAWVARIABLE and CBS_OWNERDRAWVARIABLE respectively). The > OWNERDRAWFIXED style will not work with self-drawing items since the fixed > item height is determined before self-drawing controls are attached to the > list box. (The Win 3.1 member functions CListBox::SetItemHeight and > CComboBox::SetItemHeight can be used to get around this limitation.) > <--------- snip -----------> > > Even with this documentation I find this hard to believe. In an app I have > (log file viewer) written using MFC for NT 3.51 & 95. I have a view class > which creates a CListBox with the following styles:- > > if(!m_listBox.Create( > WS_CHILD | > WS_VISIBLE | > WS_VSCROLL | > LBS_NOTIFY | > LBS_OWNERDRAWFIXED | > LBS_NOINTEGRALHEIGHT, r, this, 5000)) > > In this app, 'OnMeasureItem' gets called once and once only when the list > box is created. > > I have another application which is a 16bit app using VCv1.52 and this has a > dialog box with three owner drawn listboxes. Again these have the > OWNERDRAWFIXED style. See the Dilaog resource below:- > > IDD_HDMAILADDRDLG DIALOG DISCARDABLE 30, 40, 285, 154 > STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU > CAPTION "Maill Address Book" > FONT 8, "MS Sans Serif" > BEGIN > EDITTEXT IDC_SEARCH,5,12,114,12,ES_AUTOHSCROLL > LISTBOX IDC_ADDRESSLIST,5,39,114,91,LBS_SORT | > LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | > LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP > PUSHBUTTON "Details",IDC_DETAILS,5,135,40,15 > PUSHBUTTON "To ->",IDC_ADDTOLIST,124,38,36,13 > PUSHBUTTON "Remove",IDC_REMOVETO,124,52,36,13 > LISTBOX IDC_TOLIST,165,39,114,41,LBS_SORT | LBS_OWNERDRAWFIXED | > > LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | > WS_TABSTOP > PUSHBUTTON "Cc ->",IDC_ADDCCLIST,124,87,36,13 > PUSHBUTTON "Remove",IDC_REMOVEFROM,124,101,36,13 > LISTBOX IDC_CCLIST,165,88,114,41,LBS_SORT | LBS_OWNERDRAWFIXED | > > LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | > WS_TABSTOP > PUSHBUTTON "Cancel",IDCANCEL,198,135,40,15 > DEFPUSHBUTTON "OK",IDOK,240,135,40,15 > LTEXT "Mail Address List",IDC_STATIC,5,29,80,8 > LTEXT "Search",IDC_STATIC,5,3,113,8 > END > > In this instance the 'OnMeasureItem' member of the DialogBox class gets > called three times. One for each list box as the dialog box is created. > > Armed with my debuger and working code I have proved this and I can only > assume that the snipet of help file above is wrong. > > Hope this helps. > > Gerry Sweeney > Hornbill Systems Ltd There are two places to implement these two functions, DrawItem and MeasureItem. One is in the Dialog which is the parent window of the control and another is in the control itself. The paragraph you quoted refers to the second situation only. > ----------------------------------------------------------------- > >I just want to clarify some thing.. Correct me if i'm wrong:- > > a) If a CListBox has the style OwnerDrawFixed it is supposed to receive > > MeasureIitem message once. > > b) If a CListBox has the style OwnerDrawVariable it receives > > MeasureItem message for every entry in the list box. > > >My problem is when the style is OwnerDrawFixed I can't get MeasureItem > >at all but when it's OwnerDrawVariable the MeassageItem handler get hit > >everytime a entry is added which is what is expected. > > >Am i missing something here regarding the OwnerDrawFixed Style > >Please Help if Possible. > >Bye & thanks in advance. > >( _ \/ __)(_ ) > > ) /\__ \ / /_ > > (_)\_)(___/(____)@pc.jaring.my
Gabriel Parlea-Visalon -- Gabriel@derivs.demon.co.uk Thursday, October 10, 1996 In your message dated Tuesday 8, October 1996 you wrote : > > <---------- snip ----------> > > For self-drawing list boxes and combo boxes, you must override MeasureItem > > and DrawItem. You must specify the OWNERDRAWVARIABLE style in the dialog > > template (LBS_OWNERDRAWVARIABLE and CBS_OWNERDRAWVARIABLE respectively). The > > OWNERDRAWFIXED style will not work with self-drawing items since the fixed > > item height is determined before self-drawing controls are attached to the > > list box. (The Win 3.1 member functions CListBox::SetItemHeight and > > CComboBox::SetItemHeight can be used to get around this limitation.) > > <--------- snip -----------> > There are two places to implement these two functions, DrawItem and > MeasureItem. One is in the Dialog which is the parent window of the > control and another is in the control itself. > > The paragraph you quoted refers to the second situation only. > This is simply wrong. DrawItem() and MeasureItem() are two virtual member functions of CListBox and CComboBox. They get called only if the control (listbox or combobox) is owner-draw. If you don't overload them you get the default implementation which simply asserts FALSE. Read carefully the initial poster's quote from the documentation. When you encounter the word must, well, you must follow it. By all means, if you can support your statement with some code or a quote from the documentation, I'm sure everyone would only be thrilled to see it. I hope this helps you, Gabriel -- Gabriel Parlea-Visalon Software Engineer Derivative Trading Systems gabriel@derivs.demon.co.uk
| Вернуться в корень Архива |