回 帖 发 新 帖 刷新版面

主题:[原创]页面设置和打印对话框的联合使用

//zlhex@163.com
#include <windows.h> 
#include <commctrl.h>
#include <tchar.h>
#include "resource.h"


BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
HDC GetPrinterDC(HWND hwnd, DEVMODE *lpDevMode);
BOOL GetPageInfo(HWND hwnd, DEVMODE *lpDevMode, LPRECT lprtMargin);
BOOL SetPageInfo(HWND hwnd, DEVMODE *lpDevMode, LPRECT lprtMargin);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{    
    DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc,(LPARAM)NULL);
    return 0;
}



BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
    static DEVMODE DevMode;
    static RECT rtMargin;
    DOCINFO di;
    HDC hDC;
    
    switch(message)
    {
    case WM_COMMAND:        
        switch(LOWORD(wParam))
        {
        case IDC_BUTTON1:
            SetPageInfo(hDlg,&DevMode,&rtMargin);
            return TRUE;
        case IDC_BUTTON2:
            hDC = GetPrinterDC(NULL,&DevMode);
            if(hDC)
            {
                di.cbSize = sizeof(di);
                di.lpszDocName = TEXT("abc"); 
                di.lpszOutput = NULL; 
                di.lpszDatatype =NULL; 
                di.fwType = 0;                
                if(StartDoc(hDC,&di)>0) 
                { 
                    StartPage(hDC); 
                    MoveToEx(hDC,0,0,NULL);
                    LineTo(hDC,1000,1000);                
                    EndPage(hDC); 
                    EndDoc(hDC);                     
                }            
                DeleteDC(hDC);
            }
            return TRUE;
        case IDCANCEL:
            EndDialog(hDlg,FALSE);
            return TRUE;
        }
        break;
    case WM_INITDIALOG:    
        GetPageInfo(hDlg,&DevMode,&rtMargin);
        return FALSE;
    }
    return FALSE;
}

回复列表 (共3个回复)

沙发

HDC GetPrinterDC(HWND hwnd, DEVMODE *lpDevMode)
{
    PRINTDLGEX pdex;
    HRESULT hResult;

    SecureZeroMemory(&pdex,sizeof(PRINTDLGEX));
    pdex.lStructSize = sizeof(PRINTDLGEX);
    pdex.hwndOwner = hwnd;
    if(!hwnd) pdex.hwndOwner = GetDesktopWindow();
    pdex.Flags = PD_RETURNDC|PD_NOPAGENUMS;
    pdex.nStartPage = -1;
    if(lpDevMode)
    {
        pdex.hDevMode = GlobalAlloc(GMEM_MOVEABLE,sizeof(DEVMODE));
        if(!pdex.hDevMode) return NULL;
        CopyMemory(GlobalLock(pdex.hDevMode),lpDevMode,sizeof(DEVMODE));
        GlobalUnlock(pdex.hDevMode);
    }
    hResult = PrintDlgEx(&pdex);
    if((hResult == S_OK) && (pdex.dwResultAction == PD_RESULT_PRINT || pdex.dwResultAction == PD_RESULT_APPLY))
    {
        if(pdex.hDevMode && lpDevMode)
        {
            CopyMemory(lpDevMode,GlobalLock(pdex.hDevMode),sizeof(DEVMODE));
            GlobalUnlock(pdex.hDevMode);
        }
        if(pdex.dwResultAction == PD_RESULT_APPLY)
        {
            DeleteDC(pdex.hDC);            
            pdex.hDC = NULL;
        }
    }
    if(pdex.hDevMode) GlobalFree(pdex.hDevMode);
    if(pdex.hDevNames) GlobalFree(pdex.hDevNames);
    return pdex.hDC;//Delete DC when done
}


BOOL GetPageInfo(HWND hwnd, DEVMODE *lpDevMode, LPRECT lprtMargin)
{
    PAGESETUPDLG psd;

    if(!lpDevMode && !lprtMargin) return FALSE;
    SecureZeroMemory(&psd,sizeof(PAGESETUPDLG));
    psd.lStructSize = sizeof(psd);
    psd.hwndOwner = hwnd;
    psd.Flags = PSD_INHUNDREDTHSOFMILLIMETERS|PSD_RETURNDEFAULT;
    if(PageSetupDlg(&psd))
    {
        if(psd.hDevMode)
        {
            CopyMemory(lpDevMode,GlobalLock(psd.hDevMode),sizeof(DEVMODE));
            GlobalUnlock(psd.hDevMode);
            GlobalFree(psd.hDevMode); 
        }
        if(psd.hDevNames) GlobalFree(psd.hDevNames);
        if(lprtMargin) *lprtMargin = psd.rtMargin;
        return TRUE;
    }
    return FALSE;
}

BOOL SetPageInfo(HWND hwnd, DEVMODE *lpDevMode, LPRECT lprtMargin)
{
    PAGESETUPDLG psd;
    HRESULT hResult;

    if(!lpDevMode && !lprtMargin) return FALSE;
    SecureZeroMemory(&psd,sizeof(PAGESETUPDLG));
    psd.lStructSize = sizeof(PAGESETUPDLG);
    psd.hwndOwner = hwnd;
    psd.hInstance = GetModuleHandle(NULL);
    psd.lpPageSetupTemplateName = MAKEINTRESOURCE(IDD_DIALOG2);
    psd.Flags = PSD_INHUNDREDTHSOFMILLIMETERS|PSD_ENABLEPAGESETUPTEMPLATE;    
    if(lprtMargin)
    {
        psd.Flags |= PSD_MARGINS;
        psd.rtMargin = *lprtMargin;
    }
    if(lpDevMode)
    {        
        psd.hDevMode = GlobalAlloc(GMEM_MOVEABLE,sizeof(DEVMODE));
        if(!psd.hDevMode) return FALSE;
        CopyMemory(GlobalLock(psd.hDevMode),lpDevMode,sizeof(DEVMODE));
        GlobalUnlock(psd.hDevMode);
    }
    if(hResult = PageSetupDlg(&psd))
    {
        if(psd.hDevMode && lpDevMode)
        {
            CopyMemory(lpDevMode,GlobalLock(psd.hDevMode),sizeof(DEVMODE));
            GlobalUnlock(psd.hDevMode);             
        }        
        if(lprtMargin) *lprtMargin = psd.rtMargin;
    }
    if(psd.hDevMode) GlobalFree(psd.hDevMode);
    if(psd.hDevNames) GlobalFree(psd.hDevNames);
    return hResult;
}

板凳

//resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Script1.rc
//

#include <dlgs.h>

#define IDD_DIALOG1                     101
#define IDD_DIALOG2                     102

#define IDC_BUTTON1                     1001
#define IDC_BUTTON2                     1002



// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        103
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

3 楼

//Script1.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(中华人民共和国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 50, 50, 135, 70
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 10, "宋体", 0, 0, 0x0
BEGIN
    PUSHBUTTON      "设置",IDC_BUTTON1,7,7,50,14
    PUSHBUTTON      "打印",IDC_BUTTON2,7,31,50,14
END

IDD_DIALOG2 DIALOGEX 50, 50, 273, 148
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_CONTEXTHELP
CAPTION "页面设置"
FONT 9, "宋体", 400, 0, 0x86
BEGIN
    GROUPBOX        "纸张",grp2,7,5,178,56
    LTEXT           "大小(&Z):",stc2,15,20,32,8
    COMBOBOX        cmb2,50,18,125,150,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    LTEXT           "来源(&S):",stc3,15,40,32,8
    COMBOBOX        cmb3,50,38,125,150,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "方向",grp1,7,63,54,56
    CONTROL         "纵向(&O)",rad1,"Button",BS_AUTORADIOBUTTON,15,78,43,10
    CONTROL         "横向(&A)",rad2,"Button",BS_AUTORADIOBUTTON,15,98,43,10
    GROUPBOX        "页边距(毫米)",grp4,65,63,120,56
    LTEXT           "左(&L):",stc15,73,78,24,8
    EDITTEXT        edt4,97,76,24,12
    LTEXT           "右(&R):",stc16,126,78,24,8
    EDITTEXT        edt6,151,76,24,12
    LTEXT           "上(&T):",stc17,73,100,24,8
    EDITTEXT        edt5,97,98,24,12
    LTEXT           "下(&B):",stc18,126,100,24,8
    EDITTEXT        edt7,151,98,24,12
    GROUPBOX        "预览",grp3,189,5,75,114
    CONTROL         "",rct1,"Static",SS_WHITERECT,205,35,42,59
    CONTROL         "",rct2,"Static",SS_GRAYRECT,252,32,3,65
    CONTROL         "",rct3,"Static",SS_GRAYRECT,205,99,45,3
    DEFPUSHBUTTON   "确定",IDOK,91,127,56,14
    PUSHBUTTON      "取消",IDCANCEL,150,127,56,14
    PUSHBUTTON      "打印机(&P)...",psh3,209,127,56,14
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO 
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 128
        TOPMARGIN, 7
        BOTTOMMARGIN, 63
    END

    IDD_DIALOG2, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 266
        TOPMARGIN, 5
        BOTTOMMARGIN, 141
    END
END
#endif    // APSTUDIO_INVOKED


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// RT_MANIFEST
//

1                       RT_MANIFEST             "XPStyle.manifest"
#endif    // 中文(中华人民共和国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

我来回复

您尚未登录,请登录后再回复。点此登录或注册