+ -
当前位置:首页 → 问答吧 → 请教为什么在WinCE下,如下代码SetPixel总是得到同一种颜色?

请教为什么在WinCE下,如下代码SetPixel总是得到同一种颜色?

时间:2011-12-09

来源:互联网

C/C++ code
 m_DisableBmp.LoadBitmap(nID);
 m_clrTrans = clrTrans;
 BITMAP bm;
 ASSERT(m_hWnd);
 CPaintDC dc(this);
 m_dcMem.CreateCompatibleDC(&dc); // Select the bitmap into the in-memory DC
 CBitmap* pOldBitmap = dcMem.SelectObject(&m_NoramlBmp);
 static CRgn crRgn, crRgnTmp;
 crRgn.CreateRectRgn(0, 0, 0, 0);
 m_DisableBmp.GetBitmap(&bm);
 int iX = 0;
 for (int iY = 0; iY < bm.bmHeight; iY++)
 {
  do
  {
   //skip over transparent pixels at start of lines.
   while (iX <= bm.bmWidth && m_dcMe.GetPixel(iX, iY) == clrTrans)
    iX++;
   //remember this pixel
   int iLeftX = iX;
   while (iX <= bm.bmWidth)
   {
    COLORREF clr = dcMem.GetPixel(iX, iY);
    if (clr != clrTrans) //灰化
    {
   COLORREF newclr;
   BYTE r = GetRValue(clr);
   BYTE g = GetGValue(clr);
   BYTE b = GetBValue(clr);
   BYTE n = BYTE(0.299 * b + 0.587 * g + 0.114 * r);
   newclr = RGB(n ,n, n);
   m_dcMe.SetPixel(iX, iY, newclr);
   iX++;
    }
    else
     break;
   }
   
   crRgnTmp.CreateRectRgn(iLeftX, iY, iX-1, iY+1);
   crRgn.CombineRgn(&crRgn, &crRgnTmp, RGN_OR);
   crRgnTmp.DeleteObject();
  }while(iX < bm.bmWidth);
  iX = 0;
 }
 SetWindowRgn(crRgn, FALSE);
 m_dcMe.SelectObject(pOldBitmap);
}

作者: joshua0137   发布时间: 2011-12-09

原因找到了, m_dcMe.SelectObject(pOldBitmap);一句有问题,在我的WinCE下SetPixel调用不成功

留言的给分

作者: joshua0137   发布时间: 2011-12-09

该回复于2011-12-09 13:52:02被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#3楼 得分:0回复于:2011-12-09 13:58:15
恭喜问题解决

作者: mayudong1   发布时间: 2011-12-09

每个像素这样设置如果图像比较大应该会比较慢吧,用GetDIBits和SetDIBits可能比较好点

作者: pshchao   发布时间: 2011-12-09

这样混分是不是不好呢。
恭喜吧。

作者: dahaiI0   发布时间: 2011-12-09