分享
 
 
 

关于list control的高级应用---条目编辑

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

论坛中搜索一下,你会发现不少类似的提问:我如何编辑list control的条目?如何直接编辑list control...等等;list control可用来做数据库表的视图,十分有用.

但报表风格的list control只能编辑第一列,其余的该死的微软没为vc做到.它怕VB卖不出.于是C++程序员只好DIY.主要思想是在list control中动态创建一个控件,动态移动该控件到相应位置.这些方法早有人讨论过了,本文也是基于如上思想的,但注重于可扩充性与使用的方便.

List control 这头主要是重载OnLButtonDown方法,计算出被点中的条目.这里重要的函数是SubItemHitTest和GetSubItemRect,看msdn上有相关说明. 用户点中后,就要负责显示控件了:如果之前选中了其他,就要验证之前的改动是否成功.不成功就要回到原来的地方,成功就应用修改并移到新位置.看代码:

static const UINT IDCHAILD=3000;

void CValidateList::OnLButtonDown(UINT nFlags, CPoint point)

{

CListCtrl::OnLButtonDown(nFlags, point);

LVHITTESTINFO hi;

hi.pt = point;

if(SubItemHitTest(&hi) != -1 )//没有点中条目就不管

{if(m_col==-1||//-1 还没被选过

true==(m_col+m_validate)->Validate (m_row))

{

m_row = hi.iItem, m_col= hi.iSubItem;//m_row,m_col成

//员分别跟踪选中的行列

}

((m_col+m_validate))->Move (_GetRect(),m_row);

}

}

WinBlast* CValidateList::SetValidate( WinBlast*in)//设置验证的

//控件群,in对应第一列,in+1第二列……

{

WinBlast*ret=m_validate;

m_validate=in;

int counts=GetHeaderCtrl()->GetItemCount();;

RECT rect;

memset(&rect,0,sizeof(rect));

for(int i=0;i<counts;++i)

(in+i)->Create (this,rect,IDCHAILD+i,i);

m_col=-1;//没有被选中的

return ret;

}

RECT CValidateList::_GetRect()//内部使用,得到相应显示位置

{

CRect ret;

GetSubItemRect(m_row,m_col,LVIR_BOUNDS,ret);

return ret;

}

void CValidateList::NoSelect()//置未选中状态

{

m_col=-1;//没有被选中的

}

看到了WinBlast*ret=m_validate吧.WinBlast是用来修改和验证数据的控件看它的实现:

class WinBlast

{

int m_col;//跟踪列,为什么要这个?因为你可以让一种控件对

//不同列用不同的验证策略

CWnd* m_win;//你的控件窗口

CListCtrl *m_parent;//用它获得文本

public:

WinBlast(){m_win=NULL;}

~WinBlast(){m_win->DestroyWindow();delete m_win;}

virtual bool Create( CWnd* pParentWnd,

const RECT& rect, UINT nID,

int col)

{

m_col=col;m_parent=(CListCtrl *)pParentWnd;

m_win=new CEdit;

return ((CEdit*)m_win)->

Create(ES_NOHIDESEL,rect,pParentWnd,nID);

}

void Move(const RECT &rect,int row)//最重要的函数但前面

//两个动作是必作的,SetText为虚,你在那做你喜欢的

{

m_win->ShowWindow(SW_SHOW);

m_win->MoveWindow(&rect);

SetText(row);

}

virtual bool Validate(int row)//验证,虚函数.这里永远返回true

{

m_win->ShowWindow(SW_HIDE);

CString set;

m_win->GetWindowText(set);

m_parent->SetItemText(row,m_col,set);

return true;

}

virtual void SetText(int row)

{

m_win->SetWindowText(m_parent->GetItemText(row,m_col));

((CEdit*)m_win)->SetSel (0,-1);

}

};

实际使用通常是这样的:

WinBlast*p=new WinBlast[sizeof(col)/sizeof(col[0])];//col是

//列名字符数组,sizeof(col)/sizeof(col[0])计算列数

m_test.SetValidate (p);//m_test是CValidateList类

你可以继承WinBlast,重载Create建立一个下拉框,加入你喜爱的验证方法.

注意我的设计漏洞:CValidateList应接收WinBlast**,而不是WinBlast*-----不理解这个漏洞其实也不要紧:但要记住,不改正的话你的WinBlast后继类就不能加数据成员了.

第一次发表文章,不足之处尽管批评.想要完整源码请告知Email

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有