孙鑫vc学习笔记:第十一讲 如何使窗口具有滚动条-尊龙官方平台

孙鑫vc学习笔记:第十一讲 如何使窗口具有滚动条

el/2024/3/25 15:52:18

如何使窗口具有滚动条?

本程序的cgraphicview 类是从view类继承的
 class cgraphicview : public cview
首先将基类改成cscrollview
 class cgraphicview : public cscrollview
然后将源文件cpp文件中的cview全部替换成cscrollview
在文件中替换字或词的步骤,
 从菜单中选择 edit->replace,
 在弹出的对话框中再选择 match whole word only(仅全词匹配)
--------------------------------------------------------------------------------
要使窗口可以滚动,还需要设置一些滚动的参数:
用setscrollsizes方法来设置映射模式、滚动视图总的尺寸等等
而这个函数最好在虚函数的重载函数oninitiaupdate里面调用。
这个虚函数在一个视图与一个文档关联之后调用,也就是在窗口完全创建之后第一个调用的函数。
不过它的调用是在ondraw函数调用之前。所以这个函数可以做一些窗口创建之后的初始化工作。

 void cgraphyicview::oninitialupdate()
 {
  cscrollview::oninitialupdate();
  setscrollsizes(mm_text,csize(800,600));
 }

--------------------------------------------------------------------------------

程序运行之后,将窗口的大小调到小到800*600时,就可以看到滚动条了。
但是我们发现一个问题,先将垂直滚动条下拉一些,然后在窗口右下角画一条直线,将其最小化,还原之后直线的位置上移了,这是什么原因呢?

调试之后,可以断定onlbuttondown与重绘函数ondraw中所画图形的三个要素相同,所以不是它们的问题。

在前面研究窗口重绘为什么调用ondraw函数的时候,
void cview::onpaint()
 {
 // standard paint routine
  cpaintdc dc(this);
  onpreparedc(&dc);
  ondraw(&dc);
 }
发现在调用ondraw之前调用了onpreparedc ,问题就出在这里。 
在mfc资源文件中去查看onpreparedc 发现这样一条代码:pdc->setviewportorg(ptvporg);
调试一下,发现ptvporg=(x=0, y= -150);  可见onpreparedc调整了显示上下文的属性将视口的原点设置为(0,-150),根据公式yviewport=ywindow-ywinorg yvieworg;得到设备点y坐标出现在原先显示地方的上方。
--------------------------------------------------------------------------------
关于解决办法的说明:
首先,绘制图形之后保存坐标点之前调用onpreparedc调整显示上下文的属性,将视口原点设置为(0,-150)然后调用设备坐标转换逻辑坐标函数dptolp将设备坐标(680,390)转换为逻辑坐标,
 根据公式  ywindow=yviewport-yvieworg ywinorg;得到y坐标为540。
窗口重绘时会先调用onpreparedc,调整显示上下文的属性,将视口的原点设置为(0,-150)
然后gdi函数用逻辑坐标点(680,540)绘制图形,被转换为(680,390)

所以解决的办法就是在onlbuttondown函数中,绘制完图形之后,保存图形元素之前 加入下面代码:
 onpreparedc(&dc);
 dc.dptolp(&m_ptorigin); //视口(设备)坐标和窗口(逻辑)
 dc.dptolp(&point);

当滚动条在最上端,窗口发生重绘时onpreparedc调整显示上下文,
会将视口的原点设置为(0,0),而不是(0,-150)
onpreparedc会随时根据滚动窗口的位置来调整视口的原点

我的问题是:
 onpreparedc(&dc); 这句代码在这里是必要的吗?
 将它去掉之后,图形重绘也不会再出现错位现象,
 它在这里似乎没什么作用啊? 
 大家说说你的意见吧!
 欢迎您登录 http://blog.csdn.net/teshorse 留言
 或者写信给我 teshorse@hotmail.com
 


http://www.ngui.cc/el/5126842.html

相关文章

孙鑫vc学习笔记:第十一讲 图形重绘方法二 利用元文件

介绍两种保存图形与重绘图形的方式第一种,要利用要一个类 cmetafiledc第一步创建一个cmetafiledc 对象。接着调用cmetafiledc 构造器,然后再调用create 函数 创建一个设备上下文与cmetafiledc 对象关联起来。 下一步给cmetafiledc 对象发送一系列的cdc命…

选美,为我妹妹投一票,5号选手

2006年33届环球国际小姐中国福建区总决赛,我妹妹是5号选手陈小燕,短信投票占40%啊!感谢您编写短信v5发送到发送至880866(移动:全国有效)、960666(联通:全国有效)、936899…

孙鑫vc学习笔记:第十二讲 介绍常量指针、指针常量,文本、二进制文件

◆指向常量的指针 它指向的内容是常量,不能修改;但是指针本身存放的是指针值,可以修改。 char ch[5]"list" 这种赋值形式只能在数组定义的同时进行。 常量字符串会自动加上/0,所以字符串长度为五 通常,…

孙鑫vc学习笔记:第十二讲 用c语言函数读写文件

c语言中文件写入操作file *pfilefopen("1.txt","w"); //w方式,会销毁打开文件中原先的内容fwrite("i love you",1,strlen("i love you"),pfile); //写入数据-----------------------------------------------------------…

孙鑫vc学习笔记:第十二讲 用c 函数读写文件

c读写文件方法在c中,可以用ofstream类来写入文件,这个类的头文件是 可以用ifstream类来读取文件,ifstream类的用法与ofstream类似

孙鑫vc学习笔记:第十二讲 用api函数、cfile类操作文件

用win32api函数操作文件:1.保存文件 首先用createfile 打开文件,然后调用writefile将数据写入到文件当中。 2.读取文件 首先用createfile 打开文件,然后调用readfile读取数据到ch字符数组中。----------------------------------------…

孙鑫vc学习笔记:第十二讲 往win.ini的文件中写入数据

往win.ini的文件中写入数据 在实际开发程序时,我们经常要把一些初始化信息写入到一个配置文件中,当程序启动的时候读入这些初始化的信息。早期的软件会将这些信息写入一个叫win.ini的文件中(当然现有很多软件将这些信息写到注册表中…

孙鑫vc学习笔记:第十二讲 读写注册表

修改注册表对注册表的操作是通过几个函数完成的。在注册表中,值包含三个部分:值的名称,值的类型,值的本身即数据使用regsetvalue()向注册表写入数据: 注意:regcreatekey只能建立reg_sz型数据,要…

孙鑫vc学习笔记:第十三讲 用carchive类读取与保存文件

介绍一种利用carchive类读取与保存文件的方法: 首先:构造一个cfile对象 然后构造一个carchive对象, 接着就可以用carchive对象的"<<"操作符保存数据,用">>"操作符提取数据 注意:提取数…

孙鑫vc学习笔记:第十三讲 设置文档标题

设置文档标题: 前面我们讲过如何去修改一个程序的图标(在cmainframe类中)、光标、背景(在view类中),没有讲如何修改程序的标题(在前面两个类中都修改不了)。 方法一: 在程序启动的时候,会调用onnewdocume…
网站地图