其中关键代码如下
是在响应WM_PAINT中的
#define RESOLUTION 256
后面的画直线代码其实就是画了很短的一条线,然后BitBlt把它变成扫描线了(我注释掉BitBlt后扫描线消失)
然后BitBlt的源DC与目标DC不同的话也不会有扫描线....
好像是源DC与目标DC相同的原因 以致出现扫描线, 不过只是我猜的,还请各位指教下!!还有就是 两次GetDC(g_hWndSample);  同一个窗口只能有一个DC句柄吗?void UpdateSample(void)
{
    HDC     hdc;
    HBITMAP hbm;
    RECT    rt;
    HPEN    hPen;    long    width;
    long    height;
    long    pos;    // Drawing Golf Ball    hdc = GetDC(g_hWndSample);    // SelectObject(hdc, (HGDIOBJ)GetStockObject(BLACK_BRUSH));    GetClientRect(g_hWndSample, &rt);    width = rt.right - rt.left + 1;
    height = rt.bottom - rt.top;    hbm = CreateCompatibleBitmap(hdc, width * (RESOLUTION - 1) / RESOLUTION, height);    SelectObject(hdc, hbm);
HDC hDC =GetDC(g_hWndSample);  //自己测试加的    BitBlt(hdc, width / RESOLUTION, 0, width * (RESOLUTION - 1) / RESOLUTION, height, hDC, 0, 0, SRCCOPY);    rt.right = rt.left + width / RESOLUTION;    InvalidateRect(g_hWndSample, &rt, TRUE);    UpdateWindow(g_hWndSample);    // Drawing Grid    // Drawing Line    // Drawing Y accelerate    register unsigned long color1 = ((g_sHistory & 0x02) ? RGB(0, 255, 0) : RGB(0, 0, 0));
    register unsigned long width1 = ((g_sHistory & 0x02) ? 2 : 1);    hPen = CreatePen(PS_SOLID, width1, color1);    SelectObject(hdc, hPen);    pos = height / 2 + (g_yCurrent - g_CaliInfo.y0) * height / (255 - g_CaliInfo.y0) / 2;    pos = (height + pos) % height;    MoveToEx(hdc, 0, pos, NULL);    pos = height / 2 + (g_yHistory - g_CaliInfo.y0) * height / (255 - g_CaliInfo.y0) / 2;    pos = (height + pos) % height;    LineTo(hdc, width / RESOLUTION, pos);
    
    DeleteObject(hPen);    DeleteObject(hbm);    ReleaseDC(g_hWndSample, hdc);
}图:
还有拉个窗口过去遮住它会有“残影"  

解决方案 »

  1.   

    两个DC实际上就是同一个DC吧,相当于bitblt到自己上面了,可能有问题.........
      

  2.   

    谢谢 ,MSDN上好像也说了源DC改变  目标DC会伸展 压缩什么的 .但它程序的目的就是要利用这个"问题"来形成这个扫描线... 
      
    我感觉很强大...
      

  3.   

    还有就是 两次GetDC(g_hWndSample);  同一个窗口只能有一个DC句柄吗?
    我觉得应该只有一个DC,你看看两次GetDC获取的句柄相同不?
      

  4.   

    一个窗口只有一个HDC,你想画成什么样???