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;
}
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;
}
解决方案 »
- 线程优先级问题
- 获取某exe的版本号
- 关于位图资源ID的合法性检测?
- 来者都有分:那位大虾总结过Visual C++ 6.0开发环境的快捷键或者是使用小技巧?
- 这个打印应该如何做?数据库中数据如下......欲知详情,请进,UP有分,多提好建议,....,
- mfc读取文件夹内所有文件
- 关于在ListBox中添加内容
- 关于一道经典题的算法
- 为什么我的win32 console程序(dos模式)的循环有时候要敲回车才能继续运行?
- VC中想把字符串转变成整形?
- 问按一按钮弹出一个窗口,窗口类似于千千静听歌曲列表的窗口能跟着主窗口移动
- 想问一下在一般的软件中所谓机器码是指的网卡编号还是CPU编号或者什么别的啊
CodeWidth
CodeHigh
rato
int(CodeWidth*rato) 的值设置为1或者10或者0.01都会出现“Out of Memory”的错误!!!实在是不解啊,这个问题已经捆饶我好几天了,郁闷……关注……
我断点看了一下变量的值:
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);
}请大侠帮忙看看是什么原因??
我在贴一下,调用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();//释放
}