Print.cpp
上传用户:tj_dwf
上传日期:2020-11-17
资源大小:215k
文件大小:18k
源码类别:

RichEdit

开发平台:

Visual C++

  1. /******************************************************************************
  2. *
  3. *
  4. * Notepad2
  5. *
  6. * Print.cpp
  7. *   Scintilla Printing Functionality
  8. *   Mostly taken from SciTE, (c) Neil Hodgson, http://www.scintilla.org
  9. *
  10. * See Readme.txt for more information about this source code.
  11. * Please send me your comments to this work.
  12. *
  13. * See License.txt for details about distribution and modification.
  14. *
  15. *                                              (c) Florian Balmer 1996-2010
  16. *                                                  florian.balmer@gmail.com
  17. *                                               http://www.flos-freeware.ch
  18. *
  19. *
  20. ******************************************************************************/
  21. #define _WIN32_WINNT 0x501
  22. #include <windows.h>
  23. #include <commctrl.h>
  24. #include <shlwapi.h>
  25. #include <commdlg.h>
  26. #include <string.h>
  27. #include "platform.h"
  28. #include "scintilla.h"
  29. #include "scilexer.h"
  30. extern "C" {
  31. #include "dialogs.h"
  32. #include "helpers.h"
  33. }
  34. #include "resource.h"
  35. extern "C" HINSTANCE g_hInstance;
  36. // Global settings...
  37. extern "C" int iPrintHeader;
  38. extern "C" int iPrintFooter;
  39. extern "C" int iPrintColor;
  40. extern "C" int iPrintZoom;
  41. extern "C" RECT pagesetupMargin;
  42. // Stored objects...
  43. HGLOBAL hDevMode = NULL;
  44. HGLOBAL hDevNames = NULL;
  45. //=============================================================================
  46. //
  47. //  EditPrint() - Code from SciTE
  48. //
  49. extern "C" HWND hwndStatus;
  50. void StatusUpdatePrintPage(int iPageNum)
  51. {
  52.   WCHAR tch[32];
  53.   FormatString(tch,COUNTOF(tch),IDS_PRINTFILE,iPageNum);
  54.   StatusSetText(hwndStatus,255,tch);
  55.   StatusSetSimple(hwndStatus,TRUE);
  56.   InvalidateRect(hwndStatus,NULL,TRUE);
  57.   UpdateWindow(hwndStatus);
  58. }
  59. extern "C" BOOL EditPrint(HWND hwnd,LPCWSTR pszDocTitle,LPCWSTR pszPageFormat)
  60. {
  61.   // Don't print empty documents
  62.   if (SendMessage(hwnd,SCI_GETLENGTH,0,0) == 0) {
  63.     MsgBox(MBINFO,IDS_PRINT_EMPTY);
  64.     return TRUE;
  65.   }
  66.   int startPos;
  67.   int endPos;
  68.   HDC hdc;
  69.   RECT rectMargins;
  70.   RECT rectPhysMargins;
  71.   RECT rectSetup;
  72.   POINT ptPage;
  73.   POINT ptDpi;
  74.   //RECT rectSetup;
  75.   TEXTMETRIC tm;
  76.   int headerLineHeight;
  77.   HFONT fontHeader;
  78.   int footerLineHeight;
  79.   HFONT fontFooter;
  80.   WCHAR dateString[256];
  81.   DOCINFO di = {sizeof(DOCINFO), 0, 0, 0, 0};
  82.   LONG lengthDoc;
  83.   LONG lengthDocMax;
  84.   LONG lengthPrinted;
  85.   struct RangeToFormat frPrint;
  86.   int pageNum;
  87.   BOOL printPage;
  88.   WCHAR pageString[32];
  89.   HPEN pen;
  90.   HPEN penOld;
  91.   PRINTDLG pdlg = { sizeof(PRINTDLG), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  92.   pdlg.hwndOwner = GetParent(hwnd);
  93.   pdlg.hInstance = g_hInstance;
  94.   pdlg.Flags = PD_USEDEVMODECOPIES | PD_ALLPAGES | PD_RETURNDC;
  95.   pdlg.nFromPage = 1;
  96.   pdlg.nToPage = 1;
  97.   pdlg.nMinPage = 1;
  98.   pdlg.nMaxPage = 0xffffU;
  99.   pdlg.nCopies = 1;
  100.   pdlg.hDC = 0;
  101.   pdlg.hDevMode = hDevMode;
  102.   pdlg.hDevNames = hDevNames;
  103.   startPos = SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0);;
  104.   endPos = SendMessage(hwnd,SCI_GETSELECTIONEND,0,0);
  105.   if (startPos == endPos) {
  106.     pdlg.Flags |= PD_NOSELECTION;
  107.   } else {
  108.     pdlg.Flags |= PD_SELECTION;
  109.   }
  110.   if (0) {
  111.     // Don't display dialog box, just use the default printer and options
  112.     pdlg.Flags |= PD_RETURNDEFAULT;
  113.   }
  114.   if (!PrintDlg(&pdlg)) {
  115.     return TRUE; // False means error...
  116.   }
  117.   hDevMode = pdlg.hDevMode;
  118.   hDevNames = pdlg.hDevNames;
  119.   hdc = pdlg.hDC;
  120.   // Get printer resolution
  121.   ptDpi.x = GetDeviceCaps(hdc, LOGPIXELSX);    // dpi in X direction
  122.   ptDpi.y = GetDeviceCaps(hdc, LOGPIXELSY);    // dpi in Y direction
  123.   // Start by getting the physical page size (in device units).
  124.   ptPage.x = GetDeviceCaps(hdc, PHYSICALWIDTH);   // device units
  125.   ptPage.y = GetDeviceCaps(hdc, PHYSICALHEIGHT);  // device units
  126.   // Get the dimensions of the unprintable
  127.   // part of the page (in device units).
  128.   rectPhysMargins.left = GetDeviceCaps(hdc, PHYSICALOFFSETX);
  129.   rectPhysMargins.top = GetDeviceCaps(hdc, PHYSICALOFFSETY);
  130.   // To get the right and lower unprintable area,
  131.   // we take the entire width and height of the paper and
  132.   // subtract everything else.
  133.   rectPhysMargins.right = ptPage.x            // total paper width
  134.                           - GetDeviceCaps(hdc, HORZRES) // printable width
  135.                           - rectPhysMargins.left;        // left unprintable margin
  136.   rectPhysMargins.bottom = ptPage.y            // total paper height
  137.                            - GetDeviceCaps(hdc, VERTRES)  // printable height
  138.                            - rectPhysMargins.top;        // right unprintable margin
  139.   // At this point, rectPhysMargins contains the widths of the
  140.   // unprintable regions on all four sides of the page in device units.
  141.   // Take in account the page setup given by the user (if one value is not null)
  142.   if (pagesetupMargin.left != 0 || pagesetupMargin.right != 0 ||
  143.           pagesetupMargin.top != 0 || pagesetupMargin.bottom != 0) {
  144.     // Convert the hundredths of millimeters (HiMetric) or
  145.     // thousandths of inches (HiEnglish) margin values
  146.     // from the Page Setup dialog to device units.
  147.     // (There are 2540 hundredths of a mm in an inch.)
  148.     WCHAR localeInfo[3];
  149.     GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, localeInfo, 3);
  150.     if (localeInfo[0] == L'0') {  // Metric system. L'1' is US System
  151.       rectSetup.left = MulDiv (pagesetupMargin.left, ptDpi.x, 2540);
  152.       rectSetup.top = MulDiv (pagesetupMargin.top, ptDpi.y, 2540);
  153.       rectSetup.right  = MulDiv(pagesetupMargin.right, ptDpi.x, 2540);
  154.       rectSetup.bottom  = MulDiv(pagesetupMargin.bottom, ptDpi.y, 2540);
  155.     } else {
  156.       rectSetup.left  = MulDiv(pagesetupMargin.left, ptDpi.x, 1000);
  157.       rectSetup.top  = MulDiv(pagesetupMargin.top, ptDpi.y, 1000);
  158.       rectSetup.right  = MulDiv(pagesetupMargin.right, ptDpi.x, 1000);
  159.       rectSetup.bottom  = MulDiv(pagesetupMargin.bottom, ptDpi.y, 1000);
  160.     }
  161.     // Dont reduce margins below the minimum printable area
  162.     rectMargins.left  = max(rectPhysMargins.left, rectSetup.left);
  163.     rectMargins.top  = max(rectPhysMargins.top, rectSetup.top);
  164.     rectMargins.right  = max(rectPhysMargins.right, rectSetup.right);
  165.     rectMargins.bottom  = max(rectPhysMargins.bottom, rectSetup.bottom);
  166.   } else {
  167.     rectMargins.left  = rectPhysMargins.left;
  168.     rectMargins.top  = rectPhysMargins.top;
  169.     rectMargins.right  = rectPhysMargins.right;
  170.     rectMargins.bottom  = rectPhysMargins.bottom;
  171.   }
  172.   // rectMargins now contains the values used to shrink the printable
  173.   // area of the page.
  174.   // Convert device coordinates into logical coordinates
  175.   DPtoLP(hdc, (LPPOINT)&rectMargins, 2);
  176.   DPtoLP(hdc, (LPPOINT)&rectPhysMargins, 2);
  177.   // Convert page size to logical units and we're done!
  178.   DPtoLP(hdc, (LPPOINT) &ptPage, 1);
  179.   headerLineHeight = MulDiv(8,ptDpi.y, 72);
  180.   fontHeader = CreateFont(headerLineHeight,
  181.                           0, 0, 0,
  182.                           FW_BOLD,
  183.                           0,
  184.                           0,
  185.                           0, 0, 0,
  186.                           0, 0, 0,
  187.                           L"Arial");
  188.   SelectObject(hdc, fontHeader);
  189.   GetTextMetrics(hdc, &tm);
  190.   headerLineHeight = tm.tmHeight + tm.tmExternalLeading;
  191.   if (iPrintHeader == 3)
  192.     headerLineHeight = 0;
  193.   footerLineHeight = MulDiv(7,ptDpi.y, 72);
  194.   fontFooter = CreateFont(footerLineHeight,
  195.                           0, 0, 0,
  196.                           FW_NORMAL,
  197.                           0,
  198.                           0,
  199.                           0, 0, 0,
  200.                           0, 0, 0,
  201.                           L"Arial");
  202.   SelectObject(hdc, fontFooter);
  203.   GetTextMetrics(hdc, &tm);
  204.   footerLineHeight = tm.tmHeight + tm.tmExternalLeading;
  205.   if (iPrintFooter == 1)
  206.     footerLineHeight = 0;
  207.   di.lpszDocName = pszDocTitle;
  208.   di.lpszOutput = 0;
  209.   di.lpszDatatype = 0;
  210.   di.fwType = 0;
  211.   if (StartDoc(hdc, &di) < 0) {
  212.     DeleteDC(hdc);
  213.     if (fontHeader)
  214.       DeleteObject(fontHeader);
  215.     if (fontFooter)
  216.       DeleteObject(fontFooter);
  217.     return FALSE;
  218.   }
  219.   // Get current date...
  220.   SYSTEMTIME st;
  221.   GetLocalTime(&st);
  222.   GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&st,NULL,dateString,256);
  223.   // Get current time...
  224.   if (iPrintHeader == 0)
  225.   {
  226.     WCHAR timeString[128];
  227.     GetTimeFormat(LOCALE_USER_DEFAULT,TIME_NOSECONDS,&st,NULL,timeString,128);
  228.     lstrcat(dateString,L" ");
  229.     lstrcat(dateString,timeString);
  230.   }
  231.   // Set print color mode
  232.   int printColorModes[5] = {
  233.     SC_PRINT_NORMAL,
  234.     SC_PRINT_INVERTLIGHT,
  235.     SC_PRINT_BLACKONWHITE,
  236.     SC_PRINT_COLOURONWHITE,
  237.     SC_PRINT_COLOURONWHITEDEFAULTBG };
  238.   SendMessage(hwnd,SCI_SETPRINTCOLOURMODE,printColorModes[iPrintColor],0);
  239.   // Set print zoom...
  240.   SendMessage(hwnd,SCI_SETPRINTMAGNIFICATION,(WPARAM)iPrintZoom,0);
  241.   lengthDoc = SendMessage(hwnd,SCI_GETLENGTH,0,0);
  242.   lengthDocMax = lengthDoc;
  243.   lengthPrinted = 0;
  244.   // Requested to print selection
  245.   if (pdlg.Flags & PD_SELECTION) {
  246.     if (startPos > endPos) {
  247.       lengthPrinted = endPos;
  248.       lengthDoc = startPos;
  249.     } else {
  250.       lengthPrinted = startPos;
  251.       lengthDoc = endPos;
  252.     }
  253.     if (lengthPrinted < 0)
  254.       lengthPrinted = 0;
  255.     if (lengthDoc > lengthDocMax)
  256.       lengthDoc = lengthDocMax;
  257.   }
  258.   // We must substract the physical margins from the printable area
  259.   frPrint.hdc = hdc;
  260.   frPrint.hdcTarget = hdc;
  261.   frPrint.rc.left = rectMargins.left - rectPhysMargins.left;
  262.   frPrint.rc.top = rectMargins.top - rectPhysMargins.top;
  263.   frPrint.rc.right = ptPage.x - rectMargins.right - rectPhysMargins.left;
  264.   frPrint.rc.bottom = ptPage.y - rectMargins.bottom - rectPhysMargins.top;
  265.   frPrint.rcPage.left = 0;
  266.   frPrint.rcPage.top = 0;
  267.   frPrint.rcPage.right = ptPage.x - rectPhysMargins.left - rectPhysMargins.right - 1;
  268.   frPrint.rcPage.bottom = ptPage.y - rectPhysMargins.top - rectPhysMargins.bottom - 1;
  269.   frPrint.rc.top += headerLineHeight + headerLineHeight / 2;
  270.   frPrint.rc.bottom -= footerLineHeight + footerLineHeight / 2;
  271.   // Print each page
  272.   pageNum = 1;
  273.   while (lengthPrinted < lengthDoc) {
  274.     printPage = (!(pdlg.Flags & PD_PAGENUMS) ||
  275.                  (pageNum >= pdlg.nFromPage) && (pageNum <= pdlg.nToPage));
  276.     wsprintf(pageString, pszPageFormat, pageNum);
  277.     if (printPage) {
  278.       // Show wait cursor...
  279.       SendMessage(hwnd,SCI_SETCURSOR,SC_CURSORWAIT,0);
  280.       // Display current page number in Statusbar
  281.       StatusUpdatePrintPage(pageNum);
  282.       StartPage(hdc);
  283.       SetTextColor(hdc, RGB(0,0,0));
  284.       SetBkColor(hdc, RGB(255,255,255));
  285.       SelectObject(hdc, fontHeader);
  286.       UINT ta = SetTextAlign(hdc, TA_BOTTOM);
  287.       RECT rcw = {frPrint.rc.left, frPrint.rc.top - headerLineHeight - headerLineHeight / 2,
  288.                   frPrint.rc.right, frPrint.rc.top - headerLineHeight / 2};
  289.       rcw.bottom = rcw.top + headerLineHeight;
  290.       if (iPrintHeader < 3)
  291.       {
  292.         ExtTextOut(hdc, frPrint.rc.left + 5, frPrint.rc.top - headerLineHeight / 2,
  293.                       /*ETO_OPAQUE*/0, &rcw, pszDocTitle,
  294.                       lstrlen(pszDocTitle), NULL);
  295.       }
  296.       // Print date in header
  297.       if (iPrintHeader == 0 || iPrintHeader == 1)
  298.       {
  299.         SIZE sizeInfo;
  300.         SelectObject(hdc,fontFooter);
  301.         GetTextExtentPoint32(hdc,dateString,lstrlen(dateString),&sizeInfo);
  302.         ExtTextOut(hdc, frPrint.rc.right - 5 - sizeInfo.cx, frPrint.rc.top - headerLineHeight / 2,
  303.                       /*ETO_OPAQUE*/0, &rcw, dateString,
  304.                       lstrlen(dateString), NULL);
  305.       }
  306.       if (iPrintHeader < 3)
  307.       {
  308.         SetTextAlign(hdc, ta);
  309.         pen = CreatePen(0, 1, RGB(0,0,0));
  310.         penOld = (HPEN)SelectObject(hdc, pen);
  311.         MoveToEx(hdc, frPrint.rc.left, frPrint.rc.top - headerLineHeight / 4, NULL);
  312.         LineTo(hdc, frPrint.rc.right, frPrint.rc.top - headerLineHeight / 4);
  313.         SelectObject(hdc, penOld);
  314.         DeleteObject(pen);
  315.       }
  316.     }
  317.     frPrint.chrg.cpMin = lengthPrinted;
  318.     frPrint.chrg.cpMax = lengthDoc;
  319.     lengthPrinted = SendMessage(hwnd,SCI_FORMATRANGE,printPage,(LPARAM)&frPrint);
  320.     if (printPage) {
  321.       SetTextColor(hdc, RGB(0,0,0));
  322.       SetBkColor(hdc, RGB(255,255,255));
  323.       SelectObject(hdc, fontFooter);
  324.       UINT ta = SetTextAlign(hdc, TA_TOP);
  325.       RECT rcw = {frPrint.rc.left, frPrint.rc.bottom + footerLineHeight / 2,
  326.                   frPrint.rc.right, frPrint.rc.bottom + footerLineHeight + footerLineHeight / 2};
  327.       if (iPrintFooter == 0)
  328.       {
  329.         SIZE sizeFooter;
  330.         GetTextExtentPoint32(hdc,pageString,lstrlen(pageString),&sizeFooter);
  331.         ExtTextOut(hdc, frPrint.rc.right - 5 - sizeFooter.cx, frPrint.rc.bottom + footerLineHeight / 2,
  332.                       /*ETO_OPAQUE*/0, &rcw, pageString,
  333.                       lstrlen(pageString), NULL);
  334.         SetTextAlign(hdc, ta);
  335.         pen = ::CreatePen(0, 1, RGB(0,0,0));
  336.         penOld = (HPEN)SelectObject(hdc, pen);
  337.         SetBkColor(hdc, RGB(0,0,0));
  338.         MoveToEx(hdc, frPrint.rc.left, frPrint.rc.bottom + footerLineHeight / 4, NULL);
  339.         LineTo(hdc, frPrint.rc.right, frPrint.rc.bottom + footerLineHeight / 4);
  340.         SelectObject(hdc, penOld);
  341.         DeleteObject(pen);
  342.       }
  343.       EndPage(hdc);
  344.     }
  345.     pageNum++;
  346.     if ((pdlg.Flags & PD_PAGENUMS) && (pageNum > pdlg.nToPage))
  347.       break;
  348.   }
  349.   SendMessage(hwnd,SCI_FORMATRANGE, FALSE, 0);
  350.   EndDoc(hdc);
  351.   DeleteDC(hdc);
  352.   if (fontHeader)
  353.     DeleteObject(fontHeader);
  354.   if (fontFooter)
  355.     DeleteObject(fontFooter);
  356.   // Reset Statusbar to default mode
  357.   StatusSetSimple(hwndStatus,FALSE);
  358.   // Remove wait cursor...
  359.   SendMessage(hwnd,SCI_SETCURSOR,SC_CURSORNORMAL,0);
  360.   return TRUE;
  361. }
  362. //=============================================================================
  363. //
  364. //  EditPrintSetup() - Code from SciTE
  365. //
  366. //  Custom controls: 30 Zoom
  367. //                   31 Spin
  368. //                   32 Header
  369. //                   33 Footer
  370. //                   34 Colors
  371. //
  372. extern "C" UINT_PTR CALLBACK PageSetupHook(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
  373. {
  374.   switch (uiMsg)
  375.   {
  376.     case WM_INITDIALOG:
  377.       {
  378.         WCHAR tch[512];
  379.         WCHAR *p1,*p2;
  380.         SendDlgItemMessage(hwnd,30,EM_LIMITTEXT,32,0);
  381.         SendDlgItemMessage(hwnd,31,UDM_SETRANGE,0,MAKELONG((short)20,(short)-10));
  382.         SendDlgItemMessage(hwnd,31,UDM_SETPOS,0,MAKELONG((short)iPrintZoom,0));
  383.         // Set header options
  384.         GetString(IDS_PRINT_HEADER,tch,COUNTOF(tch));
  385.         lstrcat(tch,L"|");
  386.         p1 = tch;
  387.         while (p2 = StrChr(p1,L'|')) {
  388.           *p2++ = L'';
  389.           if (*p1)
  390.             SendDlgItemMessage(hwnd,32,CB_ADDSTRING,0,(LPARAM)p1);
  391.           p1 = p2; }
  392.         SendDlgItemMessage(hwnd,32,CB_SETCURSEL,(WPARAM)iPrintHeader,0);
  393.         // Set footer options
  394.         GetString(IDS_PRINT_FOOTER,tch,COUNTOF(tch));
  395.         lstrcat(tch,L"|");
  396.         p1 = tch;
  397.         while (p2 = StrChr(p1,L'|')) {
  398.           *p2++ = L'';
  399.           if (*p1)
  400.             SendDlgItemMessage(hwnd,33,CB_ADDSTRING,0,(LPARAM)p1);
  401.           p1 = p2; }
  402.         SendDlgItemMessage(hwnd,33,CB_SETCURSEL,(WPARAM)iPrintFooter,0);
  403.         // Set color options
  404.         GetString(IDS_PRINT_COLOR,tch,COUNTOF(tch));
  405.         lstrcat(tch,L"|");
  406.         p1 = tch;
  407.         while (p2 = StrChr(p1,L'|')) {
  408.           *p2++ = L'';
  409.           if (*p1)
  410.             SendDlgItemMessage(hwnd,34,CB_ADDSTRING,0,(LPARAM)p1);
  411.           p1 = p2; }
  412.         SendDlgItemMessage(hwnd,34,CB_SETCURSEL,(WPARAM)iPrintColor,0);
  413.         // Make combos handier
  414.         SendDlgItemMessage(hwnd,32,CB_SETEXTENDEDUI,TRUE,0);
  415.         SendDlgItemMessage(hwnd,33,CB_SETEXTENDEDUI,TRUE,0);
  416.         SendDlgItemMessage(hwnd,34,CB_SETEXTENDEDUI,TRUE,0);
  417.         SendDlgItemMessage(hwnd,1137,CB_SETEXTENDEDUI,TRUE,0);
  418.         SendDlgItemMessage(hwnd,1138,CB_SETEXTENDEDUI,TRUE,0);
  419.       }
  420.       break;
  421.     case WM_COMMAND:
  422.       if (LOWORD(wParam) == IDOK)
  423.       {
  424.         LONG lPos = SendDlgItemMessage(hwnd,31,UDM_GETPOS,0,0);
  425.         if (HIWORD(lPos) == 0)
  426.           iPrintZoom = (int)(short)LOWORD(lPos);
  427.         else
  428.           iPrintZoom = 0;
  429.         iPrintHeader = SendDlgItemMessage(hwnd,32,CB_GETCURSEL,0,0);
  430.         iPrintFooter = SendDlgItemMessage(hwnd,33,CB_GETCURSEL,0,0);
  431.         iPrintColor  = SendDlgItemMessage(hwnd,34,CB_GETCURSEL,0,0);
  432.       }
  433.       break;
  434.     default:
  435.       break;
  436.   }
  437.   return(0);
  438. }
  439. extern "C" void EditPrintSetup(HWND hwnd)
  440. {
  441.   DLGTEMPLATE* pDlgTemplate =
  442.     LoadThemedDialogTemplate(MAKEINTRESOURCE(IDD_PAGESETUP),g_hInstance);
  443.   PAGESETUPDLG pdlg;
  444.   ZeroMemory(&pdlg,sizeof(PAGESETUPDLG));
  445.   pdlg.lStructSize = sizeof(PAGESETUPDLG);
  446.   pdlg.Flags = PSD_ENABLEPAGESETUPHOOK | PSD_ENABLEPAGESETUPTEMPLATEHANDLE;
  447.   pdlg.lpfnPageSetupHook = PageSetupHook;
  448.   pdlg.hPageSetupTemplate = pDlgTemplate;
  449.   pdlg.hwndOwner = GetParent(hwnd);
  450.   pdlg.hInstance = g_hInstance;
  451.   if (pagesetupMargin.left != 0 || pagesetupMargin.right != 0 ||
  452.           pagesetupMargin.top != 0 || pagesetupMargin.bottom != 0) {
  453.     pdlg.Flags |= PSD_MARGINS;
  454.     pdlg.rtMargin.left = pagesetupMargin.left;
  455.     pdlg.rtMargin.top = pagesetupMargin.top;
  456.     pdlg.rtMargin.right = pagesetupMargin.right;
  457.     pdlg.rtMargin.bottom = pagesetupMargin.bottom;
  458.   }
  459.   pdlg.hDevMode = hDevMode;
  460.   pdlg.hDevNames = hDevNames;
  461.   if (PageSetupDlg(&pdlg)) {
  462.     pagesetupMargin.left = pdlg.rtMargin.left;
  463.     pagesetupMargin.top = pdlg.rtMargin.top;
  464.     pagesetupMargin.right = pdlg.rtMargin.right;
  465.     pagesetupMargin.bottom = pdlg.rtMargin.bottom;
  466.     hDevMode = pdlg.hDevMode;
  467.     hDevNames = pdlg.hDevNames;
  468.   }
  469.   LocalFree(pDlgTemplate);
  470. }
  471. //=============================================================================
  472. //
  473. //  EditPrintInit() - Setup default page margin if no values from registry
  474. //
  475. extern "C" void EditPrintInit()
  476. {
  477.   if (pagesetupMargin.left == -1 || pagesetupMargin.top == -1 ||
  478.       pagesetupMargin.right == -1 || pagesetupMargin.bottom == -1)
  479.   {
  480.     WCHAR localeInfo[3];
  481.     GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IMEASURE, localeInfo, 3);
  482.     if (localeInfo[0] == L'0') {  // Metric system. L'1' is US System
  483.       pagesetupMargin.left = 2000;
  484.       pagesetupMargin.top = 2000;
  485.       pagesetupMargin.right = 2000;
  486.       pagesetupMargin.bottom = 2000; }
  487.     else {
  488.       pagesetupMargin.left = 1000;
  489.       pagesetupMargin.top = 1000;
  490.       pagesetupMargin.right = 1000;
  491.       pagesetupMargin.bottom = 1000; }
  492.   }
  493. }
  494. // End of Print.cpp