图很大?
硬件很差?
使用了第三个dc,还是直接blt到屏幕?

解决方案 »

  1.   

    图(6500X2000)
    硬件不差(G400,32M)
    几个DC都可,BitBlt到CClientDC dc(this)
      

  2.   

    另外,为什么不试着使用Scroll函数呢,首先用BitBlt函数将图像调出,然后滚动的时候采用Scroll来进行控制。
      

  3.   

    Very 谢谢: liujiangsh(飞鹰) 
      

  4.   

    最好从CScrollView派生一个类来做,因为CScrollView对滚动处理得还不错.
      

  5.   

    没用过CScroollView,时间太紧,准备搞定后再研究
      

  6.   

    用StrentchDibits函数要好一些,我是这样做的将数据存于内存的缓冲区中,之后对数据进行处理。滚动我不明白怎么滚法,但我做了翻转的工作,Acdsee中好像用的是像素的打印,打大图像是会发现一行一行的。StrentchDibits这一次完成没有那么不连贯。我给发两个文件把!
    你的妹儿。    我的是[email protected] 
      

  7.   

    你要什摸文件?
    [email protected]
      

  8.   

    不能用 StrentchDibits 我操作的是Jpg
      

  9.   

    Because I use CDialog,So couldn't use CScrollView
      

  10.   

    你用的是什么视?如果是CsrollView就可直接操作了。
    即使是普通的视,也可以滚动啊。
      

  11.   

    没有View class,滚动是通过BitBlt实现的
      

  12.   

    当滚动时,我写了一个死循环
    while(GetKeyState(VK_RIGHT) < 0) {
      BitBlt(....)
    }
    此时,可达到要求,CPU 占用率%100
    但无法获得WINDOWS message,I need the GetKeyState()
    But in the 死循环,It doesn't work,
    如何完善这个循环
      

  13.   

    So regret It's a Dialog program
      

  14.   

    我想,即使是Dialog的程序也可以用时钟函数的,但是可能它刷新没有View类那么快,你也可以试一下,用ScrollWindow这个函数试一下
      

  15.   

    我现在用的就是OnTimer() {}
    看看这个吧:滚动时,我写了一个死循环
    while(GetKeyState(VK_RIGHT) < 0) {
      BitBlt(....)
    }
    此时,可达到要求,CPU 占用率%100
    但无法获得WINDOWS message,I need the GetKeyState()
    But in the 死循环,It doesn't work,
    如何完善这个循环
    使GetKeyState() work
      

  16.   

    应该是响应WM_KEYDOWN消息,在OnKeyDown()里发送绘制命令。
    试一试吧!
      

  17.   

    6500*2000,如果是32位图的话,大概要50M的大小吧(bmp格式)。
    因为不太清楚 HDC,HBITMAP的机制,所以你试一下:
    申请一块内存缓冲(恐怕要50M了), GetBitmapBits将位图数据读入,(lpmem为缓冲指针),
    另外申请一块内存,lpmem2(就是窗口显示数据了),CopyMemory将lpmem中的需要数据读入lpmem2, SetBitmapBits将lpmem2的数据写入窗口显示区。
    不过,你有那么大的数据量速度是一定会受影响的。
      

  18.   

    玉米:用这个函数.
    int SetDIBitsToDevice(
      HDC hdc,                 // handle to DC
      int XDest,               // x-coord of destination upper-left corner
      int YDest,               // y-coord of destination upper-left corner 
      DWORD dwWidth,           // source rectangle width
      DWORD dwHeight,          // source rectangle height
      int XSrc,                // x-coord of source lower-left corner
      int YSrc,                // y-coord of source lower-left corner
      UINT uStartScan,         // first scan line in array
      UINT cScanLines,         // number of scan lines
      CONST VOID *lpvBits,     // array of DIB bits
      CONST BITMAPINFO *lpbmi, // bitmap information
      UINT fuColorUse          // RGB or palette indexes
    );
      

  19.   

    code_cold(玉米) (2001-11-28 17:21:00)  得0分 
    当滚动时,我写了一个死循环
    while(GetKeyState(VK_RIGHT) < 0) {
      BitBlt(....)
    }
    此时,可达到要求,CPU 占用率%100
    但无法获得WINDOWS message,I need the GetKeyState()
    But in the 死循环,It doesn't work,
    如何完善这个循环
     我来回答你这个问题:
    在while循环中加入下面代码就行了
    MSG msg;    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        :
      

  20.   

    在OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数中ScrollWindows滚动窗口。
    在OnDraw(CDC* pDC)或OnPaint()函数中用Bitblt刷新需刷新区域.应该是能自动处理的,如果不行的话就自已用编码实现,刷新区域在CPaintDC->m_ps.rcPaint中,是一个CRect.
    我以前编过一个程序那怕是10000*10000的图像基本也能流畅的滚动,不过我用的是DIB位图,用SetDIBitsToDevice函拷贝到屏幕的。