用bitblt绘图时,运行一会后,窗口里的内容会跑到屏幕左上角?我程序里
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//RECT rt;
GetClientRect(hwnd,&rt);
BitBlt(hdc,0,0,rt.right,rt.bottom,mdc,0,0,SRCCOPY);
EndPaint(hWnd, &ps);
break;其中mdc是在WM_CREATE时创建的:是全局变量。
mdc = CreateCompatibleDC(GetDC(hwnd));
bmp = CreateCompatibleBitmap(GetDC(hwnd),cw,ch);
SelectObject(mdc,bmp);
BitBlt(mdc,0,0,cw,ch,mdc,0,0,WHITENESS); // cw = 1024; ch = 768我用 _beginthread(MasterThread,0,NULL); 开了一个线程
在这个线程中循环向主窗口发送一个自定义消息,
主窗口在这个消息中重画mdc并使窗口实效
DrawAll(); // 重画
RECT rt;
GetClientRect(hwnd,&rt);
InvalidateRect(hwnd,&rt,FALSE);在线程循环次数较少时没有什么问题,多于200次后就会把窗口里面的内容画到屏幕左上角了!
不知道大家有没有遇到国这种问题,
realplayer有的时候也会出现这种情况。
怀疑是显卡,换了个好的,循环时没事,完了一拖动窗口,就又跑到屏幕左上角了!请高手指点,给解释一下原理!
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//RECT rt;
GetClientRect(hwnd,&rt);
BitBlt(hdc,0,0,rt.right,rt.bottom,mdc,0,0,SRCCOPY);
EndPaint(hWnd, &ps);
break;其中mdc是在WM_CREATE时创建的:是全局变量。
mdc = CreateCompatibleDC(GetDC(hwnd));
bmp = CreateCompatibleBitmap(GetDC(hwnd),cw,ch);
SelectObject(mdc,bmp);
BitBlt(mdc,0,0,cw,ch,mdc,0,0,WHITENESS); // cw = 1024; ch = 768我用 _beginthread(MasterThread,0,NULL); 开了一个线程
在这个线程中循环向主窗口发送一个自定义消息,
主窗口在这个消息中重画mdc并使窗口实效
DrawAll(); // 重画
RECT rt;
GetClientRect(hwnd,&rt);
InvalidateRect(hwnd,&rt,FALSE);在线程循环次数较少时没有什么问题,多于200次后就会把窗口里面的内容画到屏幕左上角了!
不知道大家有没有遇到国这种问题,
realplayer有的时候也会出现这种情况。
怀疑是显卡,换了个好的,循环时没事,完了一拖动窗口,就又跑到屏幕左上角了!请高手指点,给解释一下原理!
解决方案 »
- C++题目,不会做。
- 请问一个GetDC()问题?
- 急!关于如何禁止磁盘共享的,在线等,高手相助--100分
- 天下之大,就没有能解决CRebar蚀刻线的英雄吗?500分相送!
- 问:如何在屏幕上乱写乱画(在所有窗口之上写屏)???????????????????????????
- 如何关联进程和用户呢~~~~????
- 为什么程序运行到Query1->Database->loginPrompt=false;就弹出错误,不能继续运行?
- 怎样使用directx8.0从多媒体数据流中抓图?
- 一个edit的问题
- 急急急啊!!!请多多提意见,忠告,经验
- 各位,问一个超级初级的问题,急~~~
- 怎样减少程序的体积???
还有你的线程不段的在刷新,很耗资源。建议你把画图的函数放到 OnPaint, 或者 OnDraw, 或者 OnEraseBkgnd 中,不用开线程来处理的。
下面是画图的一个例子.BOOL CXXXXView::OnEraseBkgnd(CDC* pDC)
{
CDC memDC;
CBitmap bitmap;
CBitmap* pOldBitmap; if( memDC.CreateCompatibleDC(pDC) )
{
CRect rect;
GetClientRect(&rect);
if(bitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom))
{
pOldBitmap = memDC.SelectObject(&bitmap); const int nBoardWidth = BOARD_WIDTH;
const int nBoardHeight = BOARD_HEIGHT; rect.bottom = rect.bottom;
memDC.FillRect(&rect,&m_tBkBrush); ////////////////////////////////////////////////
//把要画图的代码放在这里
////////////////////////////////////////////////
pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom,
&memDC, 0, 0, SRCCOPY); memDC.SelectObject( pOldBitmap );
bitmap.DeleteObject();
memDC.DeleteDC();
ReleaseDC(&memDC);
}
}
}
CRect reWindow;
GetWindowRect(reWindow);
CRect desk;
GetDesktopWindow()->GetWindowRect(desk);
MoveWindow(desk.Width()-reWindow.Width(),MainHeight,reWindow.Width(),reWindow.Height());
参考一下
楼上是什么意思,用的着去动窗口吗?
我只是想改正程序而已。请问 DentistryDoctor(雅克医生<改行做程序员了>)
如何看GDI泄漏?我感觉就是这个问题
刚看了一下,果然,
GDI对象疯涨!...现在改好了!
高手就是高手啊,佩服,五体投地!
一下就说到点子上!100分相送,不成敬意!