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 来检索控件的当前样式,然后调用
 

安卓-电子签名signature

安卓-电子签名signature
  • sinat_15411661
  • sinat_15411661
  • 2018年01月02日 15:23
  • 58

接口规范

一、xml规范 先看看这个XML文件: 1 2 3 4 5 article>     id>id>     d...
  • cui7230102
  • cui7230102
  • 2011年11月23日 09:51
  • 284

报错注入的一些整理 By Assassin

mysql暴错注入方法整理,通过floor,UpdateXml,ExtractValue,NAME_CONST,Error based Double Query Injection等方法SQL注入1、...
  • qq_35078631
  • qq_35078631
  • 2017年01月29日 15:44
  • 354

VC中使用ADO进行数据库开发的一些资料的整理

1.导入ado库在StdAfx.h中,加入如下代码#import "c:/program files/common files/system/ado/msado15.dll"  /          ...
  • handsomerun
  • handsomerun
  • 2006年08月12日 21:27
  • 3519

python常用文件操作方法整理

内容参考自《python变成快速上手》首先明确一点,Windows的路径在python中写为(‘c:\Users\xxx’);mac OS和Linux则写成(‘usr/bin/xxx’)。此处需要用到...
  • lajiasd123
  • lajiasd123
  • 2016年12月07日 13:26
  • 373

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

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

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

(1)为什么某个类突然在工作区间里面突然看不见了?   只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了   (2)在...
  • Lyntion
  • Lyntion
  • 2010年10月10日 12:57
  • 671

对VC++一些常见问题的整理(www.sunxin.org)

对VC++一些常见问题的整理(提问前请看)(1)为什么某个类突然在工作区间里面突然看不见了?只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中...
  • llxwj
  • llxwj
  • 2006年12月21日 19:00
  • 1231

芯片资料中的pad和pin的区别

PIN指芯片封装好后的管脚,即用户看到的管脚; PAD是硅片的管脚,是封装在芯片内部的,用户看不到。 PAD到PIN之间还有一段导线连接的。...
  • imxiangzi
  • imxiangzi
  • 2015年01月20日 16:37
  • 4680

TensorFlow中关于pad函数的详细理解

今天用到pad函数,看文档看了老半天,后面终于弄懂了。 以下是本人的理解总结 文档的内容: # 't' is [[1, 2, 3], [4, 5, 6]]. # 'paddings' ...
  • u011012422
  • u011012422
  • 2017年09月12日 18:01
  • 519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++的一些PAD整理
举报原因:
原因补充:

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