15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


CColorComboBox

Mike -- MREAMS@cerner.com
Friday, December 06, 1996

Environment:  VC 4.0,  Win95

I am trying to create a custom CComboBox that will show: 
text,forecolor, and backcolor in both the list portion and the edit 
portion.  So far I have run into one problem and one potential 
problem.

Problem 1:  When I use the CBS_DROPDOWN property the list works fine, 
my items show up with the correct text and colors, however if I use 
the CBS_DROPDOWNLIST (the style that I want to use) I blow up in the 
DrawItem Function.  The problem is that the lpDIS->itemData is nowhere 
near the value that I pass it and consequently the pointer I'm trying 
to cast to it is invalid.  Again, this only happens when the 
CBS_DROPDOWNLIST style is in effect.  (I have tried it with both 
CBS_HASSTRINGS on and off)


int CClrComboBox::AddColorString(LPCTSTR lpszString,COLORREF 
bcr,COLORREF fcr)
{
	CCB_DATA *data = new CCB_DATA;
	data->lpszString = lpszString;
	data->bcr = bcr;
	data->fcr = fcr;

	return AddString((LPCTSTR)data);
}

void CClrComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	COLORREF cr;
	CString text;
	CCB_DATA *tmpItem;

	tmpItem = (CCB_DATA*)lpDIS->itemData;
	cr = tmpItem->bcr;
...	
		

Problem 2:  I am wondering what is involved in custom painting the 
Edit portion of the ComboBox.  I had assumed that the dropdown button 
was non-client but when I overrode OnPaint() the whole edit box 
disappeared.  Do I need to repaint the arrow and handle the dropdown 
in OnClick or is there an easier way to customize the Edit portion?

Thanks,

Michael P. Reams (Mike)
Cerner Corporation
2900 Rockcreek Parkway
Kansas City, MO  64117-2551
(816) 472-1024  Ext. 2138
(816) 221-1024 Fax
mreams@cerner.com
http://www.cerner.com  "To Automate the Process of Managing Health"



Paul.B.Folbrecht@JCI.Com
Wednesday, December 11, 1996


     

#1- Sometimes you get -1 for lpDIS->itemData.  You need to check for that.
#2- No, you don't need to repaint the arrow, or anything NC.  The following code
does what you want, I believe:

void CGXColorCombo::DrawItem( LPDRAWITEMSTRUCT pDIS )
{
    CDC*       pDC   = CDC::FromHandle( pDIS->hDC );
    CRect      oRect = pDIS->rcItem;
    COLORREF   oClr  = (COLORREF) pDIS->itemData;

    // Draw a colored rect.
    if ( (int) pDIS->itemID != -1 )
    {
        short  nSave = pDC->SaveDC();
        CPen   oPen;
        CBrush oBrush;

        oPen.CreatePen( PS_SOLID, 1, oClr );
        oBrush.CreateSolidBrush( oClr );
        pDC->SelectObject( &oPen );
        pDC->SelectObject( &oBrush );
        pDC->Rectangle( oRect );
        pDC->RestoreDC( nSave );
    }
    
        if ( ( pDIS->itemState & ODS_SELECTED ) &&
                 ( pDIS->itemAction & ( ODA_SELECT | ODA_DRAWENTIRE ) ) )
        {
                // Item has been selected - hilite frame.
                COLORREF crHilite = RGB( 0, 0, 0 );
                CBrush   oBrush( crHilite );
                
        pDC->FrameRect( oRect, &oBrush );
        }

        if ( !( pDIS->itemState & ODS_SELECTED ) &&
                  ( pDIS->itemAction & ODA_SELECT ) )
        {
                // Item has been de-selected- remove frame.
                COLORREF crHilite = RGB( 255, 255, 255 );
                CBrush   oBrush( crHilite );
                
        pDC->FrameRect( oRect, &oBrush );
        }
}

______________________________ Reply Separator _________________________________
Subject: CColorComboBox
Author:  MREAMS@cerner.com at Mailhub
Date:    12/9/96 5:26 PM


Environment:  VC 4.0,  Win95
     
I am trying to create a custom CComboBox that will show: 
text,forecolor, and backcolor in both the list portion and the edit 
portion.  So far I have run into one problem and one potential 
problem.
     
Problem 1:  When I use the CBS_DROPDOWN property the list works fine, 
my items show up with the correct text and colors, however if I use 
the CBS_DROPDOWNLIST (the style that I want to use) I blow up in the 
DrawItem Function.  The problem is that the lpDIS->itemData is nowhere 
near the value that I pass it and consequently the pointer I'm trying 
to cast to it is invalid.  Again, this only happens when the 
CBS_DROPDOWNLIST style is in effect.  (I have tried it with both 
CBS_HASSTRINGS on and off)
     
     
int CClrComboBox::AddColorString(LPCTSTR lpszString,COLORREF 
bcr,COLORREF fcr)
{
        CCB_DATA *data = new CCB_DATA;
        data->lpszString = lpszString;
        data->bcr = bcr;
        data->fcr = fcr;
     
        return AddString((LPCTSTR)data);
}
     
void CClrComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
{
        CDC* pDC = CDC::FromHandle(lpDIS->hDC); 
        COLORREF cr;
        CString text;
        CCB_DATA *tmpItem;
     
        tmpItem = (CCB_DATA*)lpDIS->itemData; 
        cr = tmpItem->bcr;
...
     
     
Problem 2:  I am wondering what is involved in custom painting the 
Edit portion of the ComboBox.  I had assumed that the dropdown button 
was non-client but when I overrode OnPaint() the whole edit box 
disappeared.  Do I need to repaint the arrow and handle the dropdown 
in OnClick or is there an easier way to customize the Edit portion?
     
Thanks,
     
Michael P. Reams (Mike)
Cerner Corporation
2900 Rockcreek Parkway
Kansas City, MO  64117-2551
(816) 472-1024  Ext. 2138
(816) 221-1024 Fax
mreams@cerner.com
http://www.cerner.com  "To Automate the Process of Managing Health"




| Вернуться в корень Архива |