具体问题是这样的:
基于对话框的VC程序,需要画图,画图范围可能在3000*40000的范围内。想问如何实现。
(1)我需要在什么上面画图?
(2)范围是动态可变的,也就是要有缩放和扩大功能,如何实现???
希望专家能给出具体步骤!!!
基于对话框的VC程序,需要画图,画图范围可能在3000*40000的范围内。想问如何实现。
(1)我需要在什么上面画图?
(2)范围是动态可变的,也就是要有缩放和扩大功能,如何实现???
希望专家能给出具体步骤!!!
解决方案 »
- 错误 31 error LNK2001: unresolved external symbol __imp__floor
- SetWindowPos 不能改变VS2005的z-order
- 获取和端口号关联的应用程序
- 我做了一个单文档程序,现在要在视图中输出很多实时信息,一行一行输出
- 请问如何获取各个进程的CPU使用%
- 为什么在CDialogBar控制的对话框里放的按钮在没有MainFrame响应消息时是灰色的?
- IDispatch 应该怎样使用
- 我这个网页上的文件是什么格式呢
- ★★★懂VC++的来下,帮忙看看这个程序,谢谢了!!!★★★在线等★★★
- Problem of changing CTime to COleDateTiem
- 如何让自己派生的CComboBox类响应回车事件
- VS2010和afx.h的问题 急!!
这些是不是LZ需要的:
VC绘图的方法
vc绘图函数
VC双缓冲绘图
另外图像处理可以用CxImage等开源库。
之前有同学本科毕设就是那样子的,我还有源码,感觉不错
毕竟3000*40000我最大可以放到3000*16000在CView或者CScrollView上用GDI或者GDI+面画即可
因为你的图像尽寸还不算太多,内存中装得下。至于滚动,那更好处理。
把区域设置成和你的图片的范围一样大, 根据滚动条的位置,考虑上偏移量,直接在全范围绘图就行了。 注意,刷 出来时,一定要指定clip为当前绘图窗口。
否则,刷屏会变慢。
再写一个类 描述当前的视区(即当前视区等价于你的虚拟坐标系中的哪个矩形), 这个类需要提供几个重要的方法, 就是:
1。 将虚拟坐标系中的坐标转化为屏幕坐标。
2。 左移,右移,上移,下移视区
3。 放大,缩小视区。
看起来很难,其实这个类相当简单 ,因为这个类仅仅定义了视区,和GDI无关,成员就一个浮点数矩形。现在你只剩下3件事情:通过第一个类添加你所有的线段
通过第二个类将所有的线段转化为屏幕坐标并画出来, 超出屏幕范围的直接不画。
关于滚动条, 你拉滚动条,不是在移动什么东西,不需要,拉滚动条只需要调用第2个类的移动方法
//结构声明typedef struct tagVECTOR2D
{
float x;
float y;
}VECTOR2D;typedef struct tagFLOATRECT
{
float left;
float top;
float right;
float bottom;
}FRECT;typedef struct tagLINENODE
{
VECTOR2D coord;
COLORREF color;
DWORD style;
//.... 直线样式等
}LINENODE;//第一个类class CLineManager
{
public:
CLineManager();
~CLineManager(); // 添加,删除直线
void AddLine(LINENODE);
void DeleteLine(int);
void DeleteLine(int, int); void DrawLines(CViewport viewport); // 发挥你的GDIprivate:
std::list<LINENODE> Lines;
};//第二个类
class CViewport
{
public:
CViewport();
~CViewport(); // 通过vp,给出一个VECTOR2D,一个需要画在窗口的区域,算出窗口中的点。。我太懒 不想计算了。。请谅解!!
POINT GetPointInWnd( VECTOR2D point, RECT Wnd );
void MoveViewport( VECTOR2D direction );
void ScaleViewport(float scale);private:
FRECT vp;
};// 貌似第二个类应该写在第一个前面
那就设置一个Timer,随时监测最右边的点,通过调用CViewport类的MoveViewport来实现
(当然,如果你是采用的我的方法的话)