不会响应DrawItem ,我已经勾选了Owner Draw Fixed

qunqun2012 2011-09-11 08:45:57
为什么CListCtrl的派生类 CAccelList类 不会响应DrawItem ,我已经勾选了Owner Draw Fixed

//ListCtrl自绘调用
void CAccelList:: DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){

AfxMessageBox(_T("nihao")); CListCtrl::DrawItem(lpDrawItemStruct);

}

//这个函数,除非组合框控件自绘,才会调用
void CAccelList::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) {
// TODO: Add your message handler code here and/or call default

AfxMessageBox(_T("nhao"));

CListCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

我发现结果,都没有弹出AfxMessageBox来,我已经勾选了Owner Draw Fixed


另外一个问题:


在CAccelList中有一个私有成员CComboBox类型的m_boxNum


动态创建代码为:


m_boxNum.Create(WS_CHILD | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST ,CRect(100, 17, 200, 80),this,IDD_COMBOXNUM);


风格如上。。。 现在有个小三角形,很丑陋,想去掉。。。

能否在在OnDrawItem中通过自绘,从而去掉这个小三角形啊?



当用户点击的时候,再出现下拉, 而不是有三角形。。。
...全文
567 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lindsay 2011-09-22
  • 打赏
  • 举报
回复
把我代码贴出来看看对你有用没
//头文件中函数的声明
afx_msg void OnNMCustomdrawListAllcbat(NMHDR *pNMHDR, LRESULT *pResult);

//源文件中
//消息映射宏
ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_ALLCBAT, OnNMCustomdrawListAllcbat)
//函数的实现
void Dlg_CbatList::OnNMCustomdrawListAllcbat(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW *pNMCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码

*pResult = CDRF_DODEFAULT;
if (CDDS_PREPAINT == pNMCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}else if (CDDS_ITEMPREPAINT == pNMCD->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pNMCD->nmcd.dwDrawStage)
{
COLORREF colBk = RGB(255,255,255);
int nItme = static_cast<int>(pNMCD->nmcd.dwItemSpec);
CString strTemp = m_ctrCbatlist.GetItemText(nItme,pNMCD->iSubItem);
switch(pNMCD->iSubItem)
{
case 5:
if (strTemp == "在线")
{
colBk = RGB(0,255,0);

}
else{
colBk = RGB(0,0,0);
}
pNMCD->clrText=colBk;
*pResult = CDRF_DODEFAULT;
break;
default:
pNMCD->clrText = RGB(0,0,0);
pNMCD->clrTextBk = RGB(255,255,255);
*pResult = CDRF_DODEFAULT;
break;
}

}
}
Lindsay 2011-09-22
  • 打赏
  • 举报
回复
我也再做这个
走好每一步 2011-09-13
  • 打赏
  • 举报
回复
//.h
afx_msg void OnCustomdraw ( NMHDR* pNMHDR, LRESULT* pResult );
//.cpp
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdraw )

void CListCtrlEx::OnCustomdraw ( NMHDR* pNMHDR, LRESULT* pResult )
{
TRACE("OnCustomdraw\n");
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
// Take the default processing unless we set this to something else below.
*pResult = 0;
// First thing - check the draw stage. If it's the control's prepaint // stage, then tell Windows we want messages for every item.
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
TRACE("CDDS_PREPAINT\n");
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{ // This is the prepaint stage for an item. Here's where we set the
// item's text color. Our return value will tell Windows to draw the
// item itself, but it will use the new color we set here.
// We'll cycle the colors through red, green, and light blue.
COLORREF crText;
if ( (pLVCD->nmcd.dwItemSpec % 3) == 0 )
crText = RGB(255,0,0);
else if ( (pLVCD->nmcd.dwItemSpec % 3) == 1 )
crText = RGB(0,255,0);
else crText = RGB(128,128,255);
// Store the color back in the NMLVCUSTOMDRAW struct.
TRACE("CDDS_ITEMPREPAINT\n");
pLVCD->clrText = crText;
// Tell Windows to paint the control itself.
*pResult = CDRF_DODEFAULT;
}
}


DrawItem是不会执行的。
caddor2011 2011-09-12
  • 打赏
  • 举报
回复
10 11 楼 up
qunqun2012 2011-09-12
  • 打赏
  • 举报
回复
upup
qunqun2012 2011-09-12
  • 打赏
  • 举报
回复
int cx[]={100,100,100}; 是每一列的宽度

m_rows 是行数


for(i=0;i<m_rows;i++)
{
InsertItem(i,NULL); //这一句,我是模仿别人的, 为什么要传入空列呢? 有什么意义啊
}
qunqun2012 2011-09-12
  • 打赏
  • 举报
回复
CListCtrl::DrawItem

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

参数: lpDrawItemStruct 一个指向DRAWITEMSTRUCT结构的长指针,其中包含绘图类型的信息。

说明:
当图画所有者的列表视图控件的视觉比例发生改变时,由框架调用。DRAWITEMSTRUCT结构的itemAction 成员定义了将要进行的绘图动作。

缺省时,该成员函数毫无作用。可覆盖此函数,实现拥有者绘制的CListCtrl对象的绘图操作。
应用也将在该成员函数终止前,恢复所有被选择的用于支持lpDrawItemStruct的显示内容的图形设备界面(GDI)对象


红色部分的意思是说:只有ListCtrl控件大小比例改变的时候,DrawItem函数才会被调用, 是这个意思吧?

如果说的话, 可是我创建的ListCtrl如何使之大小改变呢?



我使用子类化创建的:

具体代码如下:

int i;

char* pszText[]={"姓名","学号","性别"};

LVCOLUMN lvc = {LVCF_FMT | LVCF_TEXT | LVCF_WIDTH};

int cx[]={100,100,100};

//发送消息给自己,设置每行的高度

CRect rcWin;
GetWindowRect(&rcWin);
WINDOWPOS wp;
wp.hwnd = m_hWnd;
wp.cx = rcWin.Width();
wp.cy = rcWin.Height();
wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);


SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

for( i=0;i<sizeof(cx)/sizeof(int);i++)
{

lvc.pszText = pszText[i];
lvc.cx = cx[i];
lvc.fmt = LVCFMT_CENTER;

InsertColumn(i,&lvc);
}


for(i=0;i<m_rows;i++)
{
InsertItem(i,NULL);
}

xaojin2011 2011-09-12
  • 打赏
  • 举报
回复
你好, 不对,那么该用什么方式呢?


我在DrawItem里面设置了断电, 根本跑不进去

我纳闷了很久了


[Quote=引用 8 楼 kdxb8710 的回复:]

这样的方式不对
[/Quote]
qunqun2012 2011-09-12
  • 打赏
  • 举报
回复
嘿嘿 ,谢谢了啊


mfc比我想象复杂多了 ,不知道你是看什么资料知道这么多的啊 ,



[Quote=引用 16 楼 firefly3233 的回复:]

插入NULL,是因为这是自画,要在DrawItem()用DrawText画文本,在insertItem里传文本,并不意义,DrawItem()进要从自定义的数据中找。已经给你解释清楚,你还问?
[/Quote]
kdxb8710 2011-09-12
  • 打赏
  • 举报
回复
这样的方式不对
firefly3233 2011-09-12
  • 打赏
  • 举报
回复
插入NULL,是因为这是自画,要在DrawItem()用DrawText画文本,在insertItem里传文本,并不意义,DrawItem()进要从自定义的数据中找。已经给你解释清楚,你还问?
firefly3233 2011-09-12
  • 打赏
  • 举报
回复
删除WM_PAINT消息映射
qunqun2012 2011-09-12
  • 打赏
  • 举报
回复
up up
caddor2011 2011-09-11
  • 打赏
  • 举报
回复
顶顶更健康
hurryboylqs 2011-09-11
  • 打赏
  • 举报
回复
CListCtrl不用这个方式绘制
用NM_CUSTOMDRAW方法来绘制
详看我的blog 有源码
qunqun2012 2011-09-11
  • 打赏
  • 举报
回复
么有人啊
qunqun2012 2011-09-11
  • 打赏
  • 举报
回复
顶顶更健康
qunqun2012 2011-09-11
  • 打赏
  • 举报
回复
CAccelList是子类化

[Quote=引用 5 楼 qjgdftxmu 的回复:]

用动态创建试试
[/Quote]
qunqun2012 2011-09-11
  • 打赏
  • 举报
回复
CAccelList是CListCtrl的派生类,

[Quote=引用楼主 qunqun2012 的回复:]
为什么CListCtrl的派生类 CAccelList类 不会响应DrawItem ,我已经勾选了Owner Draw Fixed

//ListCtrl自绘调用
void CAccelList:: DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){

AfxMessageBox(_T("nihao")); CListCtrl::DrawItem……
[/Quote]
qjgdftxmu 2011-09-11
  • 打赏
  • 举报
回复
用动态创建试试

16,466

社区成员

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

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

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