我想做一个可以让用户自己设计界面的软件,就需要用户自己画图。但是遇到一个问题,如何才能通过内存dc在画面上显示多个图呢?我现在是把图的信息存在数组中,改变位置什么的就改变数组的信息,用ontimer来不断绘制。但是就是在ontimer中不能绘制出来,求解

解决方案 »

  1.   

    直接在OnPain里画就好了嘛
    位置,大小等要用变量x,y,w,h才行OnTimer仅仅只是计算x,y,w,h等的变化
    然后发送WM_PAINT消息而已
      

  2.   


    CBitmap bitmap[10];for(int i=0; i<10; i++)
    {
    VERIFY(bitmap[i].LoadBitmap(IDB_BITMAP1 + i));
    }void CXXXDlg::OnPaint() 
    {
    CPaintDC dc(this);
    CDC memDC;
    VERIFY(memDC.CreateCompatibleDC(&dc));
    CRect rect;
    GetClientRect(&rect);
    BITMAP bmp;
    CRect rc = rect;
    for(int i=0; i<10; i++)
    {
    CBitmap* pOldBitmap = (CBitmap*)memDC.SelectObject(&bitmap[i]);
    bitmap[i].GetBitmap(&bmp);

    if(rc.top + bmp.bmHeight <= rect.bottom)
    {
    dc.BitBlt(rc.left, rc.top, bmp.bmWidth, bmp.bmHeight, &memDC, 0, 0, SRCCOPY);
    rc.top += bmp.bmHeight;
    }
    }
    memDC.DeleteDC();
    }
      

  3.   

    怎么我用兔子党的代码的时候,会在m_bitmap2[i].GetBitmap(&bmp);
    这里出错的.....(我把bitmap改为了m_bitmap2,作为一个成员变量)。谢谢你们的回答,但是因为我是新手。我原来的想法是在ontimer里面画,每隔1毫秒画一次(因为我画的内容不多),然后画出一些位图是可以移动的。麻烦大家详细点,最好有源代码~~
      

  4.   

    对于1楼的回答,我想问是用哪个函数呢?在哪里有可以设置x,y,w,h的?因为我看很多都是只是载入的...
    我还有个问题就是,把图画画到内存dc里面,怎么显示到屏幕上。我看也有很多人问这个问题,但是有点我看不懂。我想再粗俗的问问,应该解决2点。1,怎么确定图已经画到了内存dc;2,怎么再画到屏幕??谢谢
      

  5.   

    如果你的图片是一样大小的
    可以考虑CImageListCImageList xx;
    xx.Create(宽,高,ILC_COLOR24|ILC_MASK,1,1);bmp.LoadBitmap(IDB_1);
    xx.Add(&bmp,RGB(255,255,255));
    ........
    xx.LoadBitmap(IDB_n);
    xx.Add(&bmp,RGB(255,255,255));然后在OnTimer里
    CDC *xDC=GetDC();
    xx.Draw(&xDC,iIndex,CPoint(x,y),ILD_BLEND50);iIndex就是第几幅图片
    CPoint(x,y)就是显示的开始坐标
      

  6.   


    x,y,w,h是你自己定义的,就是说你不要用20啊30啊这种死位置
    1.内存dc.或者内存dc->
      就一定是画到了内存dc
    2.在OnPain()里画系统自己会送到屏幕至于,你要实例嘛,等一下我上传一个源代码
    然后给你地址自己去下
      

  7.   

    请别说我灌水,因为真的比较多问题原谅无知的新手吧~~
    现在我的代码如下,但是真的很闪。请问怎么才是用了内存dc,怎么修改,请指正,谢谢
    void Ctese2View::OnTimer(UINT_PTR nIDEvent)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CBitmap bmpDraw;
    BITMAP bmpInfo;
    CDC cdc;
    CRect rect;
    GetClientRect(&rect);
    CClientDC dc(this);
    cdc.CreateCompatibleDC(&dc);
    dc.FillSolidRect(&rect,RGB(255,255,255));
    for(int i=0;i<10;i++)
    {
    if(butdata[i].position.x!=-1&&butdata[i].position.y!=-1)
    {
    if(bmpDraw.m_hObject)bmpDraw.DeleteObject();
    bmpDraw.LoadBitmap(IDB_BOTTUN);
    bmpDraw.GetBitmap( &bmpInfo ); 
    cdc.SelectObject(&bmpDraw);
    dc.BitBlt(butdata[i].position.x,butdata[i].position.y,rect.Width(),rect.Height(),&cdc, 0, 0, SRCCOPY );
    }
    }
    }
      

  8.   

    范例传上来了,你去下吧
    http://download.csdn.net/source/3495311
      

  9.   

    1张图多个部分和多张图没区别的这样吧,重新给你个多张图的,等你看明白你就知道了
    http://download.csdn.net/source/3495676
    这个是多张图片的我敢肯定,将来你绝对不会用这种低级的方式的
      

  10.   

    http://download.csdn.net/source/3495676
      

  11.   

    我覺得我的問題應該是和以下這個差不多的,但是我用了他那裡一個代碼卻不行...http://topic.csdn.net/t/20040102/16/2627205.html
      

  12.   

    http://topic.csdn.net/t/20040102/16/2627205.html
      

  13.   

    好了。。十分谢谢gz_qmc(二农戏猪) 的一直帮助,也谢谢回答问题的朋友。谢谢大家~~