博文

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. 这个函数会根据行列号......

阅读全文(5779) | 评论:1

CListCtrl学习笔记(1)---基础篇(2006-12-16 19:54:00)

摘要:              CListCtrl 学习笔记(1)---基础篇     背景:CListCtrl 在小型数据库中应用的还是比较多的.因此掌握它是一个很重要的技能.最近在做老师布置的一个项目,用到它,开始的时候不知所措.后来上网找了一些资料,再加上自己的探索,终于对它有一个比较全面的认识.下面我简单讲讲它的一些用法,以此和大家共享一下.      1.     基本风格设置         (1)函数:  ModifyStyle( )       (2)重要参数:    LVS_ICON  // 大图标                                   LVS_SMALLICON // 小图标                                   LVS_LIST  // 列表                 &n......

阅读全文(9887) | 评论:2

轻松画背景(2006-12-16 01:00:00)

摘要:
在用MFC编程的时候,尤其是设置界面的时候,大家都会觉得VC的控件属性设置还比不上VB.连个颜色都设置不了.但也正是这样,MFC提供给我们的自由也就越多,我们可以随意派生自己的控件类,想怎么做就怎么做.VB不行.   但是派生一个自己的控件类,然后去自绘,也不是容易的事情.在不断的探索中,我发现了一个简单的设置背景的方法,就是直接利用PICTURE控件.把它设置成容纳位图,然后就可以充当背景了.     比如有一个static控件.现在再绘制一个,PICTURE控件,放在static上面.这个时候,图像是会遮盖住static控件的.我们可以重新设置一下Tab序,让PICTURE控件排在前面即可.下面看看我的作品把:     ......

阅读全文(3526) | 评论:3

抽屉菜单的简单实现(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......

阅读全文(5012) | 评论:1

控件的实时拖动(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......

阅读全文(3109) | 评论:1

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......

阅读全文(4834) | 评论:0