社区
界面
帖子详情
双缓存 onpaint
kittymimihh
2010-02-22 04:48:45
1、采用双缓存绘图一定要在ondraw()函数里面吗?能不能在onpaint()函数里面呢?
2、我用了一种算法绘制渐变色,我自己用肉眼都可以看见图形的绘制过程,怎么回事,不是说双缓存可以解决这个问题吗?我绘图的代码是在onpaint()函数里面的。
...全文
237
6
打赏
收藏
双缓存 onpaint
1、采用双缓存绘图一定要在ondraw()函数里面吗?能不能在onpaint()函数里面呢? 2、我用了一种算法绘制渐变色,我自己用肉眼都可以看见图形的绘制过程,怎么回事,不是说双缓存可以解决这个问题吗?我绘图的代码是在onpaint()函数里面的。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
代码贴一下。。。。。
VC
双
缓冲绘图,无闪烁
该程序在VC6.0的对话框中利用
双
缓冲技术实现了无闪烁绘制图像,其中实现部分在On
Paint
函数中。
MyStatic类(自绘static类)
(1)在static上自绘图以及相关鼠标事件的响应处理,改变颜色状态等; (2)点击标注,可以在on
paint
中开启和关闭亮框;...闪烁的问题可以通过
双
缓存
技术解决; (4)在左上角自绘的空间上,点击右键,出来右键菜单;
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章