Combo box设置Owner draw属性后,AddString出错

fescort 2011-07-12 10:49:10
Combo box属性设置如下:
Owner draw:variable
Sort:FALSE
Type:Drop List

然后在对话框的初始化函数中添加Item,程序运行到AddString处就出错,
能帮忙解释一下为什么吗?
怎样解决?
如果不能这样加项,应该怎样用?

代码如下:

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化
for(int i=0;i<10;i++)
{
m_comboTest.AddString("1");
}
m_comboTest.SetCurSel(0);

return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
...全文
384 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
doc110 2011-08-24
  • 打赏
  • 举报
回复
学习了哦。
快乐鹦鹉 2011-07-13
  • 打赏
  • 举报
回复
可能variable时,需要重载那个OnMeasureItem才行,Fixed的话不需要
fescort 2011-07-13
  • 打赏
  • 举报
回复
把属性改为Fixed就不报错了,可以实现自绘了
没闹明白到底是怎么回事?
谢谢大家的帮忙!
sharptiger123 2011-07-12
  • 打赏
  • 举报
回复
//用这个试试 CCombox* pCombox=(CCombox*)GetDlgItem(Ccombox的ID);

CComboBox*pCombox=(CComboBox*)GetDlgItem(IDC_COMBOX);
for(int i=0;i<10;i++)
{
pCombox->AddString("1");
}
pCombox->SetCurSel(0);


.
Eleven 2011-07-12
  • 打赏
  • 举报
回复
有重写这些虚函数吗?
// Derived class is responsible for implementing these handlers
// for owner/self draw controls (except for the optional DeleteItem)
void CComboBox::DrawItem(LPDRAWITEMSTRUCT)
{ ASSERT(FALSE); }
void CComboBox::MeasureItem(LPMEASUREITEMSTRUCT)
{ ASSERT(FALSE); }
int CComboBox::CompareItem(LPCOMPAREITEMSTRUCT)
{ ASSERT(FALSE); return 0; }
void CComboBox::DeleteItem(LPDELETEITEMSTRUCT)
{ /* default to nothing */ }
fescort 2011-07-12
  • 打赏
  • 举报
回复


class CLegendDialog : public CDialog
{
DECLARE_DYNAMIC(CLegendDialog)

public:
CLegendDialog(CWnd* pParent = NULL); // 标准构造函数
virtual ~CLegendDialog();

// 对话框数据
enum { IDD = IDD_DIALOG_LEGEND };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
ClithologyCombox m_comboLitho;

public:
virtual BOOL OnInitDialog();
};

BOOL CLegendDialog::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化
for(int i=0;i<10;i++)
{
m_comboLitho.AddString("1");
}
m_comboLitho.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

快乐鹦鹉 2011-07-12
  • 打赏
  • 举报
回复
兄弟,不知道你为什么要设置Owner draw属性为variable,能解释一下吗?你知道这个属性意味着什么吗?
不是简单的派生一个子类就可以的。唉,你就把Owner draw改成no就完了。
fescort 2011-07-12
  • 打赏
  • 举报
回复
我改成从CComboBox派生类定义的变量,也是AddString这儿出错

class ClithologyCombox : public CComboBox
{...}

ClithologyCombox m_comboLitho;
见习学术士 2011-07-12
  • 打赏
  • 举报
回复
Owner draw 自绘控件。
你都没有自绘,设置这项做什么?

快乐鹦鹉 2011-07-12
  • 打赏
  • 举报
回复
你这样肯定不行的。你为什么要指定控件的属性为Owner draw:variable呢?这么设置属性的话,要求控件自绘阿,而你只是使用的是基础的CComboBox阿。
将Owner draw属性改成no
fescort 2011-07-12
  • 打赏
  • 举报
回复

CComboBox m_comboTest;
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_comboTest);
}

快乐鹦鹉 2011-07-12
  • 打赏
  • 举报
回复
你这个m_comboTest是什么类型呢?CComboBox派生的子类吗?
oyljerry 2011-07-12
  • 打赏
  • 举报
回复
m_comboTest是否绑定控件成功.
ndy_w 2011-07-12
  • 打赏
  • 举报
回复
是可以的...问题可能在dlg的DrawItem里吧?
fescort 2011-07-12
  • 打赏
  • 举报
回复
代码重贴一下

#pragma once
#include "LithologySymbol.h"


// ClithologyCombox

class ClithologyCombox : public CComboBox
{
DECLARE_DYNAMIC(ClithologyCombox)

public:
ClithologyCombox();
virtual ~ClithologyCombox();

protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();

private:
void DrawItemLith(LPDRAWITEMSTRUCT lpDrawItemStruct);
void PreSubclassWindowLith();
}
// lithologyCombox.cpp : 实现文件
//

#include "stdafx.h"
#include "lithologyCombox.h"

// ClithologyCombox

IMPLEMENT_DYNAMIC(ClithologyCombox, CComboBox)

ClithologyCombox::ClithologyCombox()
{
m_type = 0;
VERIFY(m_MyFontOfHead.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体"))); // lpszFacename
m_LithologySymbol.LoadData();
}

ClithologyCombox::~ClithologyCombox()
{
}


BEGIN_MESSAGE_MAP(ClithologyCombox, CComboBox)
END_MESSAGE_MAP()

// ClithologyCombox 消息处理程序


//调用以在所有者描述的控件中绘制项
void ClithologyCombox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
DrawItemLith(lpDrawItemStruct);
}
void ClithologyCombox::DrawItemLith(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
int iItem = lpDrawItemStruct->itemID;
if (iItem < 0)
{
return;
}

CDC *pDC = NULL;
pDC=new CDC;
pDC->Attach(lpDrawItemStruct->hDC);

int iState = lpDrawItemStruct->itemState;
COLORREF crColor = 0;
COLORREF crNormal = GetSysColor(COLOR_WINDOW);
COLORREF crSelected = GetSysColor(COLOR_HIGHLIGHT);

CRect rect(&(lpDrawItemStruct->rcItem));
if(iState & ODS_SELECTED)
{
pDC->SetROP2(R2_NOT);
pDC->FillSolidRect(rect,RGB(0,0,255));
crColor = RGB(255,255,255);
}
else
{
pDC->SetROP2(R2_COPYPEN);
pDC->SetBkColor(crNormal);
pDC->FillSolidRect(&rect,crNormal);
}


//画岩性道
COLORREF nColor;
//nColor = RGB(255,255,255);
nColor = RGB(192, 192, 192);// 浅灰色
m_lithologyName = m_LithologySymbol.m_LithScript.m_arrName[iItem];
int fMinus,fOffset;
m_mainLithScript = m_LithologySymbol.GetMainLithSctipt(m_lithologyName,fMinus,fOffset);
m_MinusWidth = fMinus;
m_LineOffset = fOffset;
m_strSecondScript = m_LithologySymbol.GetSecondaryLithSctipt(m_lithologyName);
rect.NormalizeRect();

CRect m_RectLith = CRect(rect.left,rect.top,
rect.CenterPoint().x,rect.bottom);//岩性绘制区域
CRect m_RectText = CRect(rect.CenterPoint().x,rect.top,
rect.right,rect.bottom); //岩性名称绘制区域

m_RectLith.DeflateRect(2,2,5,2);
m_LithologySymbol.m_DrawLith.Draw(pDC,
m_RectLith,
m_mainLithScript,
m_strSecondScript,
0,0,//(int)m_MinusWidth,(int)m_LineOffset,
_T(""),nColor);

CPen pen,*Oldpen;
pen.CreatePen(PS_SOLID,1,crColor);
Oldpen = pDC->SelectObject(&pen);

//绘制岩性名称
CFont* def_font = pDC->SelectObject(&(m_MyFontOfHead));
pDC->SetTextColor(crColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextAlign(TA_LEFT);

CRect m_r = m_RectText;

m_r.DeflateRect(10,2,10,2);

DrawText(pDC->m_hDC, m_lithologyName, -1, m_r,DT_LEFT|DT_SINGLELINE|DT_VCENTER | DT_NOPREFIX);
pDC->SelectObject(def_font);

CBrush brush1,* pOldBrush1;
pOldBrush1 = pDC->SelectObject(&brush1);

pDC->SelectObject(Oldpen);
pen.DeleteObject();

pDC->SelectObject(pOldBrush1);
brush1.DeleteObject();

pDC->Detach();
delete pDC;
pDC = NULL;
}
//在对象附加到现有窗口后调用
void ClithologyCombox::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
PreSubclassWindowLith();

CComboBox::PreSubclassWindow();
}
void ClithologyCombox::PreSubclassWindowLith()
{
int size = (int)(m_LithologySymbol.m_LithScript.m_arrSctipt.GetSize());
for (int nstyles = 0; nstyles < size; nstyles++)//
{
AddString(_T(""));
//SetItemHeight(nstyles,40);//列表框中每一项的高度
}
// Select the first color when the control is created.
SetCurSel(0);
}

fescort 2011-07-12
  • 打赏
  • 举报
回复
To sharptiger123:
你提供的方法试过了,同样出错

To happyparrot:
我是想实现自绘下拉列表,所以要设置Owner draw属性为variable设置

To VisualEleven:
你列举的这四个函数都要重写吗?我只重写了DrawItem这一个

我的从CCombox派生的类,代码如下:
#pragma once
#include "LithologySymbol.h"


// ClithologyCombox

class ClithologyCombox : public CComboBox
{
DECLARE_DYNAMIC(ClithologyCombox)

public:
ClithologyCombox();
virtual ~ClithologyCombox();

protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();

private:
void DrawItemLith(LPDRAWITEMSTRUCT lpDrawItemStruct);
void PreSubclassWindowLith();
}
// lithologyCombox.cpp : 实现文件
//

#include "stdafx.h"
#include "lithologyCombox.h"

// ClithologyCombox

IMPLEMENT_DYNAMIC(ClithologyCombox, CComboBox)

ClithologyCombox::ClithologyCombox()
{
m_type = 0;
VERIFY(m_MyFontOfHead.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体"))); // lpszFacename
m_LithologySymbol.LoadData();
}

ClithologyCombox::~ClithologyCombox()
{
}


BEGIN_MESSAGE_MAP(ClithologyCombox, CComboBox)
END_MESSAGE_MAP()

// ClithologyCombox 消息处理程序


//调用以在所有者描述的控件中绘制项
void ClithologyCombox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
DrawItemLith(lpDrawItemStruct);
}
void ClithologyCombox::DrawItemLith(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
int iItem = lpDrawItemStruct->itemID;
if (iItem < 0)
{
return;
}

CDC *pDC = NULL;
pDC=new CDC;
pDC->Attach(lpDrawItemStruct->hDC);

int iState = lpDrawItemStruct->itemState;
COLORREF crColor = 0;
COLORREF crNormal = GetSysColor(COLOR_WINDOW);
COLORREF crSelected = GetSysColor(COLOR_HIGHLIGHT);

CRect rect(&(lpDrawItemStruct->rcItem));
if(iState & ODS_SELECTED)
{
pDC->SetROP2(R2_NOT);
pDC->FillSolidRect(rect,RGB(0,0,255));
crColor = RGB(255,255,255);
}
else
{
pDC->SetROP2(R2_COPYPEN);
pDC->SetBkColor(crNormal);
pDC->FillSolidRect(&rect,crNormal);
}


//画岩性道
COLORREF nColor;
//nColor = RGB(255,255,255);
nColor = RGB(192, 192, 192);// 浅灰色
m_lithologyName = m_LithologySymbol.m_LithScript.m_arrName[iItem];
int fMinus,fOffset;
m_mainLithScript = m_LithologySymbol.GetMainLithSctipt(m_lithologyName,fMinus,fOffset);
m_MinusWidth = fMinus;
m_LineOffset = fOffset;
m_strSecondScript = m_LithologySymbol.GetSecondaryLithSctipt(m_lithologyName);
rect.NormalizeRect();

CRect m_RectLith = CRect(rect.left,rect.top,
rect.CenterPoint().x,rect.bottom);//岩性绘制区域
CRect m_RectText = CRect(rect.CenterPoint().x,rect.top,
rect.right,rect.bottom); //岩性名称绘制区域

m_RectLith.DeflateRect(2,2,5,2);
m_LithologySymbol.m_DrawLith.Draw(pDC,
m_RectLith,
m_mainLithScript,
m_strSecondScript,
0,0,//(int)m_MinusWidth,(int)m_LineOffset,
_T(""),nColor);

CPen pen,*Oldpen;
pen.CreatePen(PS_SOLID,1,crColor);
Oldpen = pDC->SelectObject(&pen);

//绘制岩性名称
CFont* def_font = pDC->SelectObject(&(m_MyFontOfHead));
pDC->SetTextColor(crColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextAlign(TA_LEFT);

CRect m_r = m_RectText;

m_r.DeflateRect(10,2,10,2);

DrawText(pDC->m_hDC, m_lithologyName, -1, m_r,DT_LEFT|DT_SINGLELINE|DT_VCENTER | DT_NOPREFIX);
pDC->SelectObject(def_font);

CBrush brush1,* pOldBrush1;
pOldBrush1 = pDC->SelectObject(&brush1);

pDC->SelectObject(Oldpen);
pen.DeleteObject();

pDC->SelectObject(pOldBrush1);
brush1.DeleteObject();

pDC->Detach();
delete pDC;
pDC = NULL;
}
//在对象附加到现有窗口后调用
void ClithologyCombox::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
PreSubclassWindowLith();

CComboBox::PreSubclassWindow();
}
void ClithologyCombox::PreSubclassWindowLith()
{
int size = (int)(m_LithologySymbol.m_LithScript.m_arrSctipt.GetSize());
for (int nstyles = 0; nstyles < size; nstyles++)//
{
AddString(_T(""));
//SetItemHeight(nstyles,40);//列表框中每一项的高度
}
// Select the first color when the control is created.
SetCurSel(0);
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧