当前位置:  编程技术>综合
本页文章导读:
    ▪MFC中如何添加消息响应函数      目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构。这种程序框架与简单程序框架之间的重要区别就在于形成应用程序的主窗口不只需要一个类的对象,而是需要3个对象: 框架窗口.........
    ▪资源未释放引起的内存漏洞模拟          在MFC编程中,我们常常创建一些GDI资源并通过指针使用它们;     例如:  CClientDC dc(this); CBrush *m_pBrush=new CBrush(RGB(255,0,0)); dc.SelectObject(m_pBrush); dc.Rectangle(0,0,100,100);.........
    ▪Trie树及其应用      一 Trie树 可参照百度百科: http://baike.baidu.com/view/1436495.htm   二 Trie树的构造及应用 /* This is a free Program, You can modify or redistribute it under the terms of GNU *Description:Trie树及其应用 *Language: C++ *Devel.........

[1]MFC中如何添加消息响应函数
    来源: 互联网  发布时间: 2013-11-07

目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构。这种程序框架与简单程序框架之间的重要区别就在于形成应用程序的主窗口不只需要一个类的对象,而是需要3个对象:

  • 框架窗口类(CFrameWnd)对象
  • 视图类(CView)对象
  • 文档类(CDocument)对象
框架窗口类(CFrameWnd)对象作为窗口的框架,视图类(CView)的对象作为贴附在框架窗口上的用户区,二者共同形成了应用程序的界面;而文档类对象CDocument对象则在幕后专门对数据进行存储和管理。在应用程序类CWinApp中,使用文档模板把3个类的对象组装在一起,从而形成一个完整的程序实体。在文档/视图结构的应用程序中,对于消息响应的添加和管理是至关重要的,这里我们通过一个简单的例子介绍在MFC中如何添加消息响应函数。

  • 首先,我们建立一个简单的文档/视图结构的应用程序esayApp(在应用向导中基本遵从默认即可),如图所示:

  • 在菜单的资源编辑器中添加“testMessage”选项,如下图所示:

在添加的选项上右键,然后点击属性,注意其ID(当添加新选项是,系统会默认生成一个ID),在这里我们为了强调,将默认ID改为”ID_TESTMESSAGE“。然后打开Resource.h文件,在其中会发现系统自动为新添加项增加了序号,如下图所示:(如果没有需要自己手动添加)

  • 现在,我们在视图类中添加该菜单的消息映射和消息响应函数。
  • 在simpleAppView.cpp中添加新的消息映射:

  • 在simpleAppView.h中添加消息响应函数的声明:

  • 最后在simpleAppView.cpp中添加消息响应函数是实现:

至此,具有消息响应功能的视图/文档结构的MFC应用程序就设计完成了,单击“文件-->testMessage”效果如下:

总结下消息响应函数添加的过程:
  • 设置事件触发的ID,并在Resource.h中指定具体值(有些版本会自动生成)。
  • 在xxxView.cpp中添加新的消息映射:ON_COMMAND( , )。
  • 在xxxView.h中添加消息响应函数的声明:afx_msg void fun_xxx()
  • 在xxxView.cpp中添加新的消息响应函数的具体实现:void fun_xxx()
  • 作者:eddy_liu 发表于2013-1-6 21:45:55 原文链接
    阅读:0 评论:0 查看评论

        
    [2]资源未释放引起的内存漏洞模拟
        来源: 互联网  发布时间: 2013-11-07

        在MFC编程中,我们常常创建一些GDI资源并通过指针使用它们;

        例如: 

    CClientDC dc(this);
    CBrush *m_pBrush=new CBrush(RGB(255,0,0));
    dc.SelectObject(m_pBrush);
    dc.Rectangle(0,0,100,100);
    delete m_pBrush;
    m_pBrush=NULL;

         但有时候,我们常常会忘记释放资源指针;如果程序多次运行上述代码片段,在任务管理器中可以观察到程序占用内存将不断增加,同时产生大量内存碎片;严重可能会引起系统内存不够用,导致其他程序不能正常运行或死机。

        其原理可用下述程式模拟:

    char *pMem=NULL;
    for(;;)
    {
    	pMem=new char[1024];
    }
     
    作者:mrp_user 发表于2013-1-6 21:38:05 原文链接
    阅读:0 评论:0 查看评论

        
    [3]Trie树及其应用
        来源: 互联网  发布时间: 2013-11-07

    一 Trie树

    可参照百度百科: http://baike.baidu.com/view/1436495.htm

     

    二 Trie树的构造及应用

    /*
    This is a free Program, You can modify or redistribute it under the terms of GNU
    *Description:Trie树及其应用
    *Language: C++
    *Development Environment: VC6.0
    *Author: Wangzhicheng
    *E-mail: 2363702560@qq.com
    *Date: 2013/1/6
    */
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    #include <string>
    #include <cctype>
    #include <ctime>
    #include <algorithm>
    using namespace std;
    
    const int Num = 26;  //定义26个字母
    /*
     * 定义结点类型 
     * UNCOMPLETED表示该结点对应的字符串还未创建完毕
     * COMPLETED表示该结点对应的字符串已经创建完毕
    */
    enum NodeType { UNCOMPLETED, COMPLETED };
    class Trie;   //向前引用
    /*
     * 定义结点类
     * @type:  结点类型
     * @ch:    结点所含的字符
     * @child: 结点孩子指针向量
    */
    class Node {
    private:
    	friend class Trie;
    	NodeType type;
    	char ch;
    	vector<Node *>child;
    };
    /*
     * 定义Trie树
    */
    class Trie {
    private:
    	Node *root;        //根结点
    
    	/*
    	 * 创建新结点
    	 * @ch: 结点含有的字符
    	*/
    	Node *newNode(char ch) {
    		Node *p=new Node;
    		if(!p) {
    			cerr<<"内存不足!"<<endl;
    			exit(1);
    		}
    		p->type = UNCOMPLETED;
    		p->ch = ch;
    		p->child.assign(Num, NULL);
    		
    		return p;
    	}
    	/*
    	 * 返回字符在孩子指针向量中的位置
    	*/
    	int index(char ch) {
    		if(isupper(ch)) ch = tolower(ch);
    		return ch - 'a';
    	}
    	/*
    	 * 删除指针ptr所指向的trie子树, 采用递归遍历子树 
    	*/
    	void delTrie(Node *&ptr) {
    		vector<Node *>::iterator it;
    		if(ptr == NULL) return;
    		for(it = ptr->child.begin(); it != ptr->child.end(); it++) {
    			if(*it && (*it)->type != COMPLETED) delTrie(*it);
    			delete *it;
    			*it = NULL;
    		}
    		delete ptr;
    		ptr = NULL;
    	}
    	/*
    	 * 遍历Trie树
    	*/
    	void tranverse(Node *ptr) {
    		vector<Node *>::iterator it;
    		if(ptr == NULL) return;
    		for(it = ptr->child.begin(); it != ptr->child.end(); it++) {
    			if(*it) cout<<(*it)->ch;
    			if(*it && (*it)->type != COMPLETED) {
    				tranverse(*it);
    			}
    		}
    		cout<<endl;
    	}
    public:
    	/*
    	 * 向trie树中插入单词word
    	*/	
    	void insertNode(string word) {
    		Node *ptr = root;
    		string::iterator it;
    		int pos;
    		for(it= word.begin(); it != word.end(); it++) {
    			pos = index(*it);
    			if(ptr->child[pos] == NULL) {
    				ptr->child[pos] = newNode(*it);
    			}
    			ptr = ptr->child[pos];
    		}
    		ptr->type = COMPLETED;
    	}
    	/*
    	 * 在Trie树中删除单词word
    	*/
    	void removeNode(string word) {
    		Node *ptr = root;
    		Node *del;
    		int pos;
    		pos = index(word[0]);
    		ptr = ptr->child[pos];
    		while(ptr) {
    			del = ptr;
    			ptr = ptr->child[pos];
    			delete del;
    		}
    		root->child[pos] = ptr;
    	}
    
    	Trie() {
    		root = newNode('@');       //创建根结点
    	}
    	~Trie() {
    		delTrie(root);
    	}
    	/*
    	 * 在Trie树中查找单词word,找到返回true,否则返回false
    	*/
    	bool find(const string &word) {
    		Node *ptr = root;
    		string::const_iterator it;
    		int pos;
    		for(it = word.begin(); it != word.end(); it++) {
    			pos = index(*it);
    			if(ptr->child[pos] == NULL) break;
    			ptr = ptr->child[pos];
    		}
    		return it == word.end() && ptr->type == COMPLETED;
    	}
    	void tranverse() {
    		tranverse(root);
    	}
    };
    void main() {
    	cout<<"Trie树查询系统V1.0"<<endl;
    	Trie t;
    	string word;
    	string::const_iterator it;
    	clock_t start, finish;
    	double duration;
    	while(true) {
    		cout<<"请输入要查询的英语单词(输入exit退出):";
    		cin>>word;
    		for(it = word.begin(); it != word.end(); it++) {
    			if(isupper(*it) || islower(*it)) continue;
    			else {
    				cerr<<"输入单词非法!"<<endl;
    				exit(1);
    			}
    		}
    		if(word == "exit" ) break;
    		start = clock();
    		if(t.find(word) == false) {
    			cerr<<"您输入的单词未查找,现在向trie树插入该单词."<<endl;
    			t.insertNode(word);
    			continue;
    		}
    		finish = clock();
    		duration = (double)(finish - start) / CLOCKS_PER_SEC;
    		cout<<word<<"已经查到, 查找时间是: "<<duration<<"秒"<<endl;
    	}
    }


     

    三 测试:

    作者:wangzhicheng2013 发表于2013-1-6 21:37:29 原文链接
    阅读:0 评论:0 查看评论

        
    最新技术文章:
    ▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
    ▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
    ▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
    ▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
    ▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
    ▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
    ▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
    ▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
    ▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
    ▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
    ▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
    ▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
    ▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
    ▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
    ▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
    ▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
    jquery iis7站长之家
    ▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
    ▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
    ▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
    ▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
    ▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
    ▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
    ▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
    ▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
    ▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
    ▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
    ▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
    ▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
    ▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3