我有一个显示历史曲线的对话框窗体,上面的最大值日期等冬冬用text显示的。我做出了打印曲线部分
没有日期和最大值等。可是用户要求直接把对话框打印出来,查了很久没有找到打印窗体的例子。
那位大侠有打印窗体本身的例子或剪切板直接打印的例子贴出来让我看看,我学VC不久,不是很熟练。
最好有直接打印对话框窗体的例子,或者我把窗体部分剪切到剪切板直接打印,很急,谢谢大家了
没有日期和最大值等。可是用户要求直接把对话框打印出来,查了很久没有找到打印窗体的例子。
那位大侠有打印窗体本身的例子或剪切板直接打印的例子贴出来让我看看,我学VC不久,不是很熟练。
最好有直接打印对话框窗体的例子,或者我把窗体部分剪切到剪切板直接打印,很急,谢谢大家了
http://www.vckbase.com/sourcecode/print/EBCode21.zip
程序看了, 可是程序不是打印对话框本身,而是打印对话框里面的控件内容,不是我要求的打印对话框本身啊
ShellExecute(NULL,"print",fileName,NULL,NULL,SW_SHOWNORMAL);
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 dialogclass 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 pageIMPLEMENT_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()我现在就是想把整个曲线对话框打印出来,而不是其上的一部分
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();
}
或者把剪贴板的内容保存为图片文件也成啊
请各位帮帮忙
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;// 返回位图句柄
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;
}