超难:如何把CDataGrid控件里面的表格打印出来(大侠们进来看看)

huangmashihao 2006-09-13 04:50:32
我用CDataGrid与数据库连接显示出一些表格,现在我们老板说要把这些表格打印出来,

我研究了几天现在一筹莫展,各位大侠有什么办法或者想法,还请多多指教。

100分送上,还请笑纳
...全文
281 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangmashihao 2006-09-21
  • 打赏
  • 举报
回复
就是怎么取得我的Datagrid的DC,请详细点
KevinCEC 2006-09-21
  • 打赏
  • 举报
回复
CDataGrid不要用这个得了.自己写一个list算了
KevinCEC 2006-09-21
  • 打赏
  • 举报
回复
CDataGrid 可以转换成CList的吗?
billy145533 2006-09-21
  • 打赏
  • 举报
回复
如果你的datagrid的数据比较多的话,那这个办法是行不通的,需要变通
还是参照sxtigerVC(tiger) ,老老实实的写代码
billy145533 2006-09-15
  • 打赏
  • 举报
回复
获取datagrad的dc,直接打印不就行了的吗
干嘛这么麻烦
huangmashihao 2006-09-15
  • 打赏
  • 举报
回复
不是贪心,是看不太懂。
jkgl548 2006-09-14
  • 打赏
  • 举报
回复
呵呵,好贪心啊,要了代码还要注释
huangmashihao 2006-09-14
  • 打赏
  • 举报
回复
兄弟,多给点注释啊
wqvbka123 2006-09-13
  • 打赏
  • 举报
回复
问题解决 了 JF
sxtigerVC 2006-09-13
  • 打赏
  • 举报
回复
我打印LISTCtrl的代码你参考一下:
void CBillView::OnButtonPrint()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
GetListPrintData();
if(m_nRows <= 0)
{
MessageBox("没有可打印项目,请稍候重试","警告", MB_ICONINFORMATION);
return ;
}


CPrintDialog m_print(FALSE);
m_print.DoModal();
m_print.GetDefaults();

LPDEVMODE lpMode = m_print.GetDevMode();

CDC m_PrintDC;
HDC hPrintDC;

hPrintDC = m_print.CreatePrinterDC();

m_PrintDC.Attach(hPrintDC);

DOCINFO m_di;
char DocFileName[]="jlaprint.doc";

m_di.cbSize = sizeof(DOCINFO);
m_di.lpszDocName = DocFileName;
m_di.lpszOutput = NULL;
m_di.lpszDatatype = NULL;
m_di.fwType = 0;

int rnt = m_PrintDC.StartDoc(&m_di);

if(rnt<=0) return;

BeginPrinting(&m_PrintDC);

m_nCurPage=1;

while(m_nRowCount < m_nRows)
{
m_PrintDC.StartPage();
PrintPageHeaderAndFooter(&m_PrintDC);
PrintContent(&m_PrintDC);
if(m_PrintDC.EndPage()<0)
return;
m_nCurPage++;
}
if(m_PrintDC.EndDoc()<0)
return;

}
void CBillView::PrintPageHeaderAndFooter(CDC *pDC)
{
int x, y;
int sy;
int lx, ly;
int len;

CString str;

LOGFONT logFont;
memset(&logFont, 0, sizeof(LOGFONT));
logFont.lfHeight = yLogPerInch / 6;

CFont font;
CFont *pOldFont = NULL;
// if(font.CreateFontIndirect(&logFont))
// pOldFont = pDC->SelectObject(&font);

pOldFont = pDC->SelectObject(&m_fontTopic);

TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);

lx = textMetric.tmAveCharWidth;
ly = textMetric.tmHeight;

len = m_strTopic.GetLength() * (lx + lx / 4);
x = m_rectDraw.left;
y = yLogPerInch / 6;

pDC->SetTextAlign(TA_LEFT);
pDC->TextOut(x + lx / 2, y, m_strTopic);

pDC->SelectObject(pOldFont);
if(font.CreateFontIndirect(&logFont))
pOldFont = pDC->SelectObject(&font);

sy = y;
y = y + ly * 5 / 4;
pDC->MoveTo(x, y);
pDC->LineTo(x + len, y);

if(pOldFont != NULL)
pDC->SelectObject(pOldFont);

str.Format("第%3d页", m_nCurPage);

CSize textSize;
textSize = pDC->GetTextExtent(str);

//x = cxChar * 100;
x = xPageWidth - textSize.cx - cxChar;
pDC->SetTextAlign(TA_LEFT);
pDC->TextOut(x, sy, str);

y = y + ly / 4;
pDC->MoveTo(0, y);
pDC->LineTo(xPageWidth, y);

if(m_nCurPage <= 1)
{
// add heard
x = 0;
y = y + cyChar / 4;
while(m_strStat.Find('r') != -1)
{
pDC->TextOut(x, y, str);
}
}

// print title
sy = y;
y = y + cyChar / 4;
int i;

for( i = 0; i < m_nColumns; i++)
{
if(pPrintTitle[i].Status == 0)
continue;
pDC->SetTextAlign(pPrintTitle[i].Style);
pDC->TextOut(pPrintTitle[i].CenterX, y, pPrintTitle[i].Title);
}

y = y + cyChar * 5 / 4;
pDC->MoveTo(0, y);
pDC->LineTo(xPageWidth, y);
m_nStartRowY = y + cyChar / 4;

ly = yPageHeight - m_nStartRowY - m_nRowCy - cyChar / 2;

m_nRowTotal = ly / m_nRowCy;
m_nEndRowY = m_nStartRowY + m_nRowTotal * m_nRowCy;

for(i = 1 ; i < m_nColumns; i++)
{
if(pPrintTitle[i].Status == 0)
continue;
pDC->MoveTo(pPrintTitle[i].StartX, sy);
pDC->LineTo(pPrintTitle[i].StartX, m_nEndRowY);

}

pDC->MoveTo(0, m_nEndRowY);
pDC->LineTo(xPageWidth, m_nEndRowY);

y = m_nEndRowY + cyChar / 4;
x = 0;
pDC->SetTextAlign(TA_LEFT);
CTime ct = CTime::GetCurrentTime();
str.Format("打印时间:%s", ct.Format("%Y-%m-%d %H:%M:%S"));
pDC->TextOut(x, y, str);

}

void CBillView::PrintContent(CDC *pDC)
{
int i, Count, y;
CString str;
y = m_nStartRowY;
Count = 0;

while(m_nRowCount < m_nRows && Count < m_nRowTotal)
{
for(i = 0; i < m_nColumns; i++)
{
if(pPrintTitle[i].Status == 0)
continue;
str = m_ctrlItem.GetItemText(m_nRowCount, i);
if(str.GetLength() > pPrintTitle[i].MaxChar)
str = str.Left(pPrintTitle[i].MaxChar);
pDC->SetTextAlign(pPrintTitle[i].Style);
pDC->TextOut(pPrintTitle[i].CenterX, y, str);
}
y += m_nRowCy;
Count++;
m_nRowCount++;
}

}

void CBillView::GetListPrintData()
{
m_nColumns = m_ctrlItem.GetHeaderCtrl()->GetItemCount();
m_nRows = m_ctrlItem.GetItemCount();

if(pPrintTitle != NULL)
delete []pPrintTitle;
pPrintTitle = new PRINTTITLE[m_nColumns];


for(int i = 0; i < m_nColumns; i++)
{
LVCOLUMN column;
column.mask=LVCF_TEXT;
column.cchTextMax=30;
column.fmt = LVCFMT_LEFT;
char colbuf[30];
memset(colbuf,0,30);
column.pszText=colbuf;

m_ctrlItem.GetColumn(i,&column);

strcpy(pPrintTitle[i].Title, column.pszText);
CString str;
str = column.pszText;
pPrintTitle[i].Status = 1;
if(column.fmt == LVCFMT_CENTER)
pPrintTitle[i].Style = TA_CENTER;
else if(column.fmt == LVCFMT_LEFT)
pPrintTitle[i].Style = TA_LEFT;
else
pPrintTitle[i].Style = TA_LEFT;

pPrintTitle[i].MaxChar = m_ctrlItem.GetColumnWidth(i) * 2 / 13;
}

}

void CBillView::BeginPrinting(CDC *pDC)
{
m_fontTopic.CreateFont(-100, 0, 0, 0, 800, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体");
m_fontColumn.CreateFont(-90, 0, 0, 0, 800, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体");
m_fontItem.CreateFont(-80, 0, 0, 0, 400, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体");
m_fontHeaderandFooter.CreateFont(-80, 40, 0, 0, 800, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体");

m_rectDraw.SetRect(0, 0, pDC->GetDeviceCaps(HORZRES), pDC->GetDeviceCaps(VERTRES));
pDC->DPtoLP(&m_rectDraw);

xLogPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
yLogPerInch = pDC->GetDeviceCaps(LOGPIXELSY);

TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);

cxChar = textMetric.tmAveCharWidth;
cyChar = textMetric.tmHeight;

xPageWidth = m_rectDraw.Width();
yPageHeight = m_rectDraw.Height();

int TotalChar = xPageWidth / cxChar; // capable row

int i , CountChar;


CountChar = 0;
for(i = 0; i < m_nColumns; i++)
{
if(pPrintTitle[i].Status)
{
CountChar += pPrintTitle[i].MaxChar;
}
}

if(CountChar < TotalChar)
{
CountChar = TotalChar - CountChar;
for(i = 0; i < m_nColumns; i++)
{
if(pPrintTitle[i].Status)
continue;
pPrintTitle[i].Status = 1;
if(pPrintTitle[i].MaxChar > CountChar)
{
pPrintTitle[i].MaxChar = CountChar;
}
CountChar = CountChar - pPrintTitle[i].MaxChar;
}
}

CountChar = 0;

for(i = 0; i < m_nColumns; i++)
{
if(pPrintTitle[i].Status == 0)
continue;
pPrintTitle[i].Width = pPrintTitle[i].MaxChar * cxChar;
pPrintTitle[i].StartX = CountChar;
if(pPrintTitle[i].Style == TA_CENTER)
{
pPrintTitle[i].CenterX = pPrintTitle[i].StartX + pPrintTitle[i].Width / 2;
}
else
{
pPrintTitle[i].CenterX = pPrintTitle[i].StartX + cxChar / 2;
}
CountChar += pPrintTitle[i].Width;
}

m_nRowCy = cyChar + cyChar / 4;

// font
LOGFONT logFont;
memset(&logFont, 0, sizeof(LOGFONT));
logFont.lfHeight = yLogPerInch / 6;

CFont font;
CFont *pOldFont = NULL;
if(font.CreateFontIndirect(&logFont))
pOldFont = pDC->SelectObject(&font);

pDC->GetTextMetrics(&textMetric);

int ly = textMetric.tmHeight;

m_nStartRowY = yLogPerInch / 6;
m_nStartRowY += (ly * 5 / 4);

if(pOldFont != NULL)
pDC->SelectObject(pOldFont);

m_nRowCount = 0;
}
sxtigerVC 2006-09-13
  • 打赏
  • 举报
回复
VC里的打印就是自己写代码,计算大小模式都一样,不会难的下不了手,不过要想搞的比较好,是要花点时间,从Codeproject下载一些示例看一下。
huangmashihao 2006-09-13
  • 打赏
  • 举报
回复
自己先顶一下

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧