vc/mfc Dialog项目,想要实现条形码打印的功能,我自定义了一个画条形码的函数,但是执行的时候,却出现错误提示:"Out of Memory"。代码如下,请帮忙找找错误的地方:
int CtestPrintDlg::Print(LPSTR text, CDC* pDC)//画条形码的函数
{
CPen pen, *pOldPen;
int High,i;
LPSTR str = text;
//设定左上角初始点
CPoint point(50,50);

//就是在执行下面这行代码的时候,出现错误提示“Out of Memory”
pen.CreatePen(PS_SOLID, int(CodeWidth*rato), RGB(0,0,0)); //将画笔选入打印设备环境
pOldPen = pDC->SelectObject(&pen);
High = int(CodeHigh*rato);
while(*str)
{
for (i = 0; i< (*str-'0');i++)
{
pDC->MoveTo(point);
pDC->LineTo(point.x, point.y + High);
point.x += int(CodeWidth*rato);
}
str++;
point.x += int(CodeWidth*rato)*(*str - '0');
str++;
}
pDC->SelectObject(pOldPen);
pen.DeleteObject();//销毁
return 0;
}

解决方案 »

  1.   

    你的这些值设置的多大?
    CodeWidth
    CodeHigh
    rato
      

  2.   

    楼主:
    int(CodeWidth*rato) 的值设置为1或者10或者0.01都会出现“Out of Memory”的错误!!!实在是不解啊,这个问题已经捆饶我好几天了,郁闷……关注……
      

  3.   

    楼主:
    我断点看了一下变量的值:
    rato = 7.9921260, CodeWidth = 0.34999999再按F10,那么就直接跳到Wincore.cpp文件里的代码:
    CATCH_ALL(e)
    {
    lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
    TRACE(traceAppMsg, 0, "Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
    DELETE_EXCEPTION(e);
    }请大侠帮忙看看是什么原因??
      

  4.   

    楼主:
    我在贴一下,调用Print函数的代码吧:
    void CtestPrintDlg::OnBnClickedPrint()
    {
    CDC dc;
    int CodeName = 0,pq;//打印机质量
    LPSTR partial = NULL, text;//接收值
    CCode39 code39;//类对象 UpdateData(TRUE);
    text = CodeText.GetBuffer(100);
    //获取打印机设备环境
    if (!(printDlg.DoModal()))
    {
    //MessageBox("打印错误!");
    return;
    }
    //获取打印机的质量
    DEVMODE *dm = printDlg.GetDevMode();
    pq = dm->dmPrintQuality; dc.Attach(printDlg.CreatePrinterDC());
    dc.m_bPrinting = TRUE; CString strTitle;
    strTitle.LoadString(AFX_IDS_APP_TITLE); DOCINFO di;
    ::ZeroMemory(&di, sizeof(DOCINFO));
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = strTitle;//设置标题 if (dc.StartDoc(&di) == -1)//开始打印
    {
    //AfxMessageBox("StartDoc错误!");
    return;
    }
    int hor = dc.GetDeviceCaps(HORZRES);
    int ver = dc.GetDeviceCaps(VERTRES); //打印内容
    if (code39.Code39Verify(text) == -1)
    {
    //AfxMessageBox("非法字符!");
    return;
    }
    //分配空间
    partial = new char[(strlen(text) + 2)*10];
    if (code39.Code39Encode(text,partial) == -1)
    {
    //AfxMessageBox("编码错误!");
    return;
    }
    dc.StartPage();
    //每毫米打印的像素数
    rato = float(pq/25.4);
    Print(partial, &dc); dc.EndPage();
    dc.EndDoc();
    CodeText.ReleaseBuffer();//释放
    }