none
创建指定颜色位的CDC RRS feed

  • 问题

  • 假如桌面属性中颜色设定的不是24位。我能不能建立一个24位颜色深度的CDC(在内存中模拟),并在上面画图。
    2009年9月21日 1:43

答案

全部回复

  • CreateCompatibleDC(NULL)来创建一个空DC
    然后用CreateBitmap创建一个24位位图
    用SelectObject把它选进空DC中,这时的DC就会被置为24位深度的.
    0xBAADF00D
    2009年9月21日 8:15
    版主
  • 这样好像是不行的,我这有段测试代码你可以看看。
    代码中我将画到CDC中的点阵颜色用“MessageBox()”显示出来。当我把PIXEL定义为32是显示是对的,改成24就不对了。我的操作系统设定的是32位色。



    #define PIXEL   32//24
    #define BYTESPERPIXEL (PIXEL/8)
     CClientDC dcThis(this);
     CDC memDC;
     memDC.CreateCompatibleDC(&dcThis);
     BITMAP bm;
     bm.bmType = 0;
     bm.bmWidth = 20;
     bm.bmHeight = 10;
     bm.bmPlanes = 1;
     bm.bmBitsPixel = PIXEL;
     bm.bmWidthBytes = (bm.bmWidth * bm.bmBitsPixel + 7)/8;
     bm.bmBits = NULL;
     CBitmap Bitmap;
     Bitmap.CreateBitmapIndirect(&bm);
     CBitmap *pOldBmp = memDC.SelectObject(&Bitmap);

     CBrush brush;
     brush.CreateSolidBrush(RGB(0xFF, 0x00, 0x00));
     CBrush *pOldBrush = memDC.SelectObject(&brush);
     CPen Pen;
     Pen.CreateStockObject(NULL_PEN);
     CPen *pOldPen = memDC.SelectObject(&Pen);
     memDC.Rectangle(0, 0, 6, 5);

     BYTE *pDatas;
     pDatas = new BYTE[bm.bmHeight * bm.bmWidthBytes];
     Bitmap.GetBitmapBits(bm.bmHeight * bm.bmWidthBytes, pDatas);
     CString strBits;
     for(int y=0; y<bm.bmHeight; y++)
     {
      for(int x=0; x<bm.bmWidth; x++)
      {
       strBits.AppendFormat(_T("%02X%02X%02X "),
        pDatas[y*bm.bmWidthBytes + x*BYTESPERPIXEL + 0],
        pDatas[y*bm.bmWidthBytes + x*BYTESPERPIXEL + 1],
        pDatas[y*bm.bmWidthBytes + x*BYTESPERPIXEL + 2]);
      }
      strBits.Append(_T("\r\n"));
     }
     delete [] pDatas;
     MessageBox(strBits);

     memDC.SelectObject(pOldBrush);
     memDC.SelectObject(pOldPen);
     memDC.SelectObject(pOldBmp);

    2009年9月21日 9:05
  • memDC.CreateCompatibleDC(NULL);
    这样,填NULL.
    0xBAADF00D
    2009年9月21日 13:12
    版主
  • 试过了,填NULL也是不行

    2009年9月22日 2:19
  • 你试试:

    HDC hDC = ::CreateCompatibleDC(NULL);
    HBITMAP hBitmap = ::CreateBitmap(10, 10, 1, 24, NULL);
    ::SelectObject(hDC, hBitmap);

    在这个hDC上画.


     pDatas = new BYTE[bm.bmHeight * bm.bmWidthBytes];
     Bitmap.GetBitmapBits(bm.bmHeight * bm.bmWidthBytes, pDatas);
    这个内存没分配对吧,一个24位位图每个像素是3个字节
    0xBAADF00D
    2009年9月22日 14:54
    版主
  • 你试试:

    HDC hDC = ::CreateCompatibleDC(NULL);
    HBITMAP hBitmap = ::CreateBitmap(10, 10, 1, 24, NULL);
    ::SelectObject(hDC, hBitmap);

    在这个hDC上画.


     pDatas = new BYTE[bm.bmHeight * bm.bmWidthBytes];
     Bitmap.GetBitmapBits(bm.bmHeight * bm.bmWidthBytes, pDatas);
    这个内存没分配对吧,一个24位位图每个像素是3个字节
    0xBAADF00D
    2009年9月22日 14:54
    版主
  • 还是不行,下面是照你的方法改过的测试代码,你可以拷贝到你的程序里面试试,我开发工具用的是vs2008

     #define BYTESPERPIXEL 3
     HDC hDC = ::CreateCompatibleDC(NULL);
     HBITMAP hBitmap = ::CreateBitmap(10, 10, 1, BYTESPERPIXEL*8, NULL);
     ::SelectObject(hDC, hBitmap);
     HPEN hPen = ::CreatePen(PS_SOLID, 1, RGB(0x00, 0xFF, 0x00));
     ::SelectObject(hDC, hPen);
     ::MoveToEx(hDC, 0, 0, NULL);
     ::LineTo(hDC, 5, 5);

     BYTE *pDatas;
     pDatas = new BYTE[10 * 10 * BYTESPERPIXEL];
     ::GetBitmapBits(hBitmap, 10*10*BYTESPERPIXEL, pDatas);
     CString strBits;
     for(int y=0; y<10; y++)
     {
      for(int x=0; x<10; x++)
      {
       strBits.AppendFormat(_T("%02X%02X%02X "),
        pDatas[(y*10 + x)*BYTESPERPIXEL + 0],
        pDatas[(y*10 + x)*BYTESPERPIXEL + 1],
        pDatas[(y*10 + x)*BYTESPERPIXEL + 2]);
      }
      strBits.Append(_T("\r\n"));
     }
     delete [] pDatas;
     AfxMessageBox(strBits);



    前面那个内存分配是没错的,因为bm.bmWidthBytes = bm.bmWidth * 3

    2009年9月23日 2:57
  • 看来这样做是行不通的了,现在宣判该命题无解。

    谢谢Vonger的关注!

    • 已标记为答案 cyril.qian 2009年9月29日 3:23
    2009年9月29日 3:23