我需要画星座图:
我在对话框里加了一个picture 的控件,然后添加了一个空白的bitmap给它。
但是我想画图,却画不出来?首先请教,如何得到这个bitmap的宽与高?
CBitmap::GetBitmapDimension 这个函数只能之前用CBitmap::SetBitmapDimension
后,才有效。但这个bitmap是在resource里加的,它的大小怎么得到?

解决方案 »

  1.   

    把你的bitmap选进dc然后用这个dc作图
      

  2.   

    同意楼上的建立一个内存DC,把Bitmap选进,然后利用这个dc作图,然后把这个dc再复制到显示区域里。
    关于bitmap,如果你对位图的操作比较多,还不太了解它的用法的话。
    建议找一个CDib类来完成这个工作。
      

  3.   

    CDC *pDC=GetDC();
    pDC->CreateCompatibleDC(m_pDC);
    //载入位图
             m_pBitmap->LoadBitmap(IDB_BITMAPCON1);
    //下面三行无效
    CSize SizeBitmap = m_pBitmap->GetBitmapDimension();
    m_iMaxX = SizeBitmap.cx;
    m_iMaxY = SizeBitmap.cy;
    //随便给了两个值
              m_iMaxX = 300;
    m_iMaxY = 250;         m_pDC->SelectObject(m_pBitmap);
             pDC->SetPixel(50,100,RGB(50,225,100));
    m_pDC->BitBlt(0,0,m_iMaxX,m_iMaxY,pDC,0,0,SRCCOPY);
    有什么问题吗?         
      

  4.   

    比如在位图指定区域加上文本
    CDC dc;
    dc.CreateDC("DISPLAY",NULL,NULL,NULL);
    CBitmap bm;
    if(!bm.LoadBitmap(IDB_BITMAP1))
    {
    return false;
    }
    BITMAP pbitmap;
    bm.GetBitmap(&pbitmap);
    CDC tdc;
    int Width = pbitmap.bmWidth;
    int Height = pbitmap.bmHeight;
    tdc.CreateCompatibleDC(&dc);
    CBitmap *pOld = tdc.SelectObject(&bm);
    tdc.TextOut(90,154,"hello");
      

  5.   

    to photoman,很感谢,不过,我还是什么都没显示出来,很郁闷:(我把这部分加在了对话框初始化函数里,是不是可以?我是要做一个星座图,也就是画个坐标及一些点,但必须是实时地显示。在对话框里加位图这样显示,好不好?需不需要一个VIEW类?或者,可以换成别的控件显示?恳请再指点一下!
      

  6.   

    出来了,出来了,
    原来是少了下面一句
    dc.BitBlt(nX, nY, pbitmap.bmWidth, pbitmap.bmHeight, &tdc, 
             0, 0, SRCCOPY);可是,还是有问题,显示的东西是在我的对话框外面,根本没和我添加的picture control
    发生联系,怎么回事?
    这个CDC类,搞的我很糊涂,什么叫做设备上下文(没有更好的翻译?)?
    看了半天MSDN,还是没理解透。按理说,我的控件加进去了,并给了一个CBitmap的对象,他俩就应该是一体的啊,
    我对这个对象画图,也就应该是对这个控件画图啊,可是没有,为什么?
    CDC最后的显示,应该是在我的对话框里进行的啊,也就是说,他的显示应该有个范围,不能让他想在哪显示就在哪显示啊。
    显示与画图应该是同步的,为什么要把画图与显示分开呢?
      

  7.   

    我看你这个问题还是自己继承一个CStatic类来做,然后在CStatic::OnPaint()里面自己画好了,然后在你的对话框拖一个static,把类型改成你的派生类(例如CMyStatic).
    CMyStatic::OnPaint()
    {
       CPaintDC dc(this);
       CRect rt;
       GetClientRect(&rt);
       dc.FillRect(&rt,&CBrush(255,0,0));//把你的绘图区域变成红色
    }
    当然为了去闪烁,也可以加上CMemDC。
    看来这位老兄可能对Delphi或者vb比较熟,画布用惯了,vc是挺烦!
      

  8.   

    不用什么位图,如果要去闪烁,加个CMemDC就好了,当然道理是一样,先画在一张位图上,然后一起画到DC上,memdc类到处都有的。
    CMyStatic::OnPaint()
    {
       CPaintDC dc(this);
       CMemDC pDC(dc);
       CRect rt;
       GetClientRect(&rt);
       pDC->FillRect(&rt,&CBrush(255,0,0));//把你的绘图区域变成红色
       .....
    }
      

  9.   

    谢谢小强(看到小强,就觉的亲切^_^)你可真高抬我了,我对DELPHI & VB 更是一窍不通,
    看来俺还是要看看。你的方案我会试试的,
    可现在我想解决掉我目前所面对的问题。
    难道就不能在我的picture控件(bitmap)里直接画图吗?
      

  10.   

    多半你的dc是属于对话框的而不是控件的
    你给你的控件加个control变量试试
      

  11.   

    当然可以了,不过那样你还要考虑你的控件位置的问题,我那种做法,只用关注相对位置就可以了,或者也可以这样,CStatic有个方法是SetBitmap(HBITMAP),你画完了以后把你的位图set一下,然后刷新就可以了。
      

  12.   

    picture控件和static窗口是一样的
    关联一个变量,比如m_picture,记得要把他的id改一下不能是IDC_STATIC
    然后可以用GetDc()获得控件的dc
      

  13.   

    是加一句
    pdc = m_picture.GetDC()吗?不行啊:(
      

  14.   

    CDC * pdc;
    pdc = m_picture.GetDC();
    我试了一下,可以的啊
    什么问题?