图象: 用一个灰的遮罩(RGB(100,100,100)左右)跟它AND或OR一下(以前试过的,具体现在忘了,反正就是这个思路)
如果图象是ICON,那么在DrawIconEx里指定IconStyle = ILD_BLEND25;
文字:设定文字颜色,输出,然后偏移N(n自己体会吧)个象素,再输出一次,当然再换个颜色了。你找个disable的按钮,仔细看一看吧

解决方案 »

  1.   

    (CWnd*)GetDlgItem(IDC_BUTTON)->EnableWindow(false);
      

  2.   

    Override 它的 DrawItem 函数,用 Rectangle画起边框 ,注意GetSysColor选用COLOR_BTNHILIGHT 等你需要的颜色
      

  3.   

    按钮变灰实际就是改变了文字。
    用DrawState函数就行了。
      

  4.   

    Petzold绝对正确,我真想把我的分给他。char * admire
      

  5.   

    咿?用GETITEM得到窗口指针后再用该指针ENABLEWINDOW(TRUE(FALSE))不行吗?
    各位高手请指教。
      

  6.   

    本例是画一个disable的图和文字
    //回调函数,在这里设定大小什么的
    BOOL WINAPI DrawStateProc(
      HDC hdc,       // handle to device context
      LPARAM lData,  // image information
      WPARAM wData,  // more image information
      int cx,        // width of image
      int cy         // height of image
      )
    {
    BITMAP bm;
    HDC hMemDC  = ::CreateCompatibleDC (hdc);
    SelectObject(hMemDC,(HBITMAP)lData);
    GetObject((HBITMAP)lData,sizeof(BITMAP),&bm);
    ::StretchBlt (hdc,0,0,cx,cy,hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
    TextOut(hdc,0,50,"Hehe",4);
    DeleteDC(hMemDC);
    return true;
    }////////////////////////////////////
    //在OnPaint或什么地方调用
    DrawState(dc.GetSafeHdc (),NULL,DrawStateProc ,(LPARAM)m_Bm.GetSafeHandle (),0,10,150,100,100,DST_COMPLEX|DSS_DISABLED);
      

  7.   

    可能我的意思没有说清楚,我要的是图像变灰的效果,不是文字变灰的效果;另外,我也用过DrawState,但是做出来的效果和工具栏上那种变灰的效果并不一致,不知道各位试过没有?还有,并不是一个按钮上的图像,所以用EnableWindow是没有用的。
      

  8.   

    还是不大明白你的意思,你就跟大家说得具体点吧。
    是不是整个工具条的按钮的图像都要变灰呢?
    用CToolBar::SetBitmap 能行吗?(自己画个变灰状态的Bitmap)
      

  9.   

    我要的是算法,对单独的按钮或者整个工具栏都适用。SetBitmap肯定不行,因为我的条件是只有正常情况下的图像,用算法生成变灰后的图像。
      

  10.   

    你是不是说把彩色图片灰色显示?如果是你可以直接改它的位图数据,代码如下:
    for( int i=0; i < nColors; i++)
    {
    // First save original colors
    peOriginal[i].peRed =   bmInfo.bmiColors[i].rgbRed ;
    peOriginal[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
    peOriginal[i].peBlue =  bmInfo.bmiColors[i].rgbBlue ;
    long lSquareSum = bmInfo.bmiColors[i].rgbRed * bmInfo.bmiColors[i].rgbRed
      + bmInfo.bmiColors[i].rgbGreen * bmInfo.bmiColors[i].rgbGreen
      + bmInfo.bmiColors[i].rgbBlue * bmInfo.bmiColors[i].rgbBlue;
    int nGray = (int)sqrt(((double)lSquareSum)/3);
    bmInfo.bmiColors[i].rgbRed = nGray;
    bmInfo.bmiColors[i].rgbGreen = nGray;
    bmInfo.bmiColors[i].rgbBlue = nGray;// Create a reference color table
    peGray[i].peRed = nGray;
    peGray[i].peGreen = nGray;
    peGray[i].peBlue = nGray;
    }
      

  11.   

    谢谢!不过我要的不是彩色图像转化成灰度图像的算法,而是工具栏不可用按钮的那种效果,就好像在DevStudio里面没有选中任何文本的情况下,工具栏上Cut/Copy按钮的那种浮雕式的灰度效果。
      

  12.   

    可是你到底有没有试过DrawState呀,确实就是把一副图或文字或图标反正就是DC能输出的东西作成浮雕的灰度效果。如果DrawState的效果都不行,那么你只能用PhotoShop了
      

  13.   

    我确实试过DrawState,也的确可以出来一幅灰度的图像,但是和工具栏上的变灰按钮效果并不一样!是否因为我把工具栏图像换成了256色图像的原因?可使用16色的图像做出来的效果也不理想呀!