CView::OnMouseActivate这个方法有点问题
2013-09-05 00:33
267 查看
在MFC中,CView及其派生类将显示及其相关的操作做的很好,比如在程序中
如果我们的视图类继承CScrollView了那么我们不用写任何代码该视图就能够
具有滚动的响应机制,能够自动根据设置的滚动范围和窗口实际大小确定是
否显示滚动条(水平或者竖直的),CEditView,CRichEditView等也提供了
相应的在不同实用范围内的一些基本操作处理。
通常在程序中,我们需要处理并且显示一些数据,将显示部分如果放到视图中
的话,我们将可以忽略大部分的窗口交互的细节,将注意力关注在数据的显示
上。
本文是在处理如下的情况中提出的:在数据采集和分析的时候,常常需要观看很
多的数据。我们不可能在程序的主界面上显示。我们需要一个弹出窗口来显示,
可以随时的关闭之,也就是说这样的窗口应该动态的生成,数量不定(这样限制
了我们使用切分视图的选择)。对于这些弹出窗口,我们可以自己写一个CWnd的
派生类,自然这是完全可以的,但是这样要求你可能处理滚动等等的一些列消息(我
曾经在一个显示图像灰度直方图、以及二值图像投影等中遇到过要求这样显示的
情况,当时就是自己从CWnd派生了一个类来显示数据,由于图像比较大,一屏显
示不完整,所以要给窗口加滚动条,这样在处理这些消息上花费了我大量的时间,
而真正显示数据的代码却很少)。因此我也在一直想使用MFC已经封装的非常好的
CView类及其派生类来显示数据。由于我主要用到的就是CScrollView,因此我也
以它为列来讲述怎么用视图。
基于对话框和SDI结构的实现上有不同细节, 必须分开了说:
1、如果你的程序是一个基于对话框的程序的话(指的是如利用MFC向导生成的对话
框程序之类),那么事情就很简单:
首先,很自然的在Insert/New Class中插入一个类,选择CScrollView做基类
假设你自己的视图类命名为CMyScrollView。
在对话框(不论是主界面的对话框还是新弹出的对话框,都一样)的OnInitDialog
中加上如下的代码:
CRect rectWndClient;
GetClientRect(&rectWndClient);
CRuntimeClass *pViewRuntimeClass=RUNTIME_CLASS(CMyScrollView);
CMyScrollView *pView=(CMyScrollView*)pViewRuntimeClass->CreateObject();
pView->Create(NULL,NULL,WS_VISIBLE|WS_CHILD,
rectWndClient,
this,123,NULL);
pView->OnInitialUpdate();
说明:
1)、由于CView及其派生类的构造函数是保护成员,所以采用RuntimeClass方式来构造
对对象,
2)、在Create函数中第一个参数必须有WS_CHILD属性,表明视图是一个子窗口
3)、第四个参数rectWndClient可以视情况,改变,因为你可能只想在对话框的某个区域
创建视图。
4)、第五个参数表明把对话框作为视图的父窗口。
5)、第六个参数是视图的ID可以任意指定一个整数
在创建之后,如果不掉用OnInitialUpdate的话会有错误,这是因为CScrollView类有个保护成员
m_nMapMode,它在CScrollView的构造函数中被置为 0,如下
m_nMapMode = MM_NONE;//在VIEWSCRL.CPP的115行,MM_NONE是宏, 定义为0
下面是错误的分析原因:
通常窗口是在响应WM_PAINT的时候绘制客户区。所有的视图都派生自CView,他们的的WM_PAINT响应函数如下
void CView::OnPaint() //在VIEWCORE.CPP 176行
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
可见,在绘图之前虚函数OnPrepareDC会被调用,在CScroolView中重写了这个虚函数,这个虚函数的
开头部分如下
ASSERT_VALID(pDC);
#ifdef _DEBUG
if (m_nMapMode == MM_NONE)
{
TRACE0("Error: must call SetScrollSizes() or SetScaleToFitSize()");
TRACE0("\tbefore painting scroll view.\n");
ASSERT(FALSE);
return;
}
#endif //_DEBUG
可见如果m_nMapMode是0(在构造函数中被默认置为0)的话将在调试程序的时候错误
所以通常应该在调用OnInitialUpdate的时候(注意:OnInitialUpdate被声明为CView的public成员函数,但是用MFC向导产生自己派生类的OnInitialUpdate函数的时候被声明成了protect,你可以将它改成public,然后调用OnInitialUpdate来初始化自己的视图,或者在构造函数中设置m_nMapMode为自己想要的映射模式)初始化一些东西,并且设置m_nMapMode的正确值,m_nMapMode的一个典型值就是
MM_TEXT(关于映射模式可以看有关文章或者书详细介绍)。
如果我们的视图类继承CScrollView了那么我们不用写任何代码该视图就能够
具有滚动的响应机制,能够自动根据设置的滚动范围和窗口实际大小确定是
否显示滚动条(水平或者竖直的),CEditView,CRichEditView等也提供了
相应的在不同实用范围内的一些基本操作处理。
通常在程序中,我们需要处理并且显示一些数据,将显示部分如果放到视图中
的话,我们将可以忽略大部分的窗口交互的细节,将注意力关注在数据的显示
上。
本文是在处理如下的情况中提出的:在数据采集和分析的时候,常常需要观看很
多的数据。我们不可能在程序的主界面上显示。我们需要一个弹出窗口来显示,
可以随时的关闭之,也就是说这样的窗口应该动态的生成,数量不定(这样限制
了我们使用切分视图的选择)。对于这些弹出窗口,我们可以自己写一个CWnd的
派生类,自然这是完全可以的,但是这样要求你可能处理滚动等等的一些列消息(我
曾经在一个显示图像灰度直方图、以及二值图像投影等中遇到过要求这样显示的
情况,当时就是自己从CWnd派生了一个类来显示数据,由于图像比较大,一屏显
示不完整,所以要给窗口加滚动条,这样在处理这些消息上花费了我大量的时间,
而真正显示数据的代码却很少)。因此我也在一直想使用MFC已经封装的非常好的
CView类及其派生类来显示数据。由于我主要用到的就是CScrollView,因此我也
以它为列来讲述怎么用视图。
基于对话框和SDI结构的实现上有不同细节, 必须分开了说:
1、如果你的程序是一个基于对话框的程序的话(指的是如利用MFC向导生成的对话
框程序之类),那么事情就很简单:
首先,很自然的在Insert/New Class中插入一个类,选择CScrollView做基类
假设你自己的视图类命名为CMyScrollView。
在对话框(不论是主界面的对话框还是新弹出的对话框,都一样)的OnInitDialog
中加上如下的代码:
CRect rectWndClient;
GetClientRect(&rectWndClient);
CRuntimeClass *pViewRuntimeClass=RUNTIME_CLASS(CMyScrollView);
CMyScrollView *pView=(CMyScrollView*)pViewRuntimeClass->CreateObject();
pView->Create(NULL,NULL,WS_VISIBLE|WS_CHILD,
rectWndClient,
this,123,NULL);
pView->OnInitialUpdate();
说明:
1)、由于CView及其派生类的构造函数是保护成员,所以采用RuntimeClass方式来构造
对对象,
2)、在Create函数中第一个参数必须有WS_CHILD属性,表明视图是一个子窗口
3)、第四个参数rectWndClient可以视情况,改变,因为你可能只想在对话框的某个区域
创建视图。
4)、第五个参数表明把对话框作为视图的父窗口。
5)、第六个参数是视图的ID可以任意指定一个整数
在创建之后,如果不掉用OnInitialUpdate的话会有错误,这是因为CScrollView类有个保护成员
m_nMapMode,它在CScrollView的构造函数中被置为 0,如下
m_nMapMode = MM_NONE;//在VIEWSCRL.CPP的115行,MM_NONE是宏, 定义为0
下面是错误的分析原因:
通常窗口是在响应WM_PAINT的时候绘制客户区。所有的视图都派生自CView,他们的的WM_PAINT响应函数如下
void CView::OnPaint() //在VIEWCORE.CPP 176行
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
可见,在绘图之前虚函数OnPrepareDC会被调用,在CScroolView中重写了这个虚函数,这个虚函数的
开头部分如下
ASSERT_VALID(pDC);
#ifdef _DEBUG
if (m_nMapMode == MM_NONE)
{
TRACE0("Error: must call SetScrollSizes() or SetScaleToFitSize()");
TRACE0("\tbefore painting scroll view.\n");
ASSERT(FALSE);
return;
}
#endif //_DEBUG
可见如果m_nMapMode是0(在构造函数中被默认置为0)的话将在调试程序的时候错误
所以通常应该在调用OnInitialUpdate的时候(注意:OnInitialUpdate被声明为CView的public成员函数,但是用MFC向导产生自己派生类的OnInitialUpdate函数的时候被声明成了protect,你可以将它改成public,然后调用OnInitialUpdate来初始化自己的视图,或者在构造函数中设置m_nMapMode为自己想要的映射模式)初始化一些东西,并且设置m_nMapMode的正确值,m_nMapMode的一个典型值就是
MM_TEXT(关于映射模式可以看有关文章或者书详细介绍)。
相关文章推荐
- CView::OnMouseActivate这个方法有点问题
- bash shell 有点难啊?谁有什么方法吗?帮我看看下面这个问题啊
- 这个世上,你能想到解决问题的方法,别人早就想到了,而你还没想到的方法,别人也很有可能想到了,剩下的事就是想办法从书里把它找出来
- 关于make: *** No rule to make target `clean'. Stop.这个莫名其妙问题的解决方法
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- 最近开发老遇到莫名其妙的问题,dialog自定义大小,setAttributes这个方法没反应是肿么一回事
- qt4.7解决mysql无法连接问题(这个方法是错误的)
- 安装Mysql提示1045错误解决方法(这个问题我纠结好几个小时,终于解决了!)
- CS2018: Unable to find messages file 'cscui.dll' 这个问题的解决方法!
- require.async换这个方法的transport问题
- java基础问题-----数组有没有length()这个方法? String有没有length()这个方法
- 到了“Windows 正在启动……”界面后就不动了 这个问题的解决方法
- 031 二进制1的数量(keep it up, 看到这个问题,刚开始有点蒙)
- AMD处理器安装RVDS2.2破解方法 (找了很久,该贴终于解决这个问题)
- 最近开发老遇到莫名其妙的问题,dialog自定义大小,setAttributes这个方法没反应是肿么一回事
- 因为项目的需要,近日调研了一下在 Windows Phone 手机上播放H264裸码流的方法,期间参考了大量的网络资源,最终得以解决这个问题,对如此具有钻研和奉献精神的他们表示诚挚的感谢!
- ”IIS发布问题“,最近项目总是出这个问题,这儿保存一下解决方法
- Java写贪吃蛇游戏,用双缓冲重写update方法解决了闪烁问题,有出现了这个问题……
- 您能看出这个生成缩略图的方法有什么问题吗?
- 关于java代码中的注释问题。(类中方法的注释,我们一般都要写上这个方法的文档(doc),方法的参数也要有它的文档)