完善优化这段代码BOOL CFinBudgetView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CFinBudgetView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CFinBudgetView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } void CFinBudgetView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/) { // TODO: 在此处添加自定义打印代码 }
时间: 2023-07-23 21:53:45 浏览: 150
这段代码是 MFC 框架下打印相关的函数,DoPreparePrinting 函数是准备打印的主函数,OnBeginPrinting 是在打印前进行的初始化过程,OnEndPrinting 是在打印后进行的清理过程,OnPrint 是自定义的打印代码。
为了优化这段代码,可以考虑以下几个方面:
1. 在 OnBeginPrinting 函数中初始化打印相关的变量,如打印页数、页眉页脚等,并将其保存到打印信息结构体中,以便在打印时使用。
2. 在 OnPrint 函数中,根据打印信息结构体中保存的数据,逐页打印内容。可以使用 CDC::StartPage 和 CDC::EndPage 函数来控制每一页的打印。
3. 在 OnEndPrinting 函数中进行清理工作,如释放打印相关的资源等。
4. 可以考虑添加打印预览功能,以便用户在打印前预览打印内容,并进行设置。
5. 在 DoPreparePrinting 函数中,可以根据需要进行一些额外的打印准备工作,如设置打印机、打印纸张等。
6. 如果需要支持打印预览,可以添加 OnPrepareDC 函数,用于在打印预览中进行绘图。
相关问题
VC mfc单文档中代码如下void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); for (int i=0;i<points.size();i++){ br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r); br.DeleteObject(); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default center=point; r=rand()%46+5;//r=5~50 color=RGB(rand()%256,rand()%256,rand()%256); points.push_back(center); SetTimer(1,200,NULL); CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { for(int i=0;i<points.size();i++) { points[i].y-=5; if(points[i].y<-r) { points.erase(points.begin()+i); i--; } } } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1){ RedrawWindow(); rise(); } CView::OnTimer(nIDEvent); },为什么运行结果中后面单击出现的圆的状态会改变前面出现的圆的状态,怎么修改此代码能实现每次单击出现的圆的大小和颜色都不相同,完整步骤及代码
运行结果中后面单击出现的圆的状态会改变前面出现的圆的状态是因为OnDraw函数中设置了画刷颜色和大小,每次重绘时都会使用相同的画刷,所以后面出现的圆会覆盖前面出现的圆。你可以在单击时随机生成一个画刷颜色和大小,然后保存到vector中,每次重绘时使用对应的画刷。
以下是修改后的代码:
```
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i = 0; i < points.size(); i++) {
// 随机生成画刷颜色和大小
COLORREF color = RGB(rand() % 256, rand() % 256, rand() % 256);
int r = rand() % 46 + 5;
// 创建画刷并绘制圆形
CBrush brush;
brush.CreateSolidBrush(color);
pDC->SelectObject(&brush);
pDC->Ellipse(points[i].x - r, points[i].y - r, points[i].x + r, points[i].y + r);
}
// TODO: add draw code for native data here
}
```
在上面的代码中,我们在OnDraw函数中随机生成画刷颜色和大小,并将其保存到vector中。然后每次绘制圆形时,使用对应的画刷。这样就可以实现每次单击出现的圆的大小和颜色都不相同的效果。
完整的步骤和代码如下:
1. 在MFC框架中创建一个单文档应用程序。
2. 在CMyView类中添加以下成员变量:
```cpp
CPoint center; // 圆心坐标
int r; // 圆的半径
COLORREF color; // 圆的颜色
std::vector<CPoint> points; // 保存所有圆的坐标
```
3. 在CMyView类的OnLButtonDown函数中添加以下代码:
```cpp
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
center = point;
r = rand() % 46 + 5;
color = RGB(rand() % 256, rand() % 256, rand() % 256);
// 保存圆的坐标
points.push_back(center);
// 开始定时器
SetTimer(1, 200, NULL);
CView::OnLButtonDown(nFlags, point);
}
```
在上面的代码中,我们随机生成圆的半径和颜色,并保存圆的坐标到vector中。然后开始定时器,用来定时重绘界面。
4. 在CMyView类的OnDraw函数中添加以下代码:
```cpp
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i = 0; i < points.size(); i++) {
// 随机生成画刷颜色和大小
COLORREF color = RGB(rand() % 256, rand() % 256, rand() % 256);
int r = rand() % 46 + 5;
// 创建画刷并绘制圆形
CBrush brush;
brush.CreateSolidBrush(color);
pDC->SelectObject(&brush);
pDC->Ellipse(points[i].x - r, points[i].y - r, points[i].x + r, points[i].y + r);
}
// TODO: add draw code for native data here
}
```
在上面的代码中,我们随机生成画刷颜色和大小,并将其保存到vector中。然后每次绘制圆形时,使用对应的画刷。
5. 在CMyView类中添加以下定时器相关的函数:
```cpp
void CMyView::rise()
{
for (int i = 0; i < points.size(); i++)
{
points[i].y -= 5;
if (points[i].y < -r)
{
points.erase(points.begin() + i);
i--;
}
}
}
void CMyView::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1) {
RedrawWindow();
rise();
}
CView::OnTimer(nIDEvent);
}
```
在上面的代码中,我们定义了一个rise函数,用来移动所有圆的坐标。然后在定时器函数OnTimer中调用RedrawWindow函数,重绘界面,并移动所有圆的坐标。定时器的间隔为200ms。
6. 在CMyView类的消息映射中添加以下代码:
```cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
```
7. 编译并运行程序,单击鼠标左键,可以看到随机生成的圆形,每隔200ms,所有圆形会向上移动,超出窗口范围的圆形将从vector中删除。每次单击出现的圆的大小和颜色都不相同。
VC mfc单文档中代码如下void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); for (int i=0;i<points.size();i++){ color=RGB(rand()%6,rand()%6,rand()%6); r=rand()F+5; br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r); br.DeleteObject(); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /pDC/, CPrintInfo* /pInfo/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /pDC/, CPrintInfo* /pInfo/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default center=point; r=rand()F+5;//r=5~50 color=RGB(rand()%6,rand()%6,rand()%6); points.push_back(center); SetTimer(1,200,NULL); CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { for(int i=0;i<points.size();i++) { points[i].y-=5; if(points[i].y<-r) { points.erase(points.begin()+i); i--; } } } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1){ RedrawWindow(); rise(); } CView::OnTimer(nIDEvent); },怎么修改此代码能实现每次单击鼠标出现的圆大小和颜色随机,但在圆的上升过程中大小和颜色都为刚开始单击鼠标时的大小和颜色,不会不停的变换。并且前面单击鼠标出现的圆的颜色和大小不会随着后面单击鼠标出现的圆的颜色和大小改变而改变。给出完整步骤及代码
要实现每次单击鼠标出现的圆大小和颜色随机,但在圆的上升过程中大小和颜色都为刚开始单击鼠标时的大小和颜色,不会不停的变换,可以在OnLButtonDown函数中加入随机颜色和大小的代码,如下所示:
void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default
center=point;
r=rand()%46+5; //r范围为5~50
color=RGB(rand()%256,rand()%256,rand()%256); //RGB颜色随机
points.push_back(center);
SetTimer(1,200,NULL);
CView::OnLButtonDown(nFlags, point);
}
要实现前面单击鼠标出现的圆的颜色和大小不会随着后面单击鼠标出现的圆的颜色和大小改变而改变,可以在OnDraw函数中,每次绘制圆之前先保存之前的画刷对象,然后绘制,绘制完成之后再恢复之前的画刷对象。修改后的OnDraw函数代码如下:
void CMyView::OnDraw(CDC* pDC) {
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i=0;i<points.size();i++){
CBrush* pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r);
pDC->SelectObject(pOldBrush);
}
// TODO: add draw code for native data here
}
完整代码如下:
// MyView.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "My.h"
#include "MyDoc.h"
#include "MyView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
// CMyView construction/destruction
CMyView::CMyView()
{
// TODO: add construction code here
}
CMyView::~CMyView()
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i=0;i<points.size();i++){
CBrush* pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(points[i].x-r,points[i].y-r,points[i].x+r,points[i].y+r);
pDC->SelectObject(pOldBrush);
}
// TODO: add draw code for native data here
}
// CMyView printing
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
// CMyView diagnostics
#ifdef _DEBUG
void CMyView::AssertValid() const
{
CView::AssertValid();
}
void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyDoc* CMyView::GetDocument() const // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG
// CMyView message handlers
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
center=point;
r=rand()%46+5; //r范围为5~50
color=RGB(rand()%256,rand()%256,rand()%256); //RGB颜色随机
brush.CreateSolidBrush(color);
points.push_back(center);
SetTimer(1,200,NULL);
CView::OnLButtonDown(nFlags, point);
}
void CMyView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
}
void CMyView::rise()
{
for(int i=0;i<points.size();i++)
{
points[i].y-=5;
if(points[i].y<-r)
{
points.erase(points.begin()+i);
i--;
}
}
}
void CMyView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1){
RedrawWindow();
rise();
}
CView::OnTimer(nIDEvent);
}
阅读全文