想写一个画K线图的程序。
要把一个窗口分成2半,上面画K线,下面画成交量,并且希望使上下两半的空间大小可以用鼠标来拖动改变,想上半部分大一些就大一些,想下半部分大一些就大一些。
现在用单文档多视图来解决.
现在初步已经实现了这个.但是遇到以下几个问题,求教.
谢谢!1、如何使上、下两个视图保持一定的比例?比如说K线图占2/3,成交量占1/3,改变窗口大小的时候,这个比例也不变。现在我实现的程序中,程序刚运行起来的时候,能够保持这个比例,但是一旦最大化窗口后,上下比例就改变了。(见前两张图)
   这个地方的代码是这样的,请大家帮忙看看:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
{
    /*
    return m_wndSplitter.Create(this,
        2, 1,               // TODO: adjust the number of rows, columns
        CSize(10, 10),      // TODO: adjust the minimum pane size
        pContext);
        */
    RECT crect;
    GetClientRect(&crect);
    int kWindowHeight = crect.bottom*2/3;
    VERIFY(m_wndSplitter.CreateStatic(this, 2, 1));
    VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTestView),
                                    CSize(0, kWindowHeight), pContext));
    VERIFY(m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CVolumeView),
                                    CSize(0, 0), pContext));
    return TRUE;}2、我现在是先在一个视图中把所有的K线画一遍,然后再在另一个视图中把所有的成交量画一遍。如果想要:画一根K线,再画一根成交量图;然后再画一根K线,再画一根成交量图;……;这样一根一根画,这个怎么实现?3、如果当前窗口只能显示一部分K线图,那我想用翻页键来往前翻,怎样做到往前翻一页的时候,一个视图里的K线翻到前面了,另一个视图中的成交量也能相对应的翻过去?4、现在很多股票软件都支持十字光标,就是当鼠标点到某一天的K线上时,出来一个十字线。我现在使用了两个视图,怎样实现这个十字线的功能,使得当鼠标点在K线上的时候,十字线能够在当天的成交量上也有显示;反过来当鼠标点在成交量上的时候,K线上也有十字线。(十字线的样子见图)5、我知道可以在单文档单视图上画K线和成交量,在单视图上,我希望这两部分的空间可以用鼠标来变动,可以吗?应该怎样实现?

解决方案 »

  1.   

    1. 你重载一下CMainForm的OnSize, 在里面重新设置一下就可以了,这样,当窗口一旦有变化,会自动重新分配的。 
    其他的我还没学到, 不能帮上你了。。 
      

  2.   

    第1个问题,楼上说的很明白了
    两个视图之间的联系通过CDocument类来实现第2个问题,可以通过定时器,定时触发UpdateAllViews,在视图的OnUpdate中每次只画一条线。举例,第3个问题
    你可以在CDocument类中申明一个成员变量来保存视图的偏移量,这两个视图都以这个偏移量来显示
    如果其中一个视图翻页了,就修改这个偏移量,然后通过CDocument的UpdateAllViews来通知其它视图,你在其它视图类的OnUpdate中同步翻页即可第4个问题类似,在文档试图类中保存当前选中日期第5个问题,不明白你的意思