本人刚接触vc编程,想实现一个这样的功能.
CBitmap bitmap;void onPaint()
{
    CPaintDC dc(this);
    CDC bitmapDC;
    bitmapDC.CreateCompatibleDC(&dc);
    CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
    dc.BitBlt(0, 0, bmpInfo.bmWidth - 100, bmpInfo.bmHeight - 100,&bitmapDC, 0, 0, SRCCOPY);
}
void onButton()
{
//在这里面得到当前窗体位图
 bitmap = ```````````//这里要该怎么做?}其实我就是想实现:我本来在窗提画了很多东西,但一刷新就不在了,现在就需要在刷新前保存以前画的,在刷新的时候在把以前画的东西画上去.各位大虾帮忙看看,我才学很多不知道,请各位不吝赐教,分数好说.

解决方案 »

  1.   

    在 ONBUTTON 里调用 ONPAINT()不就好了?
    刷新怎么会刷掉画的东西呢?除非是你使程序发送了没有经过处理的WM_PAIN消息我也是菜鸟,仅供参考
      

  2.   

    我把部分程序贴上来吧,现在只要一移动窗体或触发全屏刷新,以前画的就不在:(
    void CDrawTest12Dlg::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(mouseStyle)
    {
    case 0:
    break;
    case 1:
    case 2:
    isDraw = TRUE;
    nPointStart = point;
    break;
    case 3:
    isDraw = FALSE;
    nPointStart = point;
    break;
    }
    CDialog::OnLButtonDown(nFlags, point);
    }void CDrawTest12Dlg::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(mouseStyle)
    {
    case 0:
    break;
    case 1:
    case 2:
    isDraw = FALSE;
    nPointEnd = point;
    break;
    case 3:
    isDraw = TRUE;
    nPointEnd = point;
    break;
    }
    Invalidate(FALSE);
    CDialog::OnLButtonUp(nFlags, point);
    }void CDrawTest12Dlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    switch(mouseStyle)
    {
    case 0:
    break;
    case 1:
    case 2:
    nPointEnd = point;
    break;
    case 3:
    break;
    }

    Invalidate(FALSE);
    // TODO: Add your message handler code here and/or call default
    }void CDrawTest12Dlg::OnPoint() 
    {
    // TODO: Add your control notification handler code here
    mouseStyle = ERASER;
    eraserWidth = 4;
    isDraw = FALSE;
    }void CDrawTest12Dlg::OnButton4() 
    {
    // TODO: Add your control notification handler code here
    nPenStyle = PS_SOLID;
    crColor = RGB(0,255,255);
    nWidth = 2;
    }void CDrawTest12Dlg::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting //test();
    if(isFirstPaint)
    {
    drawCavnes();
    isFirstPaint = FALSE;
    }
    if(isDraw)
    {
    CPen pen;
    CPoint line[2];
    switch(mouseStyle)
    {
    case 0:
    break;
    case 1:
    pen.CreatePen(nPenStyle, nWidth, crColor);
    dc.SelectObject(&pen);
    line[0] = nPointStart;
    line[1] = nPointEnd;
    nPointStart = nPointEnd;
    dc.Polyline(line, 2);
    break;
    case 2:
    pen.CreatePen(nPenStyle, eraserWidth, RGB(255,255,255));
        line[2];
    dc.SelectObject(&pen);
    line[0] = nPointStart;
    line[1] = nPointEnd;
    nPointStart = nPointEnd;
    dc.Polyline(line, 2);
    break;
    case 3:
    dc.MoveTo(nPointStart);
    dc.LineTo(nPointEnd);
    break;
    }
    }
    // TODO: Add your message handler code here
    // Do not call CDialog::OnPaint() for painting messages
    }
      

  3.   

    要想使你画的内容能够恢复,最好是在画的时候将它保存!
    可以使用CArchive类进行处理,也可以使用CObList进行处理!
      

  4.   

    你是在哪画的那些东西?
    直接放在OnPaint()函数里面
    这样重画的时候也会画上你画的东西
      

  5.   

    应该定义一个成原变量,把画的东西保存下来,然后在OnDraw里重绘,因为窗口重绘OnPaint()里会调用OnDraw()。
      

  6.   

    直接放在OnPaint()函数里面楼上的真牛啊,你知道什么时候会触发OnPaint()事件吗??
      

  7.   

    什么时候触发OnPaint()事件不用你教 
    以前做过实时曲线 历史曲线方面的 只是没太明白楼主意思 想的有点简单
      

  8.   

    怎么把已经画的东西保存下来呢?难道我画了100条直线就要用100对point值把他们保存下来?我的想法就把画的窗体位图保存下来,不怎么做,当然也不知道行不:(
      

  9.   

    可能是我表述不够清楚,大家可以把代码copy来试试就知道情况了.现在是可以在上面画很多东西了,但只要一全屏刷新上面的东西就没有了:(
      

  10.   

    创建一个内存DC,我记得在SDK中好像是CreateCompatibleDC(CreateCompatibleBitmap),这俩个函数看看,我觉得是将你的图像BitBlt到内存中,然后用的时候再从内存中还原(OnPaint后再BitBlt)
      

  11.   

    楼楼上的,什么是序列化?要怎么做?~~~~~
    wzbhbb() :
        GetClientRect(&rectClient);
        memDC.CreateCompatibleDC(&dc);
        memBitmap.CreateCompatibleBitmap(&dc, rectClient.right, rectClient.bottom);
        memBitmap就是得到的位图么?但好像得不到呢?!
      

  12.   

    用BitBlt将你的当前位图拷贝到内存中
      

  13.   

    要画的时候才用拷贝到内存中去吧?我现在刚才做的只是得到对么?我把memBitmap声明成了一个成员变量.但好象画的时候还是不行.
      

  14.   

    CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
    ------------------------------
    bitmap申明成成员变量就行了.
      

  15.   

    这样说吧,你的操作是在对象与窗体之间建立的,所以说在OnPaint后会出现图像消失。我上面的意思是将你的图片放到内存中(SDK中我是CreateCompatibleDC,CreateCompatibleBitmap,SelectObject,BitBlt,一步步的做下去),这样图片信息保存在内存中,就可以对图像进行任意操作(包括BitBlt进其它任意设备中),其中最关键的是对BitBlt的理解,建议搂主看看SDK中关于位图的操作,那里介绍的最详细了,呵呵!
    CreateCompatibleBitmap是创建与设备内容兼容的位图,它只创建了一个模版,其中并没有位图信息
      

  16.   

    楼上的什么意思?SelectObject(&bitmap);不是设置位图到DC中去么?
    我现在做的是
    在这个
    CPaintDC dc(this);
    CRect rectClient;
    GetClientRect(&rectClient);   
        //draw cpu free usges
        
        memBitmap.CreateCompatibleBitmap(&dc, rectClient.right, rectClient.bottom);//得到位图
    -------------------------------------------------------

    void CDrawTest12Dlg::test()
    {
    CPaintDC dc(this); // device context for painting
       
    CRect rectClient; memDC.CreateCompatibleDC(&dc);
        memDC.SelectObject(&memBitmap);
    dc.BitBlt(rectClient.left, rectClient.top, rectClient.right, rectClient.bottom,
            &memDC, 0, 0, SRCCOPY);
    }
    画位图
    但不对:(
      

  17.   

    你画的东西有自己的属性,定义几个变量保存属性,再定义一个动态数组保存你所画的内容。在OnDraw()里绘制。
      

  18.   

    这个你写的有点问题啊,你可以定义一个MemDC,把所有的东西在memdc里画,最后dc.bitblt(..,..,..,..,&MemDC,..)。意思就是你前边的所有的东西都是在内存里画的,知道最后才把内存贴出来,这样有一个好处就是还可以防止闪烁。
    如果你想要保存变量的画得在DOC里操作。看看文档操作一章!