这双缓冲到底哪里错了?

st291 2009-11-07 12:44:04
初始化双缓冲是这样的!

// CDC MDc ;
// CBitmap bmp;
if(!MDc.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
bmp.CreateCompatibleBitmap(&MDc, rt.Width(), rt.Height());
::SelectObject(MDc.GetSafeHdc(), bmp);


下面是2个问题!

double colorR=255,colorG=255,colorB=255;
CPen* oldPen;

for(int i2=0;i<rt.Height();i2++)
{
if(i<rt.Height()/3)
{
colorR-=0.3;
colorG-=0.2;
colorB-=0.1;
}
else
{
colorR+=0.06;
colorG+=0.04;
colorB+=0.04;
}
CPen pen(PS_SOLID, 3, RGB(colorR ,colorG, colorB) );//RGB(189 ,212, 230)
oldPen= MDc.SelectObject(&pen);
MDc.MoveTo(0,i2);
MDc.LineTo(rt.Width(),i2);

MDc.SelectObject(oldPen);

(1)以上代码 我要在内存中绘制渐变的背景 然后一次性到对话框上 为什么没效果?要怎么解决呢?

(2)我要在内存中先画个蓝色的圆 再画个红色的圆 为什么对内存DC SelectObject pen 没效果啊? 要怎么解决?
CPen* oldPen;
CPen pen(PS_SOLID, 3, RGB(200 ,0, 0) );
oldPen= MDc.SelectObject(&pen);

而这样做却2个圆的颜色都一样 pdcView->SetTextColor(RGB(0,0,250));
pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);


...全文
51 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
st291 2009-11-07
  • 打赏
  • 举报
回复
第一个问题 绘制渐变背景 再BitBlt到对话框上! 显示的是全黑的
job82824 2009-11-07
  • 打赏
  • 举报
回复

//OnInitDialog
...
CRect rc;
GetClientRect(rc);
CDC *pDC = NULL;
pDC = GetDC();
if(pDC)
{
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
memDC.CreateCompatibleDC(pDC);
ReleaseDC(pDC);
}
else
AfxMessageBox(_T("没有获得到DC"));
...

//DrawBkgnd function
void CCBackgndDlg::Draw_Client(CRect rc, CDC *pDC)
{
CBitmap *oldBmp = memDC.SelectObject(&bmp);
double colorR=255,colorG=255,colorB=255;
CPen* oldPen;
for(int i=0;i<rc.Height();i++)
{
if(i<rc.Height()/3)
{
colorR-=0.3;
colorG-=0.2;
colorB-=0.1;
}
else
{
colorR+=0.06;
colorG+=0.04;
colorB+=0.04;
}
CPen pen(PS_SOLID, 3, RGB(colorR,colorG,colorB));
oldPen= memDC.SelectObject(&pen);
memDC.MoveTo(0,i);
memDC.LineTo(rc.Width(),i);
memDC.SelectObject(oldPen);
}
pDC->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),
&memDC,0,0,
SRCCOPY);
memDC.SelectObject(oldBmp);
}
//OnPaint
...
CDC *pDC = GetDC();
CRect rc;
GetClientRect(rc);
Draw_Client(rc, pDC);
ReleaseDC(pDC);
...

你试一下,如果还是黑的找我哈!
job82824 2009-11-07
  • 打赏
  • 举报
回复
猜一下:
1. 你的CDC选择了一个CBitmap,但是却没有在退出的时候将默认值还原,这里似乎不合乎语法习惯。
2. 针对第一个问题,我很正确地画出了渐进背景色--但是使用的是memDC.CreateCompatibleDC(pDC);
其中的pDC=GetDC();
3. 第二个问题,因为你画圆的时候只进行了一次的SelectObject,选中了红色的画笔,所以就只能是红色的圆了。
CPen pen1(PS_SOLID, 3, RGB(0 ,0, 200) );
oldPen= MDc.SelectObject(&pen);
MDC.Ellipse(...);
CPen pen2(PS_SOLID, 3, RGB(200 ,0, 0) );
MDc.SelectObject(&pen);
MDC.Ellipse(...);
MDC.SelectObject(oldPen);

16,472

社区成员

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

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

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