分配内存??? 你的问题不是是否分配内存,而是要用内存DC,有关内存DC的使用已经有太多的帖子,最近的是〈2、VC中如何预先在内存显示直线、文字等〉! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先创建内存DC:CClientDC dc(this);CDC memDC;memDC.CreateCompatibleDC(&dc);然后在memDC中进行你需要的绘制工作绘制完成后用dc.BitBlt(x, y, nWidth, nHeight, &memDC, xSrc, ySrc, SRCCOPY);将内存DC中已绘制好的内容拷贝到屏幕DC中。这种方法效率相当高,不会形成屏幕闪烁。试试看。 响应C???View的WM_ERASEBKGND消息,去掉CView::OnEraseBkgnd(pDC)的调用,直接返回TRUE;OnDraw代码示例://采用100*100的MemDC,根据你的实际情况调整;void C???View::OnDraw(CDC* pDC){ CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap bmpDC; bmpDC.CreateCompatibleBitmap(pDC, 100, 100); memDC.SelectObject(&bmpDC); //你的绘制代码 DrawMyGraph(&memDC); pDC->BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY); bmpDC.DeleteObject(); memDC.DeleteDC();}void C???View::DrawMyGraph(CDC* pDC){ // 你的绘制代码,大小可变是你另外的控制,这里不提供! memDC.Rectangle(10, 10, 60, 60);} 如果要实现画一个变大的矩形这种简单的绘图,用SetROP2设置绘图模式为R2_NOTXORPEN对上一次的矩形重画来擦除,再重画就行了。C???view::OnTimer(...){int iOldMode = m_pClientDC->SetROP2(R2_NOTXORPEN);rcBorder//上一次画的矩形m_pClientDC->Rectangle(&rcBorder);rcBorder.//增大,成为本次画的,m_pClientDC->Rectangle(&rcBorder);m_pClientDC->SetROP2(iOldMode);}如果要实现比较复杂的动画就的用内存dc了。如Holly所说,灵活变通就行了。 一旦进程的主线程结束这个进程就结束了吗? 多线程错误 怎么样得到无标题窗口的句柄 我的adsl猫具有地址转换功能吗? 如何将一段视频读入,并且提取每帧 请教,急急急! 本人准备进军这个搬块,但是有个问题想问大家! wgch007(雪冬)请来取分! 谁知道QQ信息包的结构,不胜感激。 替换Win2000的登陆验证机制,谁有好的建议? 我用MapViewOfFile得到了内存映射文件的地址,但如何移动指针读取每个记录呢?谢谢? 江湖救急:BoundCheck 5.02 for Vc 序列号
CClientDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);然后在memDC中进行你需要的绘制工作绘制完成后用
dc.BitBlt(x, y, nWidth, nHeight, &memDC, xSrc, ySrc, SRCCOPY);将内存DC中已绘制好的内容拷贝到屏幕DC中。
这种方法效率相当高,不会形成屏幕闪烁。试试看。
响应C???View的WM_ERASEBKGND消息,去掉CView::OnEraseBkgnd(pDC)的调用,直接返回TRUE;OnDraw代码示例:
//采用100*100的MemDC,根据你的实际情况调整;
void C???View::OnDraw(CDC* pDC)
{
CDC memDC;
memDC.CreateCompatibleDC(pDC); CBitmap bmpDC;
bmpDC.CreateCompatibleBitmap(pDC, 100, 100);
memDC.SelectObject(&bmpDC);
//你的绘制代码
DrawMyGraph(&memDC); pDC->BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
bmpDC.DeleteObject();
memDC.DeleteDC();
}void C???View::DrawMyGraph(CDC* pDC)
{
// 你的绘制代码,大小可变是你另外的控制,这里不提供!
memDC.Rectangle(10, 10, 60, 60);
}
对上一次的矩形重画来擦除,再重画就行了。
C???view::OnTimer(...)
{
int iOldMode = m_pClientDC->SetROP2(R2_NOTXORPEN);
rcBorder//上一次画的矩形
m_pClientDC->Rectangle(&rcBorder);
rcBorder.//增大,成为本次画的,
m_pClientDC->Rectangle(&rcBorder);
m_pClientDC->SetROP2(iOldMode);
}
如果要实现比较复杂的动画就的用内存dc了。如Holly所说,灵活变通就行了。