为什么建立的dc是单色的?

坎坷的菜贩 2000-04-27 02:10:00
使用CreateCompatibleDC(NULL)建立内存dc,然后通过CreateCompatibleBitmap(memDC,width,height)建立与之相关的位图句柄,再将位图选进内存dc中,对位图进行一系列绘画操作,最后将内存dc拷贝到显示dc中进行显示,但显示结果竟然为单色,请问这是何解?
...全文
194 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shania 2000-04-29
  • 打赏
  • 举报
回复
关键是你的CreateCompatibleDC(NULL);
最好是先得到当前的屏幕DC,然后生成与之兼容的DC。
HDC hdc = GetDC(hwnd);
HDC memdc = CreateCompatibleDC(hdc);
.....

ReleaseDC(hwnd,hdc);
xubin_sh 2000-04-29
  • 打赏
  • 举报
回复
答案其实很简单:msdn的原文"When the memory device context is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high"
意思是:当内存dc被创建时,它的显示面只有单色和1个象素的宽和高
CreateCompatibleBitmap创建dc兼容位图,内存dc是单色的,所以...

CDC memdc;
memdc.CreateCompatibleDC(NULL);
CBitmap membmp;
CClientDC dc(this);
membmp.CreateCompatibleBitmap(dc,width,height);
memdc.SelectObject(&membmp);
//draw dc
RiverHill 2000-04-27
  • 打赏
  • 举报
回复
////////////
//
void CMyView::OnDraw()
{
CRect rcClient;
GetClientRect(&rcClient);
int iWidth = rcClient.Width(); //计算宽度
int iHeight = rcClient.Height(); //计算高度

HDC hMemDC = CreateCompatibleDC(pDC->m_hDC); //创建与屏幕DC兼容的HDC
HBITMAP hBitmap = CreateCompatibleBitmap(pDC->m_hDC, iWidth, iHeight); //创建与屏幕DC兼容的hBitmap

SelectObject(hMemDC, hBitmap); //将hBitmap绑定在hMemDC

CBrush mBrush( RGB(255, 0, 0) ); //定义一个红刷子
FillRect(hMemDC, lpRect, mBrush); //将HDC的底色刷成红色

BitBlt( pDC->m_hDC,
rcClient.left, rcClient.top, iWidth, iHeight,
hMemDC,
rcClient.left, rcClient.top,
SRCCOPY);

}
RiverHill 2000-04-27
  • 打赏
  • 举报
回复
////////////
//此函数设置HDC与hBitmap的内存大小
void CMemDC::SetSize(HDC hDC, LPRECT lpRect)
{
CRect rcHDC = *lpRect;
int iWidth = rcHDC.right - rcHDC.left; //计算宽度
int iHeight = rcHDC.bottom - rcHDC.top; //计算高度

HDC hMemDC = CreateCompatibleDC(hDC); //创建与屏幕DC兼容的HDC
HBITMAP hBitmap = CreateCompatibleBitmap(hDC, iWidth, iHeight); //创建与屏幕DC兼容的hBitmap

SelectObject(hMemDC, hBitmap); //将hBitmap绑定在hMemDC

// CBrush mBrush( RGB(0, 0, 0) ); //定义一个白刷子
// FillRect(hMemDC, lpRect, mBrush); //将HDC的底色刷成黑色

}
simon_sun 2000-04-27
  • 打赏
  • 举报
回复
试试CreateCompatibleBitmap(GetDC(),width,height)应该可以,详情请参阅
MSDN,摘录如下:
Since a color memory device context can have either color or monochrome bitmaps selected, the format of the bitmap returned by the CreateCompatibleBitmap function is not always the same; however, the format of a compatible bitmap for a NONMEMORY device context is always in the format of the device.

Sniper 2000-04-27
  • 打赏
  • 举报
回复
奇怪!
////绘制底面路径imagePath 和 相框路径framePicPath void PaintFramePicture(HDC hDC,RECT rc,CString imagePath,CString framePicPath) { CDC *pDC=new CDC; pDC->Attach(hDC); CString bmpFile; HBITMAP hFgBmp; //画顶层透明位图 CDC DCImage, DCMask; CBitmap Bmp2; //Bmp2.LoadBitmap(IDB_BITMAP2); bmpFile=framePicPath; ///表层框架,相框 hFgBmp = (HBITMAP) LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION); Bmp2.Attach(hFgBmp); BITMAP bm; Bmp2.GetBitmap(&bm); int nWidth=bm.bmWidth,nHeight=bm.bmHeight; bmpFile=imagePath;//画底层位图//底层内容 CBitmap Bmp1; hFgBmp = (HBITMAP) LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION); Bmp1.Attach(hFgBmp); CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject(&Bmp1); pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY); DCImage.CreateCompatibleDC(pDC); DCMask.CreateCompatibleDC(pDC); //把图像装入image DC DCImage.SelectObject(&Bmp2); //为“掩码”位图创建一个单色bitmap CBitmap BmpMask; //把mask位图装入mask DC BmpMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); //用透明色创建“掩码”位图 DCMask.SelectObject(&BmpMask); //设置透明色 DCImage.SetBkColor(RGB(0,0,0)); DCMask.BitBlt(0, 0, nWidth, nHeight, &DCImage, 0, 0, SRCCOPY); pDC->BitBlt(0,0, nWidth, nHeight, &DCImage, 0, 0, SRCINVERT); pDC->BitBlt(0,0, nWidth, nHeight, &DCMask, 0, 0, SRCAND); pDC->BitBlt(0,0, nWidth, nHeight, &DCImage, 0, 0, SRCINVERT); delete pDC; }

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧