动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.整数类型和浮点类型的大小限制.
.C++ Builder 动作对象.
.在C程序中显示汉字.
.C++箴言:理解typename的两个含义.
.改变打开对话框中"打开&quo.
.C语言函数的调用与参数.
.C++类的分解,抽象类与纯虚函数的.
.软件编码规范.
.ARP & ICMP.
.开发花絮:一个DataList的ItemCo.
.罗云彬VxD教程--虚拟机管理器.
.如何用C++编程获得某台机器的IP地.
.用C语言编写Windows服务程序的五.
.用C++制作自己的游戏修改器(上).
.用C++实现跨平台游戏开发之Alleg.
.Java进阶:JNI使用技巧点滴.
.C语言初学者入门讲座 第十一讲 指.
.C++中通过溢出覆盖虚函数指针列表.
.DrawDib函数组的使用.
.TC 中的汉字技术.

高手解答:关于RICHEDIT的两个问题

发表日期:2008-3-8 |


  问题1:RichEditCtrl在用DDX进行数据交换的时候会发生数据丢失问题?为什么!   当我们在拖了一个控件到程序里后,通常的做发是Ctrl+W,用类向导给控件关联一个变量,然后依靠DDX/DDV进行数据交换,假如我们用同样的方法来给RICHEDIT关联一个CString类型的变量就会存在一个问题,就是假如我们的数据大于了64K,数据就会丢失。   通过查MSDN发现,WM_GETTEXT消息并没有设计在RICHEDIT的数据大于64K的时候怎样处理。而类向导生成的代码是用DDX_Text来交换控件和CString变量的数据。恰好,DDX_Text函数是调用GetWindowText函数,而这个函数又会发出WM_GETTEXT消息到控件来返回控件里的数据。WM_GETTEXT消息不能接受超过64K的数据,因此导致了RICHEDIT在数据交换的时候发生了丢失。   为了解决这个问题,我们要用到DDX_RichText函数。添加下面两个函数到工程 以下是引用片段:
  DWord CALLBACK ES2MemCallBack(DWORD_PTR dwCookie,LPBYTE pbBuff, LONG cb, LONG *pcb)
  {
  LPTSTR& lpszStrFill = *(LPTSTR*)dwCookie;
  memcpy(lpszStrFill, pbBuff, *pcb = cb);
  lpszStrFill += cb;
  *lpszStrFill = TCHAR('\0');
  return 0;
  }
  void AFXAPI DDX_RichText(CDataExchange* pDX, int nIDC, CString& value)
  {
  extern void AFXAPI AfxSetWindowText(HWND hWndCtrl, LPCTSTR lpszNew);
  HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  if (pDX->m_bSaveAndValidate)
  {
  int nLen = ::GetWindowTextLength(hWndCtrl);
  LPTSTR lpszStrFill = value.GetBufferSetLength(nLen);
  EDITSTREAM es = { (DWORD_PTR) &lpszStrFill, 0, ES2MemCallBack };
  ::SendMessage(hWndCtrl, EM_STREAMOUT, SF_TEXT, (LPARAM) &es);
  value.ReleaseBuffer();
  }
  else
  {
  AfxSetWindowText(hWndCtrl, value);
  }
  }   之后我们还需要修改工程的.clw文件,用文本方式打开.clw文件。参考里面类的格式加下面两行代码: 以下是引用片段:
  ExtraDDXCount=1
  ExtraDDX1=7;;TextOver64KB;CString;;RichText;Retrieves text in excess of 64KB from RichEdit controls   假如没有采用上面的步骤,我们就需要手动修改代码,把所有的DDX_Text改为DDX_RichText。同时要把他们移到类向导控制代码的外面。也就是移出: 以下是引用片段:
  //{{AFX_DATA_INIT(...)
  //}}AFX_DATA_INIT
  //{{AFX_DATA_MAP(...)
  //}}AFX_DATA_MAP
  reference:
  Q280447 BUG: Text from a Rich Edit Control Is Truncated During Dialog Data Exchange (DDX)   问题2:当我们用类向导给richedit添加了EN_SETFOCUS, EN_KILLFOCUS的函数后却不能响应,我发现这个响应函数根本就没有被调用。即使是一个MessageBox()函数也不会调用。   原来是默认的消息映射添加错误了。   正确的消息影射和响应应该是: 以下是引用片段:
  ON_EN_SETFOCUS(IDC_RICHEDIT1,OnSetfocusRichedit1)
  ON_EN_KILLFOCUS(IDC_RICHEDIT1,OnKillfocusRichedit1)   响应函数形式为: 以下是引用片段:
  afx_msg void OnSetfocusRichedit1();
  afx_msg void OnKillfocusRichedit1();   但是假如我们用类向导来直接添加,生成的代码却是:
以下是引用片段:
  ON_NOTIFY(EN_SETFOCUS, IDC_RICHEDIT1, OnSetfocusRichedit1)
  ON_NOTIFY(EN_KILLFOCUS, IDC_RICHEDIT1, OnKillfocusRichedit1)   我们需要自己手动改为上面的形式。   还有一个问题就是RichEditCtrl有时候不会出现在类向导的控件ID列表里。这就需要我们自己添加DDX/DDV函数。自己动手啦!^_^ 以下是引用片段:
  -- sampledlg.h --
  class CSampleDlg : public CDialog
  {
  public:
  CSampleDlg(CWnd* pParent = NULL);
  // Dialog Data
  //{{AFX_DATA(CSampleDlg)
  enum { IDD = IDD_SAMPLE_DIALOG };
  CString m_edit; // Added by ClassWizard for an edit control
  //}}AFX_DATA
  // Manually add member variables for the rich edit control
  CRichEditCtrl m_richEditCtrl;
  .......
  sampledlg.cpp --
  ......
  void CSampleDlg::DoDataExchange(CDataExchange* pDX)
  {
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CSampleDlg)
  DDX_Text(pDX, IDC_EDIT, m_edit);
  DDV_MaxChars(pDX, m_edit, 10);
  //}}AFX_DATA_MAP
  // Manually add DDX_Control, DDX_Text and DDV_MaxChars for the
  // rich edit control
  DDX_Control(pDX, IDC_RICHEDIT1, m_richEditCtrl);
  DDX_Text(pDX, IDC_RICHEDIT1, m_richedit);
  DDV_MaxChars(pDX, m_richedit, 10);
  }
上一篇:用AVIFile函数制做AVI文件基本步骤 人气:676
下一篇:高手讲解:探索C++的秘密之详解extern 人气:390
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-8-21 Nucleus v3.33 多国语言版
2008-8-21 HDWiki v4.0 bulid 080821 UTF-8
2008-8-21 明科在线客服系统 v6.0
2008-8-21 KesionCMS v5.0.2 正式版 utf-8
2008-8-21 KesionEshop v5.0.2 正式版 utf-8
2008-8-21 HDWiki v4.0 bulid 080821 GBK
2008-8-21 新文互动酷站展示系统 v1.5
2008-8-21 Punbb v1.2.20 多国语言版
2008-8-21 QQ头像网 beta
2008-8-16 iLaba Player(小喇叭播放器) v2.
2008-8-16 DoubleClickFix 鼠标双击修正工具
2008-8-16 CrystalCPUID 4.15.2.451
2008-8-16 VeryCD 电驴(easyMule) 1.0.4 Bu
2008-8-16 uTorrent 1.8 Build 11813 - Sta
2008-8-16 比特精灵(BitSpirit) v3.3.2.287
2008-8-16 StayInTune音叉 v1.0 破解版
2008-8-16 iChing《周易》汉化补丁 v1.0
2008-8-16 Starmap星空图v1.0汉化破解版
  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号