hur.cn - 华软网

 热门搜索

关于CListBox和CButton

  作者:未知    来源:网络    更新时间:2009/7/2
是这样的,我要将一个CListBox上的图片投影到一个CButton上。 其中我是在资源编辑器里面加上所有的控件的。
那个CButton是用GroupBox加的,派生关系为:

C++">
class CButtonShow : public CButton

//................
class CIconListBox : public CListBox


然后再在Dialog里面加CButtonShow和CIconListBox的变量,这些变量对应资源编辑器里面所加的CListBox和GroupBox控件

当我点击ListBox上的icon时,这个icon会投影到GroupBox上。实现是在CButtonShow 的OnPaint里面画图。

这个实现了。但是有两个问题是:

1 我点击ClistBox时,所选的那个选中的条条会比Icon小,我要怎样才能使选中时变蓝的条条与icon一样大?我认为与这个有关,但我改了也不见有变化:
C++">
void CIconListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO:  Add your code to determine the size of specified item
   lpMeasureItemStruct->itemHeight = 36;
}
//请教各位我要怎样才能使选中时变蓝的条条与icon一样大?



 2 由于我那个CButtonShow在资源编辑器里面是用GroupBox代替的,在GroupBox最外围的一个框是可以写标题的,我写了"Detail",但是派生后得到的结果是没有标题的,我写SetWindowText也没有。我要怎样才能做到有一个与GroupBox一样的框和标题。 

另外我觉得我所派生的东西有点问题,不知是不是,所以写上来让大家帮我。我觉得有资源ID的才对。但是没有,大家看一下我的类写得对不对。

C++">
class CButtonShow : public CButton
{
DECLARE_DYNAMIC(CButtonShow)

public:
CButtonShow();
virtual ~CButtonShow();
    void SetListBox(CIconListBox* box);
protected:
CIconListBox* listbox;
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};



class CIconListBox : public CListBox
{
DECLARE_DYNAMIC(CIconListBox)

public:
CIconListBox();
virtual ~CIconListBox();
bool AddIcon(HICON hIcon);
    //void ProjectImage(CDC* pDC, LPRECT pRect, COLORREF clrBackColor);
protected:
DECLARE_MESSAGE_MAP()
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
public:
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};



   谢谢大家帮忙,欢迎帮顶! 谢谢!!!
---华软 网友回答---
帮顶,C区的同志。
---华软网友回复---
1.
比ICon小是怎么个小法?你这里只改了高度,是不是应该改一下宽度呢?
void CIconListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    // TODO:  Add your code to determine the size of specified item
   lpMeasureItemStruct->itemHeight = 36;
   lpMeasureItemStruct->itemWidth = 100;
}
2.
你对控件重绘了,除非你在OnPaint函数里实现了画边框,和输出标题的操作,否则是不会有标题和边框的。

PS:你写的类貌似没有问题,你应该贴OnPaint的实现代码。还有,为什么见了一个CButton的子类却对应到groupbox控件了?感觉很别扭。如果只是显示ICON的话,直接用CStatic来继承多好。
---华软网友回复---
帮你顶一下
---华软网友回复---
楼主最好把画的部分的代码帖出来。
---华软网友回复---
  class="deleted_message"> 该回复于2009-07-14 09:14:03被版主删除
---华软网友回复---
背景色也需要自己重画

void CXXXListBox::DrawItem(LPDRAWITEMSTRUCT pDIStruct)
{
CDC* pDC = CDC::FromHandle(pDIStruct->hDC);
BOOL bIsSelected = FALSE;
BOOL bIsFocused = FALSE;
BOOL bIsDisabled = FALSE;
COLORREF crSelected = RGB(100,98,101);//GetSysColor(COLOR_HIGHLIGHT);

bIsSelected = (pDIStruct->itemState & ODS_SELECTED);
bIsFocused = (pDIStruct->itemState & ODS_FOCUS);
bIsDisabled = ((pDIStruct->itemState & ODS_DISABLED));

CRect rcItem = pDIStruct->rcItem;

pDC->SetBkMode(TRANSPARENT);

// Draw background
        if (bIsSelected)
        { 
              pDC->SetBkColor(crSelected);
      pDC->FillSolidRect(rcItem->left, rcItem->top, rcItem->Width(), rcItem->Height(), crSelected);
        }
        ......

} // End of DrawItem 

---华软网友回复---

mark
---华软网友回复---
引用 1 楼 hairetz 的回复:
帮顶,C区的同志。


谢谢! 被老朋友发现了。
---华软网友回复---
引用 2 楼 qingfeng5211 的回复:
PS:你写的类貌似没有问题,你应该贴OnPaint的实现代码。还有,为什么见了一个CButton的子类却对应到groupbox控件了?感觉很别扭。如果只是显示ICON的话,直接用CStatic来继承多好。


CStatic当然也可以,不过只是我想改一个程序的,别人的程序里面用的是GroupBox,我就直接用GroupBox了,不过在我印象中GroupBox是一个Button的。
---华软网友回复---
MARK
---华软网友回复---
引用 4 楼 fengrx 的回复:
楼主最好把画的部分的代码帖出来。


晚上回去再补发,现在在外,没有带代码。
---华软网友回复---
帮顶一个
---华软网友回复---
引用 2 楼 qingfeng5211 的回复:
1. 
比ICon小是怎么个小法?你这里只改了高度,是不是应该改一下宽度呢? 
void CIconListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 

    // TODO:  Add your code to determine the size of specified item 
  lpMeasureItemStruct->itemHeight = 36; 
  lpMeasureItemStruct->itemWidth = 100; 

2. 
你对控件重绘了,除非你在OnPaint函数里实现了画边框,和输出标题的操作,否则是不会有标题…


up
---华软网友回复---

void CButtonShow::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CButton::OnPaint() for painting messages
CDC memDc;
memDc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,32,32);   // the last two parameter is width and height
CBitmap *pOldBitmap=memDc.SelectObject(&bitmap);
CBrush *pBrush=new CBrush(::GetSysColor (COLOR_3DFACE));
memDc.FillRect(CRect(0,0,32,32),pBrush);
delete pBrush;

int nIndex=listbox->GetCurSel();

if(nIndex!=LB_ERR)
{
memDc.DrawIcon(0,0,(HICON)(listbox->GetItemData(nIndex)));
}
    CRect rect;
GetClientRect(&rect);

dc.StretchBlt(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,&memDc,0,0,32,32,SRCCOPY);
memDc.SelectObject(pOldBitmap);
}


---华软网友回复---
引用 2 楼 qingfeng5211 的回复:
1.
比ICon小是怎么个小法?你这里只改了高度,是不是应该改一下宽度呢?
void CIconListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO:  Add your code to determine the size of specified item
lpMeasureItemStruct->itemHeight = 36;
lpMeasureItemStruct->itemWidth = 100;
}
2.
你对控件重绘了,除非你在OnPaint函数里实现了画边框,和输出标题的操作,否则是不会有标题和边框的。

PS:…


高度和宽度都改了,不过发现程序里面什么都没有变到啊。 
---华软网友回复---
引用 6 楼 Ryanwen 的回复:
背景色也需要自己重画
C/C++ codevoidCXXXListBox::DrawItem(LPDRAWITEMSTRUCT pDIStruct)
{
    CDC*pDC=CDC::FromHandle(pDIStruct->hDC);
    BOOL            bIsSelected=FALSE;
    BOOL            bIsFocused=FALSE;
    BOOL            bIsDisabled=FALSE;
    COLORREF        crSelected=RGB(100,98,101);//GetSysColor(COLOR_HIGHLIGHT);bIsSelected=(pDIStruct->itemState&ODS_SELECTED);
    bIsFocused=(pDIStr…


我的是这样的:

void CIconListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO:  Add your code to draw the specified item
CDC dc;
dc.Attach (lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
int nIndex = lpDrawItemStruct->itemID;

CBrush* pBrush = new CBrush;
pBrush->CreateSolidBrush (::GetSysColor ((lpDrawItemStruct->itemState &
ODS_SELECTED) ? COLOR_HIGHLIGHT : COLOR_WINDOW));
dc.FillRect (rect, pBrush);
delete pBrush;

if (lpDrawItemStruct->itemState & ODS_FOCUS)
dc.DrawFocusRect (rect);

if (nIndex != (UINT) -1)
dc.DrawIcon (rect.left + 4, rect.top + 2,
(HICON) GetItemData (nIndex));

dc.Detach ();
}


---华软网友回复---
学习了
---华软网友回复---
引用 15 楼 HelloDan 的回复:
引用 2 楼 qingfeng5211 的回复:
1.
比ICon小是怎么个小法?你这里只改了高度,是不是应该改一下宽度呢?
void CIconListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO:  Add your code to determine the size of specified item
lpMeasureItemStruct->itemHeight = 36;
lpMeasureItemStruct->itemWidth = 100;
}
2.
你对控件重绘了,除非你在OnPaint函数里实现了画边框,和输出标题的操作,否…


我觉得是不是应该有一个可以设置的属性让我们改的。不知是不是
---华软网友回复---
好,学习到了,谢谢      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。