代码如下:
CDC* pDC=GetDC();
CDC memDC;
memDC.CreateCompatibleDC(NULL);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOld=(CBitmap*)memDC.SelectObject(&bmp);
memDC.BitBlt(0,0,1024,768,pDC,0,0,SRCCOPY);
memDC.SelectObject(pOld); memDC.DeleteDC(); BYTE* lpBits=new BYTE[1024*768*4];
int n=bmp.GetBitmapBits(1024*768*4,lpBits);
//处理数据,暂未加
delete lpBits;
bmp.DeleteObject();只要加了int n=bmp.GetBitmapBits(1024*768*4,lpBits);这句,界面就会停顿(MOUSE移动是跳动的了,即使此程序不是当前窗口也一样)。另外,把GetBitmapBits改成GetDIBBits也一样,或者开线程执行这段也这样!各位可以试一下,只需要建一个项目,把这段代码COPY到OnTimer里面就是这样了。我的目的是不断截取一个窗口的显示到内存,然后检取一小块区域,最后识别其中的某些符号,所以需要检索位图数据,用GetPixel太慢了。而且如果循环用GetPixel来检取各点,CPU占用率会很高,怎么办才好呢?
CDC* pDC=GetDC();
CDC memDC;
memDC.CreateCompatibleDC(NULL);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOld=(CBitmap*)memDC.SelectObject(&bmp);
memDC.BitBlt(0,0,1024,768,pDC,0,0,SRCCOPY);
memDC.SelectObject(pOld); memDC.DeleteDC(); BYTE* lpBits=new BYTE[1024*768*4];
int n=bmp.GetBitmapBits(1024*768*4,lpBits);
//处理数据,暂未加
delete lpBits;
bmp.DeleteObject();只要加了int n=bmp.GetBitmapBits(1024*768*4,lpBits);这句,界面就会停顿(MOUSE移动是跳动的了,即使此程序不是当前窗口也一样)。另外,把GetBitmapBits改成GetDIBBits也一样,或者开线程执行这段也这样!各位可以试一下,只需要建一个项目,把这段代码COPY到OnTimer里面就是这样了。我的目的是不断截取一个窗口的显示到内存,然后检取一小块区域,最后识别其中的某些符号,所以需要检索位图数据,用GetPixel太慢了。而且如果循环用GetPixel来检取各点,CPU占用率会很高,怎么办才好呢?
解决方案 »
- 我需要转换文件里面的数据文件是.blk的后缀,要二进制打开,提取前4个byte的数据和后面12个数据怎么办?
- 请教下,用OLE DB接口操作数据库时,返回了一个错误码,如何知道他的具体错误信息
- softice安装问题
- 程序运行中途发生异常,有什么办法可以定位发生异常的语句?
- 想屏蔽掉CEdit控键的右键菜单,通过重载OnRButtonDown()做到鼠标不响应了,但是却没办法屏蔽键盘的鼠标菜单键,郁闷阿!
- Direct Show的PaushSource问题,困扰很久了。
- 串口编程问题
- 急,请教如何设置clistbox为可以多选
- 简简单单来拿分!!!有关Menu的问题。怎样给主菜单绘制背景图?
- 为什么ActiveX控件每次都要安装啊?
- 请问如何在CListview的列表方式中的一个格子中显示一个ccomboBox?
- CString,Unicode 与 NetMessageBufferSend() API 的第4个参数!
这句话要比较长的cpu周期,所以处理跟不上了。
你这里不应该在OnTimer内处理那么多绘图操作,所有初始化都应该在外部完成。
while(1)
{
WaitForSingleObject(Event.....);
...}ontimer()
{
SetEvent(Event);
}
不知道行不行
memDC.CreateCompatibleDC(NULL);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOld=(CBitmap*)memDC.SelectObject(&bmp);
memDC.BitBlt(0,0,1024,768,pDC,0,0,SRCCOPY);
memDC.SelectObject(pOld); memDC.DeleteDC(); BYTE* lpBits=new BYTE[1024*768*4];
这些都不应该放在OnTimer里面,应该变成全局或者成员变量。还有,最好不要全屏分析,应该加上你的算法,比如只处理你需要处理的窗口。
建立MemDC和new一个大的数组都需要相对比较多的cpu周期。
GetBitmapBits和GetDIBits做的工作是把放在2GB以上的系统内存空间的位图数据复制到2GB以下的用户内存区,因为需要地址转换(2GB+的内存要在核心态下才能访问),所以速度上会有些慢。如果你是用DIB会快一些,因为DIB数据段本身就是放在用户内存区的。这也就是为什么我建议你不要反复创建大片的图片数据的原因。
按照你的设计,估计要完全避免停顿是不可能的,因为你要处理的区域比较大,而你没有做任何的算法优化
static bool bFlag=false;
if (bFlag)
return;bFlag = true;onTime结束时加
bFlag = false;
我想问的是你有没有试过我说的方法。和你一样的功能,我SetTimer 100ms
鼠标没有任何停顿,cpu占用最多不过10%。
请你写代码不要想当然。
下面是我的OnTimer代码
void CWmfLoadView::OnTimer(UINT nIDEvent)
{
//int n=bmp.GetBitmapBits(1024*768*4,lpBits);
//GetBitmapBits根本就是个淘汰的16位函数,建议不要使用
//但是这里就算使用也不会有停顿
BITMAPINFO bi;
GetDIBits(memDC.GetSafeHdc(),(HBITMAP)bmp.m_hObject,
0,768,lpBits,&bi,DIB_RGB_COLORS);
CView::OnTimer(nIDEvent);
}void CWmfLoadView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar=='s')
{
CDC* pDC=GetDC();
memDC.CreateCompatibleDC(NULL);
bmp.CreateCompatibleBitmap(pDC,1024,768);
CBitmap* pOld=(CBitmap*)memDC.SelectObject(&bmp);
memDC.BitBlt(0,0,1024,768,pDC,0,0,SRCCOPY);
memDC.SelectObject(pOld);
CBitmap bmp;
BYTE* lpBits=new BYTE[1024*768*4]; SetTimer(1000,100,NULL);
}
if(nChar=='e')
{
KillTimer(1000);
//处理数据,暂未加
memDC.DeleteDC();
delete lpBits;
lpBits=NULL;
bmp.DeleteObject();
}
CView::OnChar(nChar, nRepCnt, nFlags);
}
/////////////////////////////////////////////////////////
//上面代码我没有处理内存/资源释放问题,自己加上就可以了PS:我的机器是PIII 667+256MB VC6 sp5 win2000pro sp3