希望在CScroolView中连续的输出图形,并且要求能连续查看所有的该次任务的所有历史输出,但是当坐标值超出32767时,绘图便出现问题。对此MDSN的解释是
Note Under Windows 95, all screen coordinates are limited to 16 bits. Therefore, an int passed to a CDC member function must lie in the range –32768 to 32767.
我用的是VC++6,操作系统是XP,不是95啊,怎么也有这个限制!!在StdAfx.h中预定义
#ifndef WINVER
#define WINVER 0x0500
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0500
#endif还是不行,请教各位高手,能否给个解决的办法???
Note Under Windows 95, all screen coordinates are limited to 16 bits. Therefore, an int passed to a CDC member function must lie in the range –32768 to 32767.
我用的是VC++6,操作系统是XP,不是95啊,怎么也有这个限制!!在StdAfx.h中预定义
#ifndef WINVER
#define WINVER 0x0500
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0500
#endif还是不行,请教各位高手,能否给个解决的办法???
解决方案 »
- EVC 图像浏览器
- 出错,#include "game_fg.h"后调用不了,这个头文件里面的函数
- 在静态文本CStatic上加载了一个位图,点击图片,如何以该点为中心在图片上绘制一个红色矩形框?
- treectrl 滚动条的自绘
- 请问一个关于GPRS拨号上网条件下与HTTP的登陆问题?
- 高分求解,一个非常基础的问题
- 关于了list控件中某项的排序问题(附代码)
- 在 WINDOWS 的任务管理器的程序应用标签页隐藏自己的程序?
- 有关光盘问题
- MFC 想实现这样的功能,绘制一个窗口,鼠标除了双击事件其他全部穿透给桌面
- 100分求解,不够在加,如何如将压缩格式的avi转成bmp,请高手指点
- 有关ftp客户端程序,FtpCommand如何使用?怎样才能获得与服务器端的连接状态?
SetViewportOrg(hDC, 0, 0);
SetViewportExt(hDC, (CRect.right - CRect.left) / 2, \ (CRect.bottom - CRect.top) / 2); /* Set Window Origin and Extent such that total logical */
/* coordinate system will cover entire client area */ SetWindowOrg(hDC, -32767, -32767);
SetWindowExt(hDC, 32767, 32767);
MM_LOMETRIC
MM_HIMETRIC
MM_TEXT
MM_LOENGLISH
MM_TWIPS Two standard mapping modes, MM_ISOTROPIC and MM_ANISOTROPIC, are not used for CScrollView. 我的CScroolView的mapmode是MM_TEXT,所以不能使用SetViewExt()和SetWindowExt
CWnd::GetScrollInfo(SB_HORZ,&info);
Note that the WM_HSCROLL message carries only 16 bits of scroll box position data. Thus, applications that rely solely on WM_HSCROLL (and WM_VSCROLL) for scroll position data have a practical maximum position value of 65,535. However, because the SetScrollInfo, SetScrollPos, SetScrollRange, GetScrollInfo, GetScrollPos, and GetScrollRange functions support 32-bit scroll bar position data, there is a way to circumvent the 16-bit barrier of the WM_HSCROLL and WM_VSCROLL messages. See GetScrollInfo for a description of the technique.
MSDN里说MM_ISOTROPIC 不支持CScrollView,
但我现在因为精度和坐标系问题想在MM_ISOTROPIC模式下绘图,又想使用滚动条,有没有办法解决?
要解决,我的办法是 生成自己的 CScrollView类,主要代码可以直接拷贝过来, 主要修改:对滚动条的控制主要用了GetPos/SetPos. 这个函数只支持 16位POS值,要改为:
GetScrollInfo, SetScollInfo.函数主要要修改 UpdateScrollBar 和对滚动条消息的响应。 OnScrollBy 等函数。通过这样的修改,确实可以将滚动范围扩展到32值,但是CDC好象也不支持32位的坐标, 所以绘图的时候要自己计算偏移量,并在合适的位置绘图。这样处理后,就能实现32位的坐标了。
你试试这样画:int PRECISION=1000;//精度,你自己随便设,现在是1000:1
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(PRECISION,PRECISION);
pDC->SetViewportExt(1,1);pDC->LineTo(100*PRECISION,200*PRECISION);
pDC->Rectangle(300*PRECISION,300*PRECISION,500*PRECISION,500*PRECISION);
pDC->TextOut(200*PRECISION,200*PRECISION,"Xzdfgdgsdgdfg");PRECISION是设置的精度,这样你逻辑坐标输出1000个点,设备DC只输出一个点的长度,相当于把图像缩小了。如果把SetWindowExt和SetViewportExt的值换一下则起到相反的效果,但这样精度就低了(相当于把图像放大了)。我都是用这种方式画的图,几万都没关系。
VC中int是4个字节的,范围应该在-2^31到+2^31之间,应该足够你画图了~