我写的一个程序打开一个的时候在某个DC上画的东西都正常,双开的时候第二个程序DC上就不能画出东西,关闭第一个程序的时候刷新第二个程序就好了,这有可能是什么原因?两个独立打开的程序HDC难道还会冲突?那个出问题的HDC我是这样定义的:case WM_CREATE:
{
HDC hDc = GetDC(hWnd);
memHdc = CreateCompatibleDC(hDc);
ReleaseDC(hWnd,hDc);
}
break;
我折腾一天了,什么内存泄露、资源泄露的,但还是没解决,麻烦各位帮我看看!
{
HDC hDc = GetDC(hWnd);
memHdc = CreateCompatibleDC(hDc);
ReleaseDC(hWnd,hDc);
}
break;
我折腾一天了,什么内存泄露、资源泄露的,但还是没解决,麻烦各位帮我看看!
关键是为什么第一个程序打开了,第二个后打开的就不能画了??然后关掉第一个先打开的程序,第二个就好了
HDC hDc = GetDC(hWnd);
memHdc = CreateCompatibleDC(hDc);
//这里实现你的画法
DeleteDC(memHDC);
ReleaseDC(hWnd,hDc);这样就行了,没必要那么麻烦,你可以再看看,如果有问题,把OnPaint中的代码贴出来看看
-------------------------------在WM_PAINT里面创建后可以长期保存啊,像这样
if (memHdc == NULL)
memHdc = CreateCompatibleDC(hDc);
用boundschecker软件检查一下,肯定是资源泄露了,我以前学习win32的时候也范过这样的错误,也搞了好久
出现的现象是程序跑几个小时候,界面上有些地方就不能正常显示了,并且机器变慢,也找了好久,就是通过这个软件搞定的
原因也是申请的dc没有释放
{
HDC hDc = GetDC(hWnd);
memHdc = CreateCompatibleDC(hDc);
ReleaseDC(hWnd,hDc);
}
break;
放在这里虽不合理,但是流程是正确的 ,看看你的程序其他地方有没有GetDC CreateSolidBrush这一类函数,如果有是否正确的releasedc deleteobject 了
HDC memHdc;//在wm_paint消息里面:
HDC hDc = BeginPaint(hWnd,&ps);
RECT rect;
GetClientRect(hWnd,&rect);
if (memHdc == NULL){
memHdc = CreateCompatibleDC(hDc);
HBITMAP hBitmapBig = CreateCompatibleBitmap(hDc,rect.right,25000);
HBITMAP hBitmapBigOld = (HBITMAP)SelectObject(memHdc,hBitmapBig);
}
//画图,直到程序关闭的时候才删除memHdc和相关资源。另外楼上的,我的程序内存和GDI资源我在任务管理器里面看到的都是正常的啊
//全局的
HDC memHdc;//在wm_paint消息里面:
HDC hDc = BeginPaint(hWnd,&ps);
RECT rect;
GetClientRect(hWnd,&rect);
//if (memHdc == NULL){
memHdc = CreateCompatibleDC(hDc);
HBITMAP hBitmapBig = CreateCompatibleBitmap(hDc,rect.right,25000);
HBITMAP hBitmapBigOld = (HBITMAP)SelectObject(memHdc,hBitmapBig);
// }
//画图SelectObject(memHdc,hBitmapBigOld);
DeleteObject(hBitmapBig);
DeleteDC(memHdc);
EndPaint(hWnd,&ps);也就是说我在消息循环中要是不删除memHdc,双开第二个就画不出来,这是两个单独打开的程序啊!不都是有自己的地址空间吗,怎么会出现这样的情况!
bitmap可以在开始的时候创建好。
其实不删除memDC是可以的,关键是这一句:
DeleteObject(hBitmapBig);
如果我把关联到memDc上的BITMAP删掉,就正常了,要是不删,第二个程序打开就有问题。何解?
HBITMAP memBitmap_g;.....
//函数,画图用的,定义一个局部变量buffHdc,然后绑定memBitmap_g到上面,接着画图,最后删掉这个DC,memBitmap_g不删除,留着全局使用
void drawResMaps(...){
HBITMAP memBitmapOld = (HBITMAP)SelectObject(buffHdc,memBitmap_g);
HDC buffHdc = CreateCompatibleDC(hDc);
BitBlt(buffHdc,currW,currH,bitmapInfo->bmiHeader.biWidth,bitmapInfo->bmiHeader.biHeight,soloDc,0,0,SRCCOPY);
SelectObject(buffHdc,memBitmapOld);
DeleteDC(buffHdc);
}
.....
//WM_CREATE消息里面得不到当前客户区的尺寸,所以放到WM_SIZE里面运行画图到memBitmap_g上面
case WM_SIZE:
{
if(!memBitmap_g){
HDC hDc = GetDC(hWnd);
memBitmap_g = CreateCompatibleBitmap(hDc,LOWORD(lParam),25000);
//画图到memBitmap_g上
drawResMaps(....);
ReleaseDC(hwndRes,hDc);
}
}
....
case WM_PAINT:{
HDC hDc = BeginPaint(hWnd,&ps);
//建立缓存DC,并把已经画过的BITMAP绑定到其上
HDC memHdc = CreateCompatibleDC(hDc);
HBITMAP memBitmapOld = (HBITMAP)SelectObject(memHdc,memBitmap_g); RECT rect;
GetClientRect(hWnd,&rect);
//将缓存DC画到屏幕DC上
BitBlt(hDc,0,0,rect.right,rect.bottom,memHdc,0,yCurrentScroll,SRCCOPY);
//删除相关资源
SelectObject(memHdc,memBitmapOld);
DeleteDC(memHdc);
EndPaint(hWnd,&ps);
}