我想你可以把那结位图变换为图标应该没有这些问题了,加载图标的方法和加载位图的方法差不多。
……
HICON hicon;
ihcon=AfxGetApp()->LoadIcon(IDI_ICON);
……
ClientDC.DrawIcon(,,);
_____________________________
另外也可以绘制透明区域位图,这样也不会看到后面的矩形区域了。这个代码有时间再给你写了,这二天太忙了。

解决方案 »

  1.   

    你可以画透明位图,例如让灯泡的外边白框为透明的,不就行了;
    透明位图实现也不难。
    有一种画透明位图的方法,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。用VC++ MFC实现的代码如下:
    /*
    这是一个用来画透明位图的函数
    CDC *pDC 需要画位图的CDC指针
    UINT IDImage 位图资源ID
    Crect &rect 指定位图在pDC中的位置
    COLORREF rgbMask 位图的透明色
    */
    void DrawTransparentBitmap(CDC *pDC, UINT IDImage,Crect &rect, COLORREF rgbMask)
    {
    CDC ImageDC,MaskDC;Cbitmap Image,*pOldImage;
    Cbitmap maskBitmap,*pOldMaskDCBitmap ;Image.LoadBitmap(IDImage);
    ImageDC.CreateCompatibleDC(pDC);
    pOldImage=ImageDC.SelectObject(&Image);MaskDC.CreateCompatibleDC(pDC);
    maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
    pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );ImageDC.SetBkColor(rgbMask);
    MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );ImageDC.SetBkColor(RGB(0,0,0));
    ImageDC.SetTextColor(RGB(255,255,255));
    ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);MaskDC.SelectObject(pOldMaskDCBitmap);
    ImageDC.SelectObject(pOldImage);
    }void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);Cbitmap BmpBack,*pOldBack,;
    BmpBack.LoadBitmap(IDB_BACKGROUND);CDC dcBack;
    dcBack.CreateCompatibleDC(&dc);
    pOldBack=dcBack.SelectObject(&BmpBack);dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
    DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));dcBack.SelectObject(pOldBack);
    }
    详细请见
    http://download.lycos.com.cn/program/article/vc/vc439.html
      

  2.   

    我知道你的意思了,楼上的说的有道理,用图标可以有透明色,就是那种颜色不显示,出来的就只有灯泡了。
        画透明区原理如下,但那是要自己画的,比较麻烦。
    1。修改灯泡的图片,把灯泡外面部分填充为黑色。
    2。另外生成一张灯泡图片,整个灯泡为黑色,外面部分为白色。
    3。把第二张图片用AND的方式贴到屏幕上某个位置,这时屏幕上就会有一个黑色的灯泡图象。
    4。把第一张图片用OR的方式贴到屏幕上的同一位置,这时屏幕上就会出现你想要的没有矩形框而只有灯泡的图象了。    原理其实很简单,就是位运算:
        假定a 为0或1
        a & 0 = 0;
        1 & 1 = a    a | 0 = a
        a & 0 = 0
      

  3.   

    还是老老实实直接访问Bitmap中的pixel数据,将pixel数据在内存中重新改写。当然我不知道,您的位图是通过哪一种方法画上去的,最好是通过StretchDIBits(...)。如果是资源中的Bitmap,可以通过GetDIBits()得到StretchDIBits()要得到的参数。
      

  4.   

    我的方法是这样的:
    void CVideoSource::Draw(CDC *pDC)
    {
       CBitmap m_Bitmap;
       m_Bitmap.LoadBitmap(IDB_BITMAP_VIDEO);   BITMAP BM;
       CDC MemDC;   MemDC.CreateCompatibleDC(NULL);
       MemDC.SelectObject(&m_Bitmap);
       m_Bitmap.GetObject(sizeof(BM),&BM);
       pDC->BitBlt(m_X1,m_Y1,BM.bmWidth,BM.bmHeight,&MemDC,0,0,SRCCOPY);
    }
    m_X1,m_Y1为左上角的坐标。
    每个图元都有一个Draw函数。