紧急求助如何打印窗体自身,在线等

沈阳大猫 2004-12-09 12:12:51
我有一个显示历史曲线的对话框窗体,上面的最大值日期等冬冬用text显示的。我做出了打印曲线部分
没有日期和最大值等。可是用户要求直接把对话框打印出来,查了很久没有找到打印窗体的例子。
那位大侠有打印窗体本身的例子或剪切板直接打印的例子贴出来让我看看,我学VC不久,不是很熟练。
最好有直接打印对话框窗体的例子,或者我把窗体部分剪切到剪切板直接打印,很急,谢谢大家了
...全文
210 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
沈阳大猫 2004-12-11
  • 打赏
  • 举报
回复
我现在找到一个把窗体拷贝到剪贴板的函数,现在在按钮事件中调用此函数打开画板粘贴就是我要打印的内容,可是我怎样继续操作剪贴板进行打印呢??我把函数贴出来
void CopyWndToClipboard( CWnd *pWnd )
{
CBitmap bitmap;
CClientDC dc(pWnd);
CDC memDC;
CRect rect;
memDC.CreateCompatibleDC(&dc);
pWnd->GetWindowRect(rect);
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
pWnd->OpenClipboard() ;
EmptyClipboard() ;
SetClipboardData (CF_BITMAP, bitmap.GetSafeHandle() ) ;
CloseClipboard () ;
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}
或者把剪贴板的内容保存为图片文件也成啊
请各位帮帮忙
沈阳大猫 2004-12-11
  • 打赏
  • 举报
回复
结帖,虽然还没有最后解决
tigerjacky 2004-12-11
  • 打赏
  • 举报
回复
保存位图为文件:
BOOL SaveBitmapToFile(HBITMAP hBitmap , CString lpFileName)
{
HDC hDC; //设备描述表
int iBits; //当前显示分辨率下每个像素所占字节数
WORD wBitCount; //位图中每个像素所占字节数
DWORD dwPaletteSize=0, //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap;
BITMAPFILEHEADER bmfHdr; //位图属性结构
BITMAPINFOHEADER bi; //位图文件头结构
LPBITMAPINFOHEADER lpbi; //位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL; //指向位图信息头结构,定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) *
GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);

if(iBits <= 1)
{
wBitCount = 1;
}
else if(iBits <= 4)
{
wBitCount = 4;
}
else if(iBits <= 8)
{
wBitCount = 8;
}
else if(iBits <= 24)
{
wBitCount = 24;
}
//计算调色板大小
if(wBitCount <= 8)
{
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
}

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight ;

//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;

// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if(NULL != hPal)
{
hDC = ::GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}

// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,
(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

//恢复调色板
if(NULL != hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}

//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if(fh == INVALID_HANDLE_VALUE)
{
return FALSE;
}

// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize;

//写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
//写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

//消除内存分配
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

return TRUE;
}
tigerjacky 2004-12-11
  • 打赏
  • 举报
回复
保存成BMP:
CRect rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
HDC hScrDC,hMemDC; // 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;// 位图句柄
int xScrn, yScrn; // 屏幕分辨率
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); //为屏幕创建设备描述表
hMemDC = CreateCompatibleDC(hScrDC);//为屏幕设备描述表创建兼容的内存设备描述表
xScrn = GetDeviceCaps(hScrDC, HORZRES);// 获得屏幕分辨率
yScrn = GetDeviceCaps(hScrDC, VERTRES);
hBitmap = CreateCompatibleBitmap(hScrDC, rect.Width(), rect.Height());// 创建一个与屏幕设备描述表兼容的位图
hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);// 把新位图选到内存设备描述表中
BitBlt(hMemDC, 0, 0, rect.Width(), rect.Height(),hScrDC,rect.left,rect.top, SRCCOPY);// 把屏幕设备描述表拷贝到内存设备描述表中
hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);//得到屏幕位图的句柄
DeleteDC(hScrDC);//清除
DeleteDC(hMemDC);
return hBitmap;// 返回位图句柄
沈阳大猫 2004-12-11
  • 打赏
  • 举报
回复
pntnow.zip这个程序我看了,对我的程序帮助不大
Mr-Chen 2004-12-11
  • 打赏
  • 举报
回复
http://www.moon-soft.com/download/soft/2030.htm
沈阳大猫 2004-12-10
  • 打赏
  • 举报
回复
不让提前,晕晕
沈阳大猫 2004-12-09
  • 打赏
  • 举报
回复
能给个小例子吗?我现在完全晕了,我想到过屏幕截图再打印图形的办法,可是没有做成功。
Kudeet 2004-12-09
  • 打赏
  • 举报
回复
你可以试试截屏幕,范围就是GetWindowRect返回的整个窗口,如果需要可以去掉标题栏,然后再窗口保存为一个位图再打印。
沈阳大猫 2004-12-09
  • 打赏
  • 举报
回复
顶一下,真的没有人回答吗,我的QQ:15796739
有回的通知我一下,继续在线等待。分不够可以再加
沈阳大猫 2004-12-09
  • 打赏
  • 举报
回复
我把我代码贴出来吧,
MDI主程序调用对话框部分
void CXXXXApp::OnHistory()
{
// TODO: Add your command handler code here
if ( !m_historyCurveSheet )
{
m_historyCurveSheet=new HCurveSheet ("历史曲线显示");
m_historyCurveSheet->Create();
}
else
{
if( m_historyCurveSheet->m_hWnd == NULL )
m_historyCurveSheet->Create();
else
m_historyCurveSheet->SetActiveWindow();
}
}

对话框类声明部分
// Chcdisp dialog

class Chcdisp : public CPropertyPage
{
DECLARE_DYNCREATE(Chcdisp)

BYTE *TimeByte;
BYTE MaxTimeByte[10];
BYTE MinTimeByte[10];
float CordY[289];
float CordPreY[25];
BYTE HaveTimerFlag;

float max;
float min;

int Left;
int Top;
int Height;
int Width;

// Construction
public:
Chcdisp();
~Chcdisp();

// Dialog Data
//{{AFX_DATA(Chcdisp)
enum { IDD = IDD_HISTORY_CUR_DISP };
CDateTimeCtrl m_datatime;
CComboBox m_curve;
CTime m_max_time;
float m_max;
float m_min;
CTime m_date;
CString m_curdata;
CString m_curvetime;
CTime m_min_time;
//}}AFX_DATA


// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(Chcdisp)
public:
virtual BOOL OnKillActive();
virtual BOOL OnSetActive();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(Chcdisp)
afx_msg void OnDestroy();
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg LRESULT OnModifyQxData(WPARAM,LPARAM);
afx_msg void OnSelchangeCurve();
afx_msg void OnNext();
afx_msg void OnPrv();
afx_msg void OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnFormPrint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

void OnOk();
};

消息映射部分
HWND m_hQxDispWnd;
/////////////////////////////////////////////////////////////////////////////
// Chcdisp property page

IMPLEMENT_DYNCREATE(Chcdisp, CPropertyPage)

Chcdisp::Chcdisp() : CPropertyPage(Chcdisp::IDD)
{
//{{AFX_DATA_INIT(Chcdisp)
m_max_time = 0;
m_max = 0.0f;
m_min = 0.0f;
m_date = 0;
m_curdata = _T("");
m_curvetime = _T("");
m_min_time = 0;
//}}AFX_DATA_INIT
HaveTimerFlag = 0;
}

Chcdisp::~Chcdisp()
{
}

void Chcdisp::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Chcdisp)
DDX_Control(pDX, IDC_DATETIMEPICKER1, m_datatime);
DDX_Control(pDX, IDC_CURVE, m_curve);
DDX_DateTimeCtrl(pDX, IDC_MAX_TIME, m_max_time);
DDX_Text(pDX, IDC_MAX, m_max);
DDX_Text(pDX, IDC_MIN, m_min);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_date);
DDX_Text(pDX, IDC_CURVEDATA, m_curdata);
DDX_Text(pDX, IDC_CURVETIME, m_curvetime);
DDX_DateTimeCtrl(pDX, IDC_MIN_TIME, m_min_time);
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(Chcdisp, CPropertyPage)
//{{AFX_MSG_MAP(Chcdisp)
ON_WM_DESTROY()
ON_WM_TIMER()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDBLCLK()
ON_WM_PAINT()
ON_MESSAGE(WM_MODIFYQXDATA,OnModifyQxData)
ON_CBN_SELCHANGE(IDC_CURVE, OnSelchangeCurve)
ON_BN_CLICKED(ID_NEXT, OnNext)
ON_BN_CLICKED(ID_PRV, OnPrv)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER1, OnDatetimechangeDatetimepicker1)
ON_WM_LBUTTONDOWN()
ON_BN_CLICKED(ID_PRINT, OnFormPrint)//这是我对话框上的一个按钮,我想点击这个按钮就把对话框打印出来
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

我现在就是想把整个曲线对话框打印出来,而不是其上的一部分
bobob 2004-12-09
  • 打赏
  • 举报
回复
把dialog存成一张图,然后
ShellExecute(NULL,"print",fileName,NULL,NULL,SW_SHOWNORMAL);
Ah 2004-12-09
  • 打赏
  • 举报
回复
将你的窗口的DC传给打印机就行了
taianmonkey 2004-12-09
  • 打赏
  • 举报
回复
http://www.codeproject.com/printing/printlib.asp
沈阳大猫 2004-12-09
  • 打赏
  • 举报
回复
to laiyiling:
程序看了, 可是程序不是打印对话框本身,而是打印对话框里面的控件内容,不是我要求的打印对话框本身啊
Kudeet 2004-12-09
  • 打赏
  • 举报
回复
参考打印对话框的例子
http://www.vckbase.com/sourcecode/print/EBCode21.zip
沈阳大猫 2004-12-09
  • 打赏
  • 举报
回复
顶一下,没有人有吗?

16,472

社区成员

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

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

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