我写的一个程序打开一个的时候在某个DC上画的东西都正常,双开的时候第二个程序DC上就不能画出东西,关闭第一个程序的时候刷新第二个程序就好了,这有可能是什么原因?两个独立打开的程序HDC难道还会冲突?那个出问题的HDC我是这样定义的:case WM_CREATE:
{
HDC hDc = GetDC(hWnd);
memHdc = CreateCompatibleDC(hDc);
ReleaseDC(hWnd,hDc);
                 }
                 break;
我折腾一天了,什么内存泄露、资源泄露的,但还是没解决,麻烦各位帮我看看!

解决方案 »

  1.   

    为什么要在这里画?为什么不用GetWindowDC()?
      

  2.   

    我是在CREATE窗口的时候create一个DC,然后在WM_PAINT中把东西画到DC上,用getDC难道有问题吗?
    关键是为什么第一个程序打开了,第二个后打开的就不能画了??然后关掉第一个先打开的程序,第二个就好了
      

  3.   

    我改成GetWindowDC()还是一样的问题
      

  4.   

    我画的东西都是在客户区的,所以GETDC和GETWINDOWDC应该效果一样,下班了,明天来结贴,麻烦各位给我几个可能的情况,谢谢了!
      

  5.   

    在WM_PAINT用BeginPaint得到DC就行了,不需要那样。
      

  6.   

    直接在OnPaint中
    HDC hDc = GetDC(hWnd);
    memHdc = CreateCompatibleDC(hDc);
    //这里实现你的画法
    DeleteDC(memHDC);
    ReleaseDC(hWnd,hDc);这样就行了,没必要那么麻烦,你可以再看看,如果有问题,把OnPaint中的代码贴出来看看
      

  7.   

    要在WM_PAINT消息中用BeginPaint来获得DC,返回前EndPaint,不要在WM_CREATE消息中获取和创建DC。
      

  8.   

    GetDC后一定要释放 否则会内存泄漏 这个我以前特意去做过我想可能是你占用了太多的DC句柄 导致第二个程序没有资源可用??可以试一下 或许是这个原因
      

  9.   

    我在BeginPaint得到的DC再画图就解决了我的问题,但还请专家们告诉我为什么我在WM_Create消息里面getDc然后创建兼容DC就会有问题呢?还有就是我那个memDc是需要较长时间存在的,每次WM_PAINT消息里面就从memDc中bitblt一部分到DC上面,如果每次都到BeginPaint里面拿到DC然后创建然后再画就会很慢啊,怎么解决呢?我之前放到WM_CREATE里面创建memDc就是要让他变成一个全局的。
      

  10.   

    还有就是我那个memDc是需要较长时间存在的,每次WM_PAINT消息里面就从memDc中bitblt一部分到DC上面,如果每次都到 BeginPaint里面拿到DC然后创建然后再画就会很慢啊,怎么解决呢?我之前放到WM_CREATE里面创建memDc就是要让他变成一个全局的。
    -------------------------------在WM_PAINT里面创建后可以长期保存啊,像这样
    if (memHdc == NULL)
        memHdc = CreateCompatibleDC(hDc);
      

  11.   

    DC是系统资源,你的程序是不是占用的太多了否则不应当出现这种情况
    用boundschecker软件检查一下,肯定是资源泄露了,我以前学习win32的时候也范过这样的错误,也搞了好久
    出现的现象是程序跑几个小时候,界面上有些地方就不能正常显示了,并且机器变慢,也找了好久,就是通过这个软件搞定的
    原因也是申请的dc没有释放
      

  12.   

    case WM_CREATE:
            {
            HDC hDc = GetDC(hWnd);
            memHdc = CreateCompatibleDC(hDc);
            ReleaseDC(hWnd,hDc);
                     }
                     break;
    放在这里虽不合理,但是流程是正确的 ,看看你的程序其他地方有没有GetDC CreateSolidBrush这一类函数,如果有是否正确的releasedc deleteobject 了
      

  13.   

    楼上的,我改成这样以后双开第二个程序又不能显示了,帮忙啊//全局的
    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资源我在任务管理器里面看到的都是正常的啊
      

  14.   

    现在我改成这样就能双开!:
    //全局的
    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,双开第二个就画不出来,这是两个单独打开的程序啊!不都是有自己的地址空间吗,怎么会出现这样的情况!
      

  15.   

    看来我这个问题不是getDC和BeginPaint的问题,而是我想长期保存我这个缓存DC,只想在程序结束的时候才删除他,但不知为何会影响到打开第二个程序,如果每次画了大量东西到memDC上都要删除重画,我这个程序的功能就没法实现了,请高手们帮忙!
      

  16.   

    你画的东西都在bitmap上,不在DC上,所以你只要保留bitmap就行了,没必要保留DC。
    bitmap可以在开始的时候创建好。
      

  17.   

    再次修改了一下,发现:
    其实不删除memDC是可以的,关键是这一句:
    DeleteObject(hBitmapBig);
    如果我把关联到memDc上的BITMAP删掉,就正常了,要是不删,第二个程序打开就有问题。何解?
      

  18.   

    cofanz兄说保留bitmap就行了,我就把程序的大致结构改成了如下所示,但是现在变成什么都画不出来了,能够像我这样写吗?//全局的一个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);
    }
      

  19.   

    谢谢楼上的,刚才跟踪了一下用到的bitblt、select和delete等函数的调用,返回值都是非NULL的,应该没有发现问题
      

  20.   

    如果实在搞不定可以把代码发过来我看看。[email protected]
      

  21.   

    现在用我19楼的代码能画了,但情况还是回到了原点,第一个程序一关闭,第二个打开的才能正常画图,就是那个HBITMAP的问题,第一个程序不释放的情况下,第二个双开的程序是不会画出来的,到底是什么原因呢??
      

  22.   

    cofanz,我这个代码读了一个很大的库,发不了的,主要画图的代码就在我19楼里面了,帮忙分析一下情况如何,指个方向我自己琢磨琢磨,谢谢了!