VC++的一些PAD整理

转载 2007年09月14日 11:37:00
关于投票
发表于 2007-6-4 11:52:40
 
 
默认情况下,Edit Box是默认按了CtrlEnter换行,但是在输出数据的时候,这样很不方便,于是就需要设置成自动换行,设置方法是在属性的Styles中设置成Auto VScrollVertical scroll,把Auto HCcroll去掉,如下图:
点击看大图

 
论坛中搜索一下,你会发现不少类似的提问:我如何编辑list control的条目?如何直接编辑list control...等等;list control可用来做数据库表的视图,十分有用.
但报表风格的list control只能编辑第一列,其余的该死的微软没为vc做到.它怕VB卖不出.于是C++程序员只好DIY.主要思想是在list control中动态创建一个控件,动态移动该控件到相应位置.这些方法早有人讨论过了,本文也是基于如上思想的,但注重于可扩充性与使用的方便.
List control 这头主要是重载OnLButtonDown方法,计算出被点中的条目.这里重要的函数是SubItemHitTestGetSubItemRect,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
         (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_testCValidateList
你可以继承WinBlast,重载Create建立一个下拉框,加入你喜爱的验证方法.
注意我的设计漏洞:CValidateList应接收WinBlast**,而不是WinBlast*-----不理解这个漏洞其实也不要紧:但要记住,不改正的话你的WinBlast后继类就不能加数据成员了.
 
3. 如何在VC MFCList Control中实现拷贝功能?
我在单文档视图中加入一个List Control控件(Report形式),并关联类CListCtrl的一个对象,往里面写数据什么的都行,但在界面上无法实现对报表数据的拷贝(快捷或右键都不行),想请教如何实现拷贝该报表显示的数据?
1CListCtrl创建click事件,记录item
2在视图所在的类创建虚函数PreTranslateMessage
加入代码
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam==13)//这里13是表示回车键盘,你也可以改成其他的
{
copy();
}
}
3.编写copy函数,取得item处的文本,保存只剪切板
 
4.更改列表控件样式
创建列表控件 (List Control) (CListCtrl) 后,可以在任何时间更改它的窗口样式。通过更改窗口样式来更改控件使用的视图类型。例如,为了模拟“资源管理器”,您可以提供菜单项或工具栏按钮以在不同的视图(图标视图、列表视图等)之间切换控件。
例如,用户选择您的菜单项后,您可以调用 GetWindowLong 来检索控件的当前样式,然后调用
 

相关文章推荐

VC++ MFC文件,文件夹操作整理

文件属性相关1.判断文件是否存在利用CFile类和CFileStatus类判断CFileStatus filestatus;if (CFile::GetStatus(_T("d://softist.t...

vc++学习精髓(收集,整理)

以下是很多VC爱好者的学习经历,希望对大家有所帮助:  我记得我在网上是这么说的:先学win32的SDK,也就是API,  再学MFC,这么一来呢,就先有个基础,MFC是API的封装,  如...

vc++ 调试技巧整理

 VC调试技巧收集整理        调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。       这里我简要...

VC++2010 的路径设置方法(整理)

INCLUDE+LIB设置是一个不错的方法,但是有时候为了保证代码的可以移植需要设置相对路径。 要了解vc中使用#include命令包含头文件所搜寻的路径,必须先了解vc中的几种路径: ...
  • wlanye
  • wlanye
  • 2012年06月02日 14:48
  • 1710

vc++2010配置编译opencv2.3.1通过(方法整理)

从此下载 http://www.opencv.org.cn/index.php/Download 下载 OpenCV for Windows(也即 OpenCV-2.3.1-win-superpa...

VC++ MFC文件,文件夹操作整理

文件属性相关1.判断文件是否存在利用CFile类和CFileStatus类判断CFileStatus filestatus;if (CFile::GetStatus(_T("d://softist.t...
  • nickms
  • nickms
  • 2011年02月24日 15:52
  • 716

整理一些需要用到的代码——VC++__MFC窗口的应用

一、VC防止同一个程序运行两个实例防止同一个程序运行两个实例: 在app类的cpp的InitInstance函数中: HANDLE hMutex; BOOL CDeskTopLockApp::I...

VC++笔记(未整理版本)

匈牙利表示法 关于构造函数 显式调用基类的有参数的构造函数: 类继承当中的三种属性: 引用和指针 重复命名错误及解决 。。。   Windows程序运行原理PPT 窗口的创建步骤 ...
  • csf111
  • csf111
  • 2011年09月07日 19:11
  • 4747

对VC++一些常见问题的整理

(1)为什么某个类突然在工作区间里面突然看不见了?只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 (2)在基于对话框的程序中,一按回...

整理:C++、VC++.NET、VS.NET和.NET Framework简介

微软对.NET的定义是 The .NET Framework is a new computing platform that simplifies application developmen...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++的一些PAD整理
举报原因:
原因补充:

(最多只允许输入30个字)