CreateHatchBrush只有预定义的六种,虽然可以定义颜色,可是不行。
CreatePatternBrush倒是可以用位图来创建任意图案画刷了,但是不能自定义颜色,也不行。我不可能为每种颜色都创建一个位图资源的。
看起来只有CreateBrushIndirect,可是试了又试总是不成功,有谁知道该怎么做吗?

解决方案 »

  1.   

    自己用代码造一幅位图(8*8)的,再CreateBrushIndirect
    要不用GDI+,GDI+能满中你的要求的。
      

  2.   

    试过了,画刷能创建,就是颜色不起作用,始终是黑色的。:(
    GDI+,好啊,能说详细点吗?
      

  3.   

    你说的是BrushTypeTextureFill吗?
      

  4.   

    可是,TextureBrush也只跟CreatePatternBrush一样,能得到图案,但是不能设颜色啊。
      

  5.   

    動態創建位圖,填充底色
    怎么做?CreateBitmap和CreateBitmapIndirect都没有看到能有设置颜色的地方。
      

  6.   

    CreatePatternBrush()之前,Create一幅Compatible的Bitmap,涂上你需要的颜色,然后把你准备好的位图透明BitBlt()到该CompatibleBitmap,就可以CreatePatternBrush()了.
    这样就等于自定义颜色......
      

  7.   

    涂上你需要的颜色,然后把你准备好的位图透明BitBlt()到该CompatibleBitmap
    这两步不太清楚,能写出代码看看吗?
      

  8.   

    bgColor为你准备的位图的背景色(要滤掉的颜色),fgColor为你需要显示的颜色,Bitmap是你准备的位图..void BuildYourBrush(CDC* pDC,CBitmap& Bitmap,COLORREF bgColor,COLORREF fgColor)
    {
        BITMAP bm;
        Bitmap.GetObject(sizoef(BITMAP),&bm);    CBitmap maskBmp,TranBmp;
        //Create掩码图
        maskBmp.CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL);
        //Create目标位图
        TranBmp.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
        //Create 3个兼容DC
        CDC MemDC1,MemDC2,MemDC3;
        MemDC1.CreateCompatibleDC(pDC);
        MemDC2.CreateCompatibleDC(pDC);
        MemDC3.CreateCompatibleDC(pDC); 
        //MemDC1选入准备好的位图
        CBitmap *pOld1 = (CBitmap *)MemDC1.SelectObject(&Bitmap);
        //MemDC2选入掩码图
        CBitmap *pOld2 = (CBitmap *)MemDC2.SelectObject(&maskBmp);
        //MemDC3选入目标图
        CBitmap *pOld3 = (CBitmap *)MemDC3.SelectObject(&TranBmp);
        //目标图涂上需要的颜色
        CBrush brush(fgColor);
        CRect  rc(0,0,bm.bmWidth,bm.bmHeight);
        MemDC3.FillRect(&rc,&brush);
        //设置原图背景色(透明色)
        MemDC1.SetBkColor(bgColor);
        //造掩码图
        MemDC2.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCCOPY);
        //now do it..
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCINCERT);
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC2,0,0,SRCAND);
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCINVERT);
        //ok,clean up..
        MemDC1.SelectObject(pOld1);
        MemDC2.SelectObject(pOld2);
        MemDC3.SelectObject(pOld3);
        //Create your bmpbrush..
        BmpBrush.CreatePatternBrush(&TranBmp);
    }
    =================================================================
    信手写来,不知道有没有错,试试吧..
      

  9.   

    //now do it..
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCINCERT);
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC2,0,0,SRCAND);
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCINVERT);
    汗,写错了一个英文,应为:
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCINVERT);
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC2,0,0,SRCAND);
        MemDC3.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC1,0,0,SRCINVERT);