-
windows 程序设计
2011-07-24 21:16:30一个Windows的.EXE文件中有使用到的不同动态链接库的参考数据,所使用的函数即在那些动态链接库中。当Windows程序被加载到内存中时,程序中的呼叫被指向DLL函数的入口。如果该DLL不在内存中,就把它加载到内存中。 ... -
MFC分割窗口
2013-04-10 17:25:01像windows系统打开我的电脑时,一般是看到左边是个树形的目录结构,右边就是文件目录或有哪几个盘啊. 这样的页面是怎样实现的呢? 主要是通过类CSplitterWnd来实现的.下面来简单讲下它的用法 先创建一个SDI项目. 再...我们经常看到一些页面被划分成几大块.最简单的就是分成左右两在块.像windows系统打开我的电脑时,一般是看到左边是个树形的目录结构,右边就是文件目录或有哪几个盘啊.
这样的页面是怎样实现的呢?
主要是通过类CSplitterWnd来实现的.下面来简单讲下它的用法
先创建一个SDI项目.
再添加类CMyFrm(该类继承自CFormView,实际上只要是继承自CView的类都行的.)
MainFrm.h
CSplitterWnd m_wndSplitter;
//这是一个CWnd中的虚函数,窗口的分割就在该函数中完成.哎它怎么被调用的就先不去管了,反正MFC里经常莫名其妙的跑出来一个回调函数,你看不到是在哪里被调用的,
//系统背后偷偷的就调用它了
BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
///MainFrm.cpp///
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){
m_wndSplitter.CreateStatic(this,1,2); //这里表示把窗口分成1行两列,也就是把一个窗口分成两半了.如果要分成竖着的三部分就是CreateStatic(this,1,3);横着的三部分就是
//CreateStatic(this,3,1);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyFrm),CSize(100,100),pContext); //把窗口的左边部分用某个继承自View的类绑定起来.
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyFrm),CSize(100,100),pContext); //把窗口的右边部分用某个继承自View的类绑定起来.
return TRUE;
}
-
MFC windows程序设计(第三版)课后习题第七章
2019-10-14 13:36:597-1 鼠标消息分哪两类,它们之间有什么区别? 答:根据产生鼠标消息时鼠标光标所处的位置,鼠标消息分为:客户区鼠标消息和非客户区鼠标消息两类。 在应用程序窗口中,用户可以绘图的部分叫做客户区或者用户区,而除此之外...7-1 鼠标消息分哪两类,它们之间有什么区别?
答:根据产生鼠标消息时鼠标光标所处的位置,鼠标消息分为:客户区鼠标消息和非客户区鼠标消息两类。
在应用程序窗口中,用户可以绘图的部分叫做客户区或者用户区,而除此之外的区域叫非客户区。
鼠标在客户区产生的消息叫客户区鼠标消息,在非客户区产生的消息叫非客户区鼠标消息。7-3 在程序设计中,如何使用非客户区鼠标消息?
答:首先,在主框架窗口类的声明中手工添加非客户消息响应函数的声明,然后在主框架窗口类实现文件的消息映射表中添加消息映射,最后在主框架窗口类的实现文件中,添加鼠标响应函数并实现它。
7-9 编写一个
(1)
//添加数据成员 class CM7_9Doc : public CDocument { // Attributes public: CPoint p1,p2; int flag; }; void CM7_9View::OnDraw(CDC* pDC) { CM7_9Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CClientDC dc(this); p1.x = 300; p1.y = 300; if(flag == 0){ pDC->Ellipse(pDoc->p2.x+50,pDoc->p2.y+50,pDoc->p2.x-50,pDoc->p2.y-50); } else{ pDC->Ellipse(p1.x+50,p1.y+50,p1.x-50,p1.y-50); } } //单击鼠标左键 圆放大 void CM7_9View::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); p1.x = 350; p1.y = 350; dc.Ellipse(p1.x+100,p1.y+100,p1.x-100,p1.y-100); CView::OnLButtonDown(nFlags, point); } //单击鼠标右键 圆变小 void CM7_9View::OnRButtonDown(UINT nFlags, CPoint point) { InvalidateRect(NULL,TRUE); CClientDC dc(this); p1.x = 350; p1.y = 350; dc.Ellipse(p1.x+50,p1.y+50,p1.x-50,p1.y-50); CView::OnRButtonDown(nFlags, point); } void CM7_9View::OnMouseMove(UINT nFlags, CPoint point) { CM7_9Doc* pDoc = GetDocument(); //按下crtl 同时移动鼠标 圆跟着鼠标移动 if(nFlags&MK_CONTROL){ flag = 0; pDoc->p2 = point; InvalidateRect(NULL,true); } CView::OnMouseMove(nFlags, point); }
7-12
class CM7_12Doc : public CDocument { public: CRect rect; }; CM7_12Doc::CM7_12Doc() { rect.left = 200; rect.right = 400; rect.top = 200; rect.bottom =300; } void CM7_12View::OnDraw(CDC* pDC) { CM7_12Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CClientDC dc(this); dc.Rectangle(pDoc->rect); // TODO: add draw code for native data here } void CM7_12View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CM7_12Doc* pDoc = GetDocument(); CRect client; GetClientRect(&client); switch(nChar){ case VK_LEFT: pDoc->rect.left -=10; pDoc->rect.right -=10; break; case VK_RIGHT: pDoc->rect.left +=10; pDoc->rect.right +=10; break; case VK_UP: pDoc->rect.top -=10; pDoc->rect.bottom -=10; break; case VK_DOWN: pDoc->rect.top +=10; pDoc->rect.bottom +=10; break; case VK_HOME: pDoc->rect.left -=10; pDoc->rect.top -=10; break; case VK_END: pDoc->rect.bottom +=10; pDoc->rect.right +=10; break; } InvalidateRect(NULL,true); CView::OnKeyDown(nChar, nRepCnt, nFlags); } void CM7_12View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CM7_12Doc *pDoc = GetDocument(); pDoc->rect.left = 200; pDoc->rect.right = 400; pDoc->rect.top = 200; pDoc->rect.bottom = 300; InvalidateRect(NULL,true); CView::OnLButtonDown(nFlags, point); }
-
windows xp,vista,win7启动修复;自动修复XP/VISTA/WIN7系统引导
2011-01-18 20:21:59当只有一个NT5.x系统,修复后BCD中显示的NT5.x相应菜单则为类如"Microsoft Windows Server 2003 x86"格式 不修复NT5.x的Boot.ini和NT6.x的BCD中的多余的启动菜单 因为精简版的精简程度无从判断,所以不保证能修复... -
MFC的程序框架剖析
2015-03-05 09:53:19MFC通过给我们提供好一些已经订制好的窗口类,我们不需要自己再设计窗口类,只需要到那些订制好的窗口类“仓库”中寻找一种适合我们需要的窗口类就可以了,然后通过AfxRegisterClass函数注册窗口类。还需要说明的是... -
VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:
2009-06-17 10:17:32对于应用程序,使用CXPButton类的途径相对于对话框窗口和普通窗口分成两种: ① 对话框窗口中,直接将原先绑定按钮的CButton类替换成CXPButton类,或者在绑定变量时直接指定Control类型为CXPButton,如图3所示: ... -
PinPKM-V201525(官网发布的最后一个免费无使用限制版本)
2015-11-08 09:58:08知识点:增加文件可以以独立的窗口打开,例Word文档在Word中打开 修正:新增知识点默认分类的可能出错,以“全部数据库”的方式显示时,缺省数据库以外的分类被选取仍可能出错 版本2.6.1.0更新时间:不详 增加批量... -
清华大学的计算机网络课件
2010-03-26 11:11:56安装到电脑上以后用WINDOWS的资源管理器发现在该磁盘的“属性”中只有74.5 G。是不是商店出了差错? 问题1-10:在教材的1.4.1节中有这样一段话:人们愿意将“带宽”作为数字信道的“数据率”的同义语。这样说有何... -
wps2000最经典的办公软件+注册码
2013-08-19 01:54:29WPS 2000 在提供了符合标准 Windows 95 界面的菜单、工具条、状态行、多文档窗口用户界面的同时,文档窗口的水平和垂直两个方向的标尺可方便地用于排版操作,并在文档各个对象上支持上下文相关的右键快捷菜单。... -
专家门诊 Visual C++开发答疑300问 pdf书(含全部代码)
2009-11-16 22:20:23两个类互为成员应该如何声明 bool和BOOL有什么区别 GlobalAlloc(),malloc()和new()有什么区别 如何使用关键字volatile 如何实现int与CString,char*与CString,float与CString之间的互相转化 什么是UNICODE以及如何... -
Visual C++ 2008入门经典--详细书签版
2013-02-02 16:07:158.5.3 使用有多个形参的类模板 382 8.6 使用类 384 8.6.1 类接口的概念 384 8.6.2 定义问题 384 8.6.3 实现CBox类 385 8.6.4 使用CBox类 400 8.7 组织程序代码 403 8.8 字符串的本地C++库类 405 8.8.1 创建... -
Visual C++ 2008入门经典--源代码及课后练习答案
2013-02-02 16:13:258.5.3 使用有多个形参的类模板 382 8.6 使用类 384 8.6.1 类接口的概念 384 8.6.2 定义问题 384 8.6.3 实现CBox类 385 8.6.4 使用CBox类 400 8.7 组织程序代码 403 8.8 字符串的本地C++库类 405 8.8.1 创建... -
单例模式详解
2016-10-10 21:55:11如,我们在使用windows的任务管理器时,弹出的始终是一个窗口, 这里如果对象采用多实例模式,那么就会弹出多个窗口,会出现下述两种情况: 第一,如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态...单实例
我们在设计某些类时,根据需求,有时只需要一个实例,不想过多浪费内存,这就可以通过单实例的方式。
如,我们在使用windows的任务管理器时,弹出的始终是一个窗口,
这里如果对象采用多实例模式,那么就会弹出多个窗口,会出现下述两种情况:
第一,如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,
容易使用户误解,不知道哪一个才是真实的状态,这与需求不符;
第二,如果这些窗口显示的内容完全一致,则是重复对象,意味着浪费内存资源。
因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。单实例的特点及实现
单实例模式,应该有如下特点:
第一,这个类只能创建一个对象;
第二,这个类必须自行创建这个对象;
第三,这个类创建的对象必须在整个系统都可以使用。
单实例上述特点的实现方式:
第一,是这个类只提供私有的构造函数;
第二,是这个类定义中含有一个该类的静态私有对象;第三,是这个类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
思考:
Singleton模式经常和Factory(AbstractFactory)模式在一起使用,
因为系统中工厂对象一般来说只要一个
单实例的具体代码实现
需要考虑:
第一,只有一个对象,则需要禁止copying行为(包括拷贝和赋值)。
第二,如果是动态申请资源,则需要考虑资源的释放。
第三,多线程安全,即同一时刻多个线程调用这个函数会不会出现程序异常。
(1) 懒汉式
懒汉式的方式就是延迟加载,即定义一个指向该类的私有指针,
直到用到实例的时候才进行对象的创建,并把对象地址赋值给这个指针。
第一种方式:申请的资源手动释放
############# Test.h #############class Test { public: //获取单例指针 static Test* getInstance(); //销毁单例资源 注:必须在所有线程结束后,进程结束前调用, 或不调用 static void destroyInstance(); private: //防止外部构造和析构 Test(); ~Test(); //防止拷贝和赋值, 只声明实现 Test(Test&); Test& operator=(Test&); private: //全局唯一对象指针 static Test* m_pTest; //针对m_pTest的全局锁,实现创建单实例线程安全, 锁的封装,参考本博客线程锁的封装 static Lock m_sLock; };
############# Test.cpp #############Test* Test::m_pTest = NULL; Lock Test::m_sLock; /* * 构造函数 */ Test::Test() { } /* * 析构函数 */ Test::~Test() { } //创建单实例对象 Test* Test::getInstance() { Test::m_sLock.mutexLock(); if(m_pTest == NULL) { m_pTest = new(std::nothrow) Test; } Test::m_sLock.mutexUnlock(); return m_pTest; } //销毁Test, 注:必须在所有线程结束后,进程结束前调用 void Test::destroyInstance() { Test::m_sLock.mutexLock(); delete m_pTest; m_pTest = NULL; Test::m_sLock.mutexUnlock(); }
说明:
1. 创建实例,getInstance()2. 销毁实例,destroyInstance()
3. 在懒汉式的单例类中,其实有两个状态,单例未初始化和单例已经初始化。
假设单例还未初始化,有两个线程同时调用getInstance方法,这时执行 m_pTest == NULL 肯定为真,
然后两个线程都初始化一个单例,最后得到的指针并不是指向同一个地方,
不满足单例类的定义了,所以懒汉式的写法会出现线程安全的问题!
在多线程环境下,要对其进行修改,例如,上面进行加锁处理,
以此来保证只有一个实例。
4. 构造函数为私有的好处:
禁止用户对此类型的变量进行定义,即禁止在类外创建此类型的对象。
5. 析构函数为私有的好处:
禁止用户在程序中使用 delete 删除此类型对象。
对象的删除只能在类内实现,也就是说只有类的实现者才有可能实现对对象的 delete,
用户不能随便删除对象。如果用户想删除对象的话,只能按照类的实现者提供的方法进行。
第二种:申请的资源自动释放(这种方式有点多余,程序结束,系统自动回收内存,只是一种思考)
############# Test.h #############class Test { public: //获取单例指针 static Test* getInstance(); private: //防止外部构造和析构 Test(); ~Test(); //防止拷贝和赋值, 只声明实现 Test(Test&); Test& operator=(Test&); class Garbo //它的唯一工作就是在析构函数中删除Test的实例 { public: ~Garbo() { if(Test::m_pTest) { delete Test::m_pTest; } } }; private: //全局唯一对象指针 static Test* m_pTest; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数 static Garbo m_sGarbo; //针对m_pTest的全局锁,实现创建单实例线程安全, 锁的封装,参考本博客线程锁的封装的文章 static Lock m_sLock; };
############# Test.cpp #############Test* Test::m_pTest = NULL; Garbo Test::m_sGarbo; Lock Test::m_sLock; /* * 构造函数 */ Test::Test() { } /* * 析构函数 */ Test::~Test() { } //创建单实例对象 Test* Test::getInstance() { Test::m_sLock.mutexLock(); if(m_pTest == NULL) { m_pTest = new(std::nothrow) Test; } Test::m_sLock.mutexUnlock(); return m_pTest; }
说明:
1.创建实例,getInstance()
2.不需要手动释放资源,通过静态对象m_sGarbo的析构函数自动释放
第三种:(推荐使用方式)
补充:
已初始化的的全局变量和局部静态变量存放在data段,未初始化的全局变量和局部静态变量一般存放在bss段里,
前者在生产可执行文件时就分配好内存了,后者在加载时才分配。
注意:
所谓static对象指的是内存在data段和bss段中的对象.这类对象在整个程序的生命周期内都是存在的,除非程序结束否则会一直存在,
利用static关键字声明的对象是static对象中的一种,但是如果是在函数内部定义的static对象,那么这种static对象被称为local static对象,
除此之外的则是non-local static对象,比如:global作用域内的static对象,namespace作用域内的static对象,
类作用域内使用static关键字声明的对象,file作用域内的static对象等.
local static对象的一个特性就是不会在编译的时候自动初始化,然后在调用函数的时候碰到local static对象定义的时候才会对其进行初始化。
从另外一个角度来看,任何一种 non-const static 对象,不论是local 或者non-local ,在多线程环境下“等待某事发生”都会有麻烦。
处理这个麻烦的做法是:(1) 可以在程序的单线程启动阶段手工调用;(2) 也可以通过加锁的方式解决多线程的问题。
############# Test.h #############class Test { public: //获取单例指针 static Test* getInstance(); private: Test(); ~Test(); //防止拷贝和赋值, 只声明实现 Test(Test&); Test& operator=(Test&); };
############# Test.cpp #############/* * 构造函数 */ Test::Test() { } /* * 析构函数 */ Test::~Test() { } /* * 单实例实现 */ Test* Test:getInstance() { static Test instance; //局部静态变量 return &instance; }
说明:
1.使用单例getInstance()
2.不用资源释放问题
(2) 饿汉式饿汉式的方式是一开始就加载了,以空间换时间,即定义一个静态的私有对象。不存在多线程问题。
class singleton { protected: singleton() {} private: static singleton* p; public: static singleton* initance(); }; singleton* singleton::p = new singleton; singleton* singleton::initance() { return p; }
-
基于C++开发的射击游戏
2013-04-30 16:53:16精灵图实际上是将所有帧的图片放在一个文件中,游戏时靠一个RECT来控制画图像文件中的哪一部分,进而控制游戏显示哪一帧图,只需控制好RECT的位置即可。如下图: 控制RECT的四个角的坐标的移动,有以下代码: ... -
基于AT89S52 单片的频率计
2010-01-04 08:47:37单片机的起振电路是有晶振和两个小电容组成的。 晶振的作用:它结合单片机内部的电路,产生单片机所必须的时钟频率,单 片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越 高,那单片机的运行... -
2004-2010软考程序员真题
2012-09-27 12:33:0012、把Windows 98的窗口和对话框作一比较,窗口可以移动和改变大小,而对话框 A)既不能移动,也不能改变大小 B)仅可以移动,不能改变大小 C)仅可以改变大小,不能移动 D)既能移动,也能改变大小 13、在... -
针式PinPKM-V201506(免费无使用限制)
2015-10-18 11:25:51知识点:增加文件可以以独立的窗口打开,例Word文档在Word中打开 修正:新增知识点默认分类的可能出错,以“全部数据库”的方式显示时,缺省数据库以外的分类被选取仍可能出错 版本2.6.1.0更新时间:不详 增加批量... -
针式PinPKM-V201502(免费无使用限制)
2015-10-18 11:24:30知识点:增加文件可以以独立的窗口打开,例Word文档在Word中打开 修正:新增知识点默认分类的可能出错,以“全部数据库”的方式显示时,缺省数据库以外的分类被选取仍可能出错 版本2.6.1.0更新时间:不详 增加批量... -
Disk Savvy v12.0.26 64位.zip
2019-07-14 15:23:41你能够清楚的知道在这一目录下是哪类文件占用了很大的空间,以及每类文件各有多少个。 要得到这个结果首先需要指定某个目录,然后给软件一段时间让他扫描,不过时间不会很长,比起我用过的另一款软件来说这款已经... -
C#微软培训教材(高清PDF)
2009-07-30 08:51:1710.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 .124 11.1 方法的声明.124 11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 ... -
程序天下:JavaScript实例自学手册
2018-07-08 12:59:5512.16 设置新打开的窗口为活动窗口 12.17 页面随窗口的改变而改变 12.18 幻灯片式弹出窗口 12.19 弹出窗口生成器 12.20 关不掉的警告框 12.21 循环的警告框 12.22 屏蔽状态栏的错误提示 12.23 获取模式窗口的值 第13... -
c#学习笔记.txt
2008-12-15 14:01:21另外我发现论坛上学习Java的人都非常的有个性,当有人问起学习哪种语言更好时,他会打出几百个“JAVA”来,填满整个屏幕,也不说是为了什么。我觉得这样做未免有些太霸道了,如果你说这叫偏执狂我也不反对,虽然我... -
Visual Studio程序员箴言--详细书签版
2012-10-16 20:37:39CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 Visual Studio程序员箴言 原书名: Microsoft Visual Studio Tips 原出版社: Microsoft Press 作者: (美)... -
C#微软培训资料
2014-01-22 14:10:1710.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 .124 11.1 方法的声明.124 11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 ... -
计算机应用技术(实用手册)
2011-07-29 16:32:16开机画面现在有两种,一种为AMI公司开发的,一种为Phoenix-award两家公司合并共同开发的;下面这张图为Phoenix-award开机自画面: Phoenix-award workstation BIOS V6.00PC,An Energy star Ally copyright(c) 1984... -
计算机网络常见问题解答
2010-06-07 08:19:11安装到电脑上以后用WINDOWS的资源管理器发现在该磁盘的“属性”中只有74.5 G。是不是商店出了差错? 问题1-10:有这样的说法:习惯上,人们都将网络的“带宽”作为网络所能传送的“最高数据率”的同义语。这样的说法... -
网管教程 从入门到精通软件篇.txt
2010-04-25 22:43:49如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart 创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。 diskpart [ /add |/delete] [device_... -
软件工程教程
2012-07-06 23:10:29两种典型的建模工具 : 1.IBM Rational Rose 2.Microsoft Office Visio IBM Rational Rose Microsoft Office Visio Visio是一个图表绘制程序,可以帮助用户描述复杂设想以及系统的业务和技术图表。使用... -
易语言程序免安装版下载
2011-04-07 09:28:50支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。 使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib... -
微软Sysinternals Suite工具包 2018.12.18 官方版.zip
2019-07-09 18:07:08用好Windows Sysinternals Suite里的工具,你将更有能力处理Windows的各种问题,而且不花一毛钱。 Sysinternals之前为Winternals公司提供的免费工具,Winternals原本是一间主力产品为系统复原与资料保护的公司,...
-
libFuzzer视频教程
-
西南科技大学《微机原理与接口技术》4套历年期末考试试卷(含答案).pdf
-
使用PHPWord生成word文档
-
Oracle_11g_Linux到Linux_DataGuard部署
-
docker 基本组成
-
中国近现代史纲要课后习题答案及备考题库.pdf
-
微慕博客小程序开源版二次美化
-
自动化测试Python3+Selenium3+Unittest
-
如何解决数据库提示只有只读权限,无法操作的问题 what
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
中国计量学院《微机原理及其应用》5套期末考试试卷(含答案).pdf
-
刑法--期末复习知识点总结.pdf
-
Java 9 逆天的十大新特性
-
用微服务spring cloud架构打造物联网云平台
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
西南科技大学《自动控制原理》试题库(含答案).pdf
-
【爱码农】C#制作MDI文本编辑器
-
西南科技大学电路分析基础试题库汇编.pdf
-
分而治之的分治思想
-
Nump学习之np.empty()函数