我在做一个图形实时显示的程序,对话框编程! 
由于事先并不知道数据有多少,绘完后,前面绘的图形可能在控件外而丢失 
因此想加一个Scroll控件,拖动它可以查看前面的图形! 
我现在的想法是:利用内存DC建立一个较大的CBitmap 
将所有曲线绘在CBitmap上,然后根据滑块位置,选择Bitmap的位置,BltBit到dc上 
注意下,使用的是对话框编程,不是单文档,不能用CScrollView; 
这个想法能实现吗?不能的话有其它的实现方法吗? CDC m_MemDCMask; 
CBitmap m_BitmapMask; 
m_MemDCMask.CreateCompatibleDC(GetDC());//创建内存dc 
m_BitmapMask.CreateCompatibleBitmap(&m_MemDCMask,100,100); 
m_MemDCMask.SelectObject(&m_BitmapMask); 程序能编译通过,但一运行就Error 
好像是传给CreateCompatibleDC()的pDC的问题 
CPaintDC dc(this); 
m_MemDCMask.CreateCompatibleDC(&dc);也不行 
改了其它很多方法,用NULL就可以 
但好像此时只能画黑白图 
郁闷了好几天了,求高手解答啊!!

解决方案 »

  1.   

    你是在哪个地方加的代码?一般是需要在程序的窗口形成之后才能用DC.比方说在OnInitDialog()中。否则的话就容易出错。
      

  2.   

    你可以在OnInitDialog()中创建内存位图;在OnPaint中由于多次刷新调用导致重复创建会出错。另外内存位图应该从屏幕DC创建而不是从内存DC创建:
    ...OnInitDialog()
    {
    CClientDC dc(this);
    m_BitmapMask.CreateCompatibleBitmap( &dc, 100, 100 );
    m_MemDCMask.CreateCompatibleDC( &dc );
      

  3.   

    利用内存DC建立一个较大的CBitmap?
    我觉得这个方法不可取 不知道数据具体有多少可以使用CArray类来保存数据(具体就不说了,就是变长数组,Google一下就知道了) 在Dialog上可以添加ScrollBar 来查看以前的数据 但是并不需要建立很大的CBitMap 要知道 你的对话框窗体有多大 你就最多能看到多大的
    图形 即使在内存中建立了比较大的CBitMap也只能显示部分。当使用ScrollBar来滚动显示区域的时候 只要根据ScrollBar的位置在你当前Dialog的可见区域中显示出所要的绘图就行了。另外你创建内存DC的地方出错最可能的原因就是楼上所说的窗口创建前没法GetDC
    在我前面说的方法中也少不了内存绘图 不过是在移动ScrollBar的时候为了防止图像闪烁。
      

  4.   

    #define MAX_NUM 256
    static HDC g_hdc=GetDC(...);
    static HDC g_hdcMem[MAX_NUM];
    static int g_index;RecvThreadProc()
    {
    int   bpp;
    int   width,height;
    RGBQUAD* colortable;
    BYTE* bits;
    HBITMAP hbm;
    BITMAPINFO* bmi;//
    //create hbm & bmi
    //
    g_hdcMem[g_index] = SetDIBits(hbm,bmi,bits);//
    //send redraw message to WndProc
    //
    }WndProc()
    {
    case WM_SCROLL:
    // get g_hdcMem[index] 
    BitBlts();
    }
      

  5.   

    实时绘图是否用Tinary3v0 说得的实现方法好些?
    存成变长数组,每次都重新画,开销是不是很大啊?
    毕竟要实现图形的流动
      

  6.   

    已用Tinary3v0 的方法实现,不过我用的是一个大数组
    没用CArray
    Thank you!