双缓存 onpaint

kittymimihh 2010-02-22 04:48:45
1、采用双缓存绘图一定要在ondraw()函数里面吗?能不能在onpaint()函数里面呢?
2、我用了一种算法绘制渐变色,我自己用肉眼都可以看见图形的绘制过程,怎么回事,不是说双缓存可以解决这个问题吗?我绘图的代码是在onpaint()函数里面的。
...全文
237 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kittymimihh 2010-02-23
  • 打赏
  • 举报
回复
pDC = new CClientDC(this);
pDC->DeleteDC();
那这样对吗?



但是我如果再加上下面这句就会出错是什么原因呢?
//delete(pDC);为什么一用这句就出错?
cxclz668 2010-02-22
  • 打赏
  • 举报
回复
都可以的 看你怎么用!!用release
gdstcwl 2010-02-22
  • 打赏
  • 举报
回复
CDC *pDC;
pDC = GetDC();

释放用release
gdstcwl 2010-02-22
  • 打赏
  • 举报
回复
onpaint()里也可以做的.
渐变可以考虑在onpaint()里绘图,在定时器里改变渐变的值,然后invalidate一下
kittymimihh 2010-02-22
  • 打赏
  • 举报
回复
void CSK4000Dlg::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
if (IsIconic())
{

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
CRect rect;
this->GetClientRect(&rect);
CDC *pDC = NULL;
pDC = new CClientDC(this);
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^

//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);

//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色

for( int j = 0;j < rect.bottom; j++)
{
for( int i = 0;i < rect.right/2 ; i++)
{
MemDC.FillSolidRect(CRect(i,j,i+1,j+1), RGB(213, 255-MulDiv(j, 255, rect.right )/4,217 ));
}
}
for( int j = 0;j < rect.bottom; j++)
{
for( int i = rect.right;i >= rect.right/2 ; i--)
{
MemDC.FillSolidRect(CRect(i,j,i+1,j+1), RGB(213, 255-MulDiv(j, 255, rect.right )/4,217 ));
}
}


//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY);


MemBitmap.DeleteObject();
MemDC.DeleteDC();

pDC->DeleteDC();
//delete(pDC);为什么一用这句就出错?
}

我现在有两个问题:一个就是我第一个提的;第二个问题我已经解决了,现在的问题是这些DC的删除。cpaint()里的DC自己会在析构函数里删除,那么我自己定义的Pdc是不是要我自己删除,如果要我自己删除的话,怎么删,我以上做法是对的吗?
sciencstf 2010-02-22
  • 打赏
  • 举报
回复
代码贴一下。。。。。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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