热情软件屋

 

申请了一块缓存区读入bmp图象,可是随着调用的次数变多,就会失败


编号:QA004373
建立日期: 2001年8月26日 最后修改日期:2001年8月26日
所属类别:

w75:
    操作系统:win98
    编程工具:vc6.0
    问题:本人用vc60,在cview中的onpain调用
    if(::StretchDIBits(dc.m_hDC,0,0,1024,700,xposi,-28,1024,700,pBitsSrc,(LPBITMAPINFO)&Info,DIB_RGB_COLORS,SRCCOPY)
    == GDI_ERROR)
    语句来画个特别大的图(3000*700)中的一部分,其中 用hBitsSrc = ::GlobalAlloc(GHND,(long)(3517L*737L*3L));
    pBitsSrc = (LPSTR)::GlobalLock(hBitsSrc);申请了一块大约7M多的缓存区用来读入从bmp文件的图象。开始的时候都还可以,可是随着调用的次数变多,就会失败,返回个GDI_ERROR的错误,屏幕变白(我在每次申请前都用globalunlock()回收过内存的)。请问专家是什么原因?   
    你个人的水平 中级

回答:

    这个问题的出现我认为和你申请空间无关。
    我虽然没有看到源码,但我有九成的把握确定你在OnPaint里有如下代码:
    CClientDC dc(this);(或类似代码)
    建议把你的代码作如下修改:
    1. 在CChildView里
    CClientDC *dc;//是指针
    2. 在OnCreate里:
    BOOL R;
    R=CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
    dc=new CClientDC (this);
    return R;
    3. 在Onpaint中的dc.改为dc->
    4. 建议把申请空间也放在OnCreate里
    5. 如果没有特别需要不要lock空间

此问题由Zhao Lei回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio