具体问题是这样的:
基于对话框的VC程序,需要画图,画图范围可能在3000*40000的范围内。想问如何实现。
(1)我需要在什么上面画图?
(2)范围是动态可变的,也就是要有缩放和扩大功能,如何实现???
希望专家能给出具体步骤!!!

解决方案 »

  1.   

    用GDI画图?windows绘图就是在窗口的DC上画图。
    这些是不是LZ需要的:
    VC绘图的方法
    vc绘图函数

    VC双缓冲绘图
    另外图像处理可以用CxImage等开源库。
      

  2.   

    仿照画地图的那种方式么???Google地图的样子??
    之前有同学本科毕设就是那样子的,我还有源码,感觉不错
      

  3.   

    这个偶也有成品,撇开双环冲不说,我认为难点还是坐标映射,和滚动轴映射。
    毕竟3000*40000我最大可以放到3000*16000在CView或者CScrollView上用GDI或者GDI+面画即可
      

  4.   

    包括基本绘图,双缓冲画图, CStatic上画图,坐标变换等,我都有一定基础了。现在已经能实现在可见窗口区上画图了,但是没有解决画图越界,放大缩小等问题!
      

  5.   

    这个我已经实现了,我定义了一个数组POINT P[9999]来记录每个点,一个变量int i来表示当前有i个有效数据并作为数组的下标。用PolyLine(P,i)来绘图。现在的难点是窗口的放大和缩放问题!!!
      

  6.   

    VC双缓冲绘图就行了,缩放也方便。
    因为你的图像尽寸还不算太多,内存中装得下。至于滚动,那更好处理。 
    把区域设置成和你的图片的范围一样大, 根据滚动条的位置,考虑上偏移量,直接在全范围绘图就行了。 注意,刷 出来时,一定要指定clip为当前绘图窗口。
    否则,刷屏会变慢。
      

  7.   

    照你的图来看  下面是我的建议  因为我也做过这类程序  我认为最完美的方法 希望采纳自己写几个类  先写一个类,建立一个虚拟的2D坐标系,封装所有线段的起点和终点(这两个点的坐标不是屏幕坐标!是虚拟坐标系的)及颜色。
    再写一个类  描述当前的视区(即当前视区等价于你的虚拟坐标系中的哪个矩形), 这个类需要提供几个重要的方法, 就是:
    1。 将虚拟坐标系中的坐标转化为屏幕坐标。
    2。 左移,右移,上移,下移视区
    3。 放大,缩小视区。
    看起来很难,其实这个类相当简单 ,因为这个类仅仅定义了视区,和GDI无关,成员就一个浮点数矩形。现在你只剩下3件事情:通过第一个类添加你所有的线段
    通过第二个类将所有的线段转化为屏幕坐标并画出来, 超出屏幕范围的直接不画。
    关于滚动条, 你拉滚动条,不是在移动什么东西,不需要,拉滚动条只需要调用第2个类的移动方法
      

  8.   

    这个思路很节约的, 不管你屏幕是多大 10000000*10000000都无所谓,把刚才的思路简单的写一下吧。。
    //结构声明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;
    };//  貌似第二个类应该写在第一个前面
      

  9.   

    肯定要使用GDI啊 这个问题GDI根本就不是重点  坐标变换, 数学 才是重点
      

  10.   

    谢谢direct4d 的回复。我先理解一下您的思路和代码。遇到难点再向各位请教。
      

  11.   


    那就设置一个Timer,随时监测最右边的点,通过调用CViewport类的MoveViewport来实现
    (当然,如果你是采用的我的方法的话)