mm_loenglish模式-MFC CScrollView 映射模式为MM_LOENGLISH 双缓冲

问题描述

MFC CScrollView 映射模式为MM_LOENGLISH 双缓冲
我想在MFC中应用双缓存技术来消除闪烁,代码如下(为了测试,先只画了一条直线):
void CDblBufTestView::OnDraw(CDC* pDC)
{

CDC dcMem;
dcMem.CreateCompatibleDC(pDC); //创建与视图的设备相兼容的内存设备
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDCrect.rightrect.bottom); //创建一个与视图兼容的位图
CBitmap* pOldBmp=dcMem.SelectObject(&bmp);

dcMem.FillSolidRect(0030002000WHITE);

dcMem.MoveTo(2020);
dcMem.LineTo(40100);
dcMem.LineTo(50200);
dcMem.LineTo(200500);

pDC->BitBlt(00rect.Width()rect.Height()&dcMem00SRCCOPY);
dcMem.SelectObject(pOldBmp);
dcMem.DeleteDC();
}

其中,为了窗口有滚动条,CConfigGraph的基类设为了CScrollView
为设置滚动条,重写了OnInitialUpdate,如下
void CDblBufTestView::OnInitialUpdate()
{
CSize siz(200010000);
SetScrollSizes(MM_LOENGLISHsiz);
SetTimer(TIME110NULL);
}

运行后不显示在OnDraw中画的直线,查看之后发现是坐标系的问题,将OnInitialUpdate函数中的MM_LOENGLISH修改为MM_TEXT即可显示出直线。

但是我想应用MM_LOENGLISH,请问应该怎么修改,才能正常显示?(我尝试过修改画直线的坐标为
dcMem.MoveTo(-20-20);
dcMem.LineTo(-40-100);
dcMem.LineTo(-50-200);
dcMem.LineTo(-200-500);
但是还是不能显示。)

解决方案

MM_LOENGLISH 每个逻辑单位转换为0.01英寸。 正x是在右侧;正y启用。 你的坐标画出来太小了。

解决方案二:
我上面的坐标打错了,x左边都是正值
dcMem.MoveTo(20-20);
dcMem.LineTo(40-100);
dcMem.LineTo(50-200);
dcMem.LineTo(200-500);
我试下你的方法看行不行

解决方案三:
试试:DPtoLP(&point);??????????? //将设备坐标转换为逻辑坐标

时间: 2024-10-28 00:10:15

mm_loenglish模式-MFC CScrollView 映射模式为MM_LOENGLISH 双缓冲的相关文章

windows映射模式

1.什么是映射模式: 当Windows应用程序在其客户区绘制图形时,必须给出在客户区的位置,其位置用x和y 两个坐标表示,x表示横坐标,y表示纵坐标.在所有的GDI绘制函数中,这些坐标使用的是一 种"逻辑单位".当GDI函数将输出送到某个物理设备上时,Windows将逻辑坐标 转换成设备坐标(如屏幕或打印机的像素点).逻辑坐标和设备坐标的转换是由映射模式决 定的.   2.windows中为什么要用到映射模式机制? 映射模式的使用可以实现图形绘制的设备无关性.比如在默认MM_TEXT模

MFC打印预览、映射模式、坐标变换

MFC提供了一个框架性的打印和打印预览功能代码,它的基本思想是将实际显示和打印文档的代码合二为一,即都由此文档关联的CView中的OnDraw(CDC *pDC)来处理,由MFC框架根据用户的操作来决定传进来的pDC是指向屏幕还是打印机,当pDC指向屏幕设备,就在屏幕上显示文档, 当指向打印机设备时就打印文档.这些都很好理解,但是,当我们要打印预览时,传进来的pDC就有些特别了.因为打印预览是在屏幕上进行的,所以通常我们会认为这时传进来的pDC一定也是属于屏幕DC一类的.但是其实不然,这个pDC

windows程序设计(五)---映射模式(转换设备坐标和逻辑坐标)

在窗口指定位置显示图形或文字,我们使用的坐标单位是象素,称之为设备坐标.看下面语句: pDC->Rectangle(CRect(0,0,200,200)); 画一个高和宽均为200个象素的方块,因为采用的是默认的MM_TEXT映射模式,所以在设备环境不一样时,画的方块大小也不一样,在1024*768的显示器上看到的方块会比640*480的显示器上的小(在不同分辨率下的屏幕象素,在WINDOWS程序设计一书中有示例程序可以获得,或者可以用GetClientRect函数获得客户区的矩形大小.在这里就

Windows 映射模式

一. 映射模式这是一个初级话题,但好像很多人都没有弄明白,因为几乎每过几天就有人发帖问这个.半年前有人问我这个问题时就想写这篇文章了,但一直觉得没有时间(因为除了学习.工作和玩耍,几乎就没有多少空时间了).本文现在其实只能算着< Programming Windows >中关于"映射模式"的加工,以咱们中国读者更易懂的方式写出:我将逐步往其中添加一些相关内容. 首先,从一个十分简单但又很常用的函数开始: BOOL TextOut( HDC hdc , // handle t

Windows映射模式及相关问题的解决

Windows应用程序绘制图形时使用的是一种逻辑单位,每个逻辑单位的大小由映射模式决定, 这个逻辑单位既可以与设备单位(屏幕或打印机上的一个像素点)相同,也可以是一种物理单 位(如毫米),还可以是用户自定义的一种单位.在Windows应用程序中,只要与输出有关系,都 要使用映射模式.本文的目的是帮助读者了解映射模式的一些基本知识,并对在使用中经常 出现的一些问题提出解决方案. 一.映射模式基本知识 当Windows应用程序在其客户区绘制图形时,必须给出在客户区的位置,其位置用x和y 两个坐标表示

浅析php设计模式之数据对象映射模式_php实例

php中的设计模式中有很多的各种模式了,在这里我们来为各位介绍一个不常用的数据映射模式吧,希望文章能够帮助到各位. 数据映射模式使您能更好的组织你的应用程序与数据库进行交互. 数据映射模式将对象的属性与存储它们的表字段间的结合密度降低.数据映射模式的本质就是一个类,它映射或是翻译类的属性或是方法到数据库的相应字段,反之亦然. 数据映射的作用(工作)就在于能对双方所呈现出的信息的理解,并能对信息的存取进行控制,如根据存储在数据表中的信息 重建新的域对象,或是用域对象的信息来更新或删除数据表中的相关

MFC基于对话框模式下使用鼠标在Text Control控件中画图

问题描述 MFC基于对话框模式下使用鼠标在Text Control控件中画图 想在MFC对话框的Text Control控件窗口中用鼠标画图,但是没有反应.我是自己添加了OnLButtonDown和OnLButtonUp函数. void CKdu_CompressDlg::OnLButtonDown(UINT nFlags,CPoint point) { CWnd *pWnd=GetDlgItem(IDC_STATIC_IMG); HWND hwnd=pWnd->GetSafeHwnd(); m

PHP设计模式之:数据映射模式教程

之前的几种设计模式,都是大大提高了PHP代码的可读性.可维护性.但是,在WEB应用中还有更重要的需求与挑战,那就是:数据库应用.可之前的设计模式,都没有涉及于此.今天写到的,数据映射模式就是能够更好的组织应用程序与数据库进行交互.博主这两天也是花了点时间对,这种模式有了那么一点的了解.斗胆在这个里献丑,按照自己的理解,写一点东西与大家分享,互相学习.当然说到数据映射模式,就不得不提到对象关系映射(Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多.   嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射