博文
CListCtrl学习笔记(2)---中级篇(1)(2006-12-24 14:53:00)
摘要:专题1: 如何使CListCtrl完全可编辑?
1. 背景 : 我们知道如果CListCtrl是报表样式,那么CListCtrl所提供的编辑功能只局限于第一列.也就是说只有第一列可编辑.这样显然无法满足一般数据库的要求.我们想要每个子项都能编辑.
2. 思路 : CEdit是一个很好的可控制编辑控件.如何把CEdit和我们的CListCtrl联系起来?一种很好的想法是------一般我们如果想编辑某一项,那么就应该去双击.双击以后就让CEdit在那里显示,当然要把大小调整和子项表格一样.如果CEdit失去了焦点,表示修改完毕,那么立即更改子项的数据,同时让CEdit隐藏.因为每次只能编辑一项,所以只需要一个CEdit就够了.
3. 方法:
(1) 首先从CListCtrl派生一个类,其他已经有的变量或者函数设置我已经介绍,如果不清楚的读者,可以去参考”基础篇”.
(2) 有一点可以肯定,我们必须响应双击事件:
void Cmylist::OnLButtonDblClk(UINT nFlags, CPoint point)
{
int index;//行号
int colnum;//列号
GetWindowRect(r);//稍后说明
GetParent()->ScreenToClient(r);//稍后说明
if((index=HitTestEx(point,&colnum))!=-1)
EditSubItem(index,colnum);
CListCtrl::OnLButtonDblClk(nFlags, point);
}
其中HitTestEx是用来求出双击点所在的行列号,如果行号不为-1,那么就调用函数EditSubItem. 这个函数会根据行列号......
CListCtrl学习笔记(1)---基础篇(2006-12-16 19:54:00)
摘要: CListCtrl 学习笔记(1)---基础篇
背景:CListCtrl 在小型数据库中应用的还是比较多的.因此掌握它是一个很重要的技能.最近在做老师布置的一个项目,用到它,开始的时候不知所措.后来上网找了一些资料,再加上自己的探索,终于对它有一个比较全面的认识.下面我简单讲讲它的一些用法,以此和大家共享一下.
1. 基本风格设置
(1)函数: ModifyStyle( )
(2)重要参数: LVS_ICON // 大图标
LVS_SMALLICON // 小图标
LVS_LIST // 列表
&n......
轻松画背景(2006-12-16 01:00:00)
摘要:
在用MFC编程的时候,尤其是设置界面的时候,大家都会觉得VC的控件属性设置还比不上VB.连个颜色都设置不了.但也正是这样,MFC提供给我们的自由也就越多,我们可以随意派生自己的控件类,想怎么做就怎么做.VB不行.
但是派生一个自己的控件类,然后去自绘,也不是容易的事情.在不断的探索中,我发现了一个简单的设置背景的方法,就是直接利用PICTURE控件.把它设置成容纳位图,然后就可以充当背景了.
比如有一个static控件.现在再绘制一个,PICTURE控件,放在static上面.这个时候,图像是会遮盖住static控件的.我们可以重新设置一下Tab序,让PICTURE控件排在前面即可.下面看看我的作品把:
......
抽屉菜单的简单实现(2006-12-09 16:47:00)
摘要:看到 QQ的抽屉,也想自己做一个,于是做了个最简单的,界面如图所示
这是一个基于对话框的程序,有3个按钮,有4个对话框,1个是主窗口,还有3个是子窗口,因此需要3个对话框的资源风格为: “下层,对话框架“
下面是具体设计过程:
1.给3个子窗口(对话框)分别派生一个对话框类,名为Cmydlg1,Cmydlg2,Cmydlg3;
2.在 Cmydlg (主窗口) 中添加成员:
Cmydlg1 *dlg1;
Cmydlg2 *dlg2;
Cmydlg3 *dlg3;
int m_left; // 按钮的左边坐标
int m_right; // 按钮的右边坐标
int m_buttonHeight;// 按钮的高度
int m_buttonWidth; // 按钮的宽度
int m_dlgHeight; // 子对话框的高度,而宽度与按钮应该相同
CButton m_button[3]; // 3个按钮,下面会动态创建
3.初始化
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInit......
控件的实时拖动(2006-12-07 16:29:00)
摘要:由于一个小项目的需要,必须做控件的拖曳。以前还真没有想过这种问题。先来看看有没有处理消息,比如drag什么的,很遗憾没有。再来看看有没有函数,好像也没有,郁闷。没办法了。只好用绝招,自己做一个派生类把,下面我就以编辑框为例,简单说明一下拖曳的过程。
1。从CEdit派生一个类为CmyEdit。
2。添加左键处理函数:
void Cmyedit::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
pp=point; // pp是Cmyedit的成员变量
SetTimer(5,10,NULL); // 引发定时器
CEdit::OnLButtonDown(nFlags, point);
}
void Cmyedit::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
KillTimer(5); // 关闭定时器
CEdit::OnLBu......
CEdit重新审视(2006-11-29 21:06:00)
摘要:一个从没想过的问题今天终于出现了!我自己都感到以外!呵呵,什么问题呢?可能你也没想过哦。即使想过,你解答了没有?
是一个聊天的程序,类似于QQ的界面。简化一点说把。(注意是简化)一个基于对话框的的程序,只有2个编辑框m_edit1,m_edit2, 还有一个是按钮。现在我要做的就是在 m_edit2中输入,然后点击按钮,内容就跑到了m_edit1中。并且每次点击后,上次 m_edit1的内容还会留下来,当然是聊天嘛,每次发送的内容要在m_edit1的最后显示。呵呵,听起来很简单哦
注意我最后一句话。如果你采用连加的话,像这样:
m_edit1.GetWindowText(m_str1);
m_edit2.GetWindowText(m_str2);
m_str1+=m_str2;
m_edit1.SetWindowText(m_str1);
内容是出现了,但是光标还在第一个位置,这样如果m_edit1是一个多行的程序,有垂直滚动条,那么就麻烦了,前面我已经说了,要求是 “每次发送的内容要在m_edit1的最后显示”,也就是要求滚动条要移动到最后,按照上面那种方法,滚动条都在上面。
怎么办哪?没有关于滚动条的函数啊。其实不是滚动条的原因,原因是光标。光标还在第一个位置啊。明白了,我们要把光标移动到最后。
于是上msdn了。找“CEdit”,“class members“,这么多函数,还不知哪个是移动光标的函数呢。一个一个的试。posfromchar,SetCaretPos ,......都不行啊,晕了。。。
正绝望呢,突然想起了久违的setsel和GetSel 我们都知道CEdit是用来选中编辑框中的内容的,它们会不会有用呢?管他呢,先 全部选中再说。
m_edit1.SetFocus();
m_edit1.SetSel(0,-1);
啊!选中了!不,我不是惊喜这个(不然我会被看贴的砍死的)。除了选中之余,光标也移动到了最后!呵呵,成功了!
再想想,还不行,差一点。这样岂不是我每次要全部选中?不好。既然选中是移动光标的话,那我干脆一不做二不休,函数照用,但是我不选,呵呵,这样写:
m_edit.SetFocus();
m_edit1.SetSel(m_str1.GetLength(),m_str1.Ge......