我有一个显示历史曲线的对话框窗体,上面的最大值日期等冬冬用text显示的。我做出了打印曲线部分
没有日期和最大值等。可是用户要求直接把对话框打印出来,查了很久没有找到打印窗体的例子。
那位大侠有打印窗体本身的例子或剪切板直接打印的例子贴出来让我看看,我学VC不久,不是很熟练。
最好有直接打印对话框窗体的例子,或者我把窗体部分剪切到剪切板直接打印,很急,谢谢大家了

解决方案 »

  1.   

    参考打印对话框的例子
    http://www.vckbase.com/sourcecode/print/EBCode21.zip
      

  2.   

    to laiyiling:
    程序看了, 可是程序不是打印对话框本身,而是打印对话框里面的控件内容,不是我要求的打印对话框本身啊
      

  3.   

    http://www.codeproject.com/printing/printlib.asp
      

  4.   

    把dialog存成一张图,然后
    ShellExecute(NULL,"print",fileName,NULL,NULL,SW_SHOWNORMAL);
      

  5.   

    我把我代码贴出来吧,
    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()我现在就是想把整个曲线对话框打印出来,而不是其上的一部分
      

  6.   

    你可以试试截屏幕,范围就是GetWindowRect返回的整个窗口,如果需要可以去掉标题栏,然后再窗口保存为一个位图再打印。
      

  7.   

    我现在找到一个把窗体拷贝到剪贴板的函数,现在在按钮事件中调用此函数打开画板粘贴就是我要打印的内容,可是我怎样继续操作剪贴板进行打印呢??我把函数贴出来
    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();
    }
    或者把剪贴板的内容保存为图片文件也成啊
    请各位帮帮忙
      

  8.   

    http://www.moon-soft.com/download/soft/2030.htm
      

  9.   

    pntnow.zip这个程序我看了,对我的程序帮助不大
      

  10.   

    保存成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;// 返回位图句柄
      

  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;
    }