ReactOS  0.4.15-dev-5615-gc3644fd
print.c
Go to the documentation of this file.
1 /*
2  * Wordpad implementation - Printing and print preview functions
3  *
4  * Copyright 2007-2008 by Alexander N. Sørnes <alex@thehandofagony.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include <stdarg.h>
22 #include <windef.h>
23 #include <winbase.h>
24 #include <winreg.h>
25 #include <wingdi.h>
26 #include <winuser.h>
27 #include <richedit.h>
28 #include <commctrl.h>
29 #include <commdlg.h>
30 
31 #include "wordpad.h"
32 
33 typedef struct _previewinfo
34 {
35  int page;
47  float zoomratio;
48  int zoomlevel;
51 
54 
55 static RECT margins;
57 
58 extern const WCHAR wszPreviewWndClass[];
59 
60 static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0};
61 static const WCHAR var_previewpages[] = {'P','r','e','v','i','e','w','P','a','g','e','s',0};
62 
64 {
65  static WCHAR wszPrintFilter[MAX_STRING_LEN*2+6+4+1];
66  const WCHAR files_prn[] = {'*','.','P','R','N',0};
67  const WCHAR files_all[] = {'*','.','*','\0'};
68  LPWSTR p;
70 
71  p = wszPrintFilter;
73  p += lstrlenW(p) + 1;
74  lstrcpyW(p, files_prn);
75  p += lstrlenW(p) + 1;
77  p += lstrlenW(p) + 1;
78  lstrcpyW(p, files_all);
79  p += lstrlenW(p) + 1;
80  *p = 0;
81 
82  return wszPrintFilter;
83 }
84 
86 {
88 }
89 
91 {
92  DWORD size = sizeof(RECT);
93 
95  &size) != ERROR_SUCCESS || size != sizeof(RECT))
96  SetRect(&margins, 1757, 1417, 1757, 1417);
97 }
98 
100 {
102  (LPBYTE)&preview.pages_shown, sizeof(DWORD));
103 }
104 
106 {
107  DWORD size = sizeof(DWORD);
108  if(!hKey ||
111  size != sizeof(DWORD))
112  {
113  preview.pages_shown = 1;
114  } else {
115  if (preview.pages_shown < 1) preview.pages_shown = 1;
116  else if (preview.pages_shown > 2) preview.pages_shown = 2;
117  }
118 }
119 
120 
121 static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id)
122 {
123  REBARBANDINFOW rb;
126  HWND hButton;
127 
129  hButton = CreateWindowW(WC_BUTTONW, text,
130  WS_VISIBLE | WS_CHILD, 5, 5, 100, 15,
131  hRebarWnd, ULongToHandle(command), hInstance, NULL);
132 
136  rb.hwndChild = hButton;
137  rb.cyChild = rb.cyMinChild = 22;
138  rb.cx = rb.cxMinChild = 90;
139  rb.cxIdeal = 100;
140  rb.wID = id;
141 
142  SendMessageW(hRebarWnd, RB_INSERTBANDW, -1, (LPARAM)&rb);
143 }
144 
145 static HDC make_dc(void)
146 {
147  if(devNames && devMode)
148  {
151  HDC ret;
152 
153  ret = CreateDCW((LPWSTR)dn + dn->wDriverOffset,
154  (LPWSTR)dn + dn->wDeviceOffset, 0, dm);
155 
156  GlobalUnlock(dn);
157  GlobalUnlock(dm);
158 
159  return ret;
160  } else
161  {
162  return 0;
163  }
164 }
165 
166 static LONG twips_to_centmm(int twips)
167 {
168  return MulDiv(twips, CENTMM_PER_INCH, TWIPS_PER_INCH);
169 }
170 
171 static LONG centmm_to_twips(int mm)
172 {
174 }
175 
176 static LONG twips_to_pixels(int twips, int dpi)
177 {
178  return MulDiv(twips, dpi, TWIPS_PER_INCH);
179 }
180 
181 static LONG devunits_to_twips(int units, int dpi)
182 {
183  return MulDiv(units, TWIPS_PER_INCH, dpi);
184 }
185 
186 
188 {
189  RECT rc;
190  int width, height;
191 
192  if(hdc)
193  {
194  int dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
195  int dpiX = GetDeviceCaps(hdc, LOGPIXELSX);
198  } else
199  {
200  width = centmm_to_twips(18500);
201  height = centmm_to_twips(27000);
202  }
203 
205 
206  return rc;
207 }
208 
210 {
212 
214  {
215  int width = 0;
216  LRESULT result;
217  HDC hdc = make_dc();
218  RECT rc = get_print_rect(hdc);
219 
220  width = rc.right - rc.left;
221  if(!hdc)
222  {
223  HDC hMaindc = GetDC(hMainWnd);
224  hdc = CreateCompatibleDC(hMaindc);
225  ReleaseDC(hMainWnd, hMaindc);
226  }
228  DeleteDC(hdc);
229  if (result)
230  return;
231  /* otherwise EM_SETTARGETDEVICE failed, so fall back on wrapping
232  * to window using the NULL DC. */
233  }
234 
235  if (wordWrap != ID_WORDWRAP_NONE) {
237  } else {
239  }
240 
241 }
242 
244 {
246  static WCHAR file[MAX_PATH] = {'O','U','T','P','U','T','.','P','R','N',0};
247  static const WCHAR defExt[] = {'P','R','N',0};
248  static LPWSTR file_filter;
249 
250  if(!file_filter)
251  file_filter = get_print_file_filter(hMainWnd);
252 
253  ZeroMemory(&ofn, sizeof(ofn));
254 
255  ofn.lStructSize = sizeof(ofn);
258  ofn.lpstrFilter = file_filter;
259  ofn.lpstrFile = file;
261  ofn.lpstrDefExt = defExt;
262 
263  if(GetSaveFileNameW(&ofn))
264  return file;
265  else
266  return FALSE;
267 }
268 
270 {
271  int i;
272 
273  fr->chrg.cpMin = 0;
274 
275  for(i = 1; i < page; i++)
276  {
277  int bottom = fr->rc.bottom;
279  fr->rc.bottom = bottom;
280  }
281 }
282 
284 {
286 }
287 
288 void redraw_ruler(HWND hRulerWnd)
289 {
290  RECT rc;
291 
292  GetClientRect(hRulerWnd, &rc);
293  InvalidateRect(hRulerWnd, &rc, TRUE);
294 }
295 
296 static void update_ruler(HWND hRulerWnd)
297 {
298  SendMessageW(hRulerWnd, WM_USER, 0, 0);
299  redraw_ruler(hRulerWnd);
300 }
301 
302 static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, LONG EditLeftmost)
303 {
304  static HDC hdc;
305 
306  if(NewMetrics)
307  {
308  static HBITMAP hBitmap;
309  int i, x, y, RulerTextEnd;
310  int CmPixels;
311  int QuarterCmPixels;
312  HFONT hFont;
313  WCHAR FontName[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f',0};
314 
315  if(hdc)
316  {
317  DeleteDC(hdc);
319  }
320 
321  hdc = CreateCompatibleDC(0);
322 
324  QuarterCmPixels = (int)((float)CmPixels / 4.0);
325 
326  hBitmap = CreateCompatibleBitmap(hdc, drawRect->right, drawRect->bottom);
328  FillRect(hdc, drawRect, GetStockObject(WHITE_BRUSH));
329 
330  hFont = CreateFontW(10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FontName);
331 
335  y = (int)(((float)drawRect->bottom - (float)drawRect->top) / 2.0) + 1;
336  RulerTextEnd = drawRect->right - EditLeftmost + 1;
337  for(i = 1, x = EditLeftmost; x < (drawRect->right - EditLeftmost + 1); i ++)
338  {
339  WCHAR str[3];
340  WCHAR format[] = {'%','d',0};
341  int x2 = x;
342 
343  x2 += QuarterCmPixels;
344  if(x2 > RulerTextEnd)
345  break;
346 
347  MoveToEx(hdc, x2, y, NULL);
348  LineTo(hdc, x2, y+2);
349 
350  x2 += QuarterCmPixels;
351  if(x2 > RulerTextEnd)
352  break;
353 
354  MoveToEx(hdc, x2, y - 3, NULL);
355  LineTo(hdc, x2, y + 3);
356 
357  x2 += QuarterCmPixels;
358  if(x2 > RulerTextEnd)
359  break;
360 
361  MoveToEx(hdc, x2, y, NULL);
362  LineTo(hdc, x2, y+2);
363 
364  x += CmPixels;
365  if(x > RulerTextEnd)
366  break;
367 
368  wsprintfW(str, format, i);
369  TextOutW(hdc, x, 5, str, lstrlenW(str));
370  }
372  }
373 
374  BitBlt(hdcRuler, 0, 0, drawRect->right, drawRect->bottom, hdc, 0, 0, SRCAND);
375 }
376 
377 static void paint_ruler(HWND hWnd, LONG EditLeftmost, BOOL NewMetrics)
378 {
379  PAINTSTRUCT ps;
380  HDC hdc = BeginPaint(hWnd, &ps);
381  HDC hdcPrint = make_dc();
382  RECT printRect = get_print_rect(hdcPrint);
383  RECT drawRect;
384 
385  GetClientRect(hWnd, &drawRect);
386  FillRect(hdc, &drawRect, GetSysColorBrush(COLOR_MENU));
387 
388  InflateRect(&drawRect, 0, -3);
389  drawRect.left = EditLeftmost;
390  drawRect.right = twips_to_pixels(printRect.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
391  FillRect(hdc, &drawRect, GetStockObject(WHITE_BRUSH));
392 
393  drawRect.top--;
394  drawRect.bottom++;
395  DrawEdge(hdc, &drawRect, EDGE_SUNKEN, BF_RECT);
396 
397  drawRect.left = drawRect.right - 1;
399  DrawEdge(hdc, &drawRect, EDGE_ETCHED, BF_RECT);
400 
401  drawRect.left = 0;
402  drawRect.top = 0;
403  add_ruler_units(hdc, &drawRect, NewMetrics, EditLeftmost);
404 
406  DeleteDC(hdcPrint);
407  EndPaint(hWnd, &ps);
408 }
409 
411 {
412  static WNDPROC pPrevRulerProc;
413  static LONG EditLeftmost;
414  static BOOL NewMetrics;
415 
416  switch(msg)
417  {
418  case WM_USER:
419  if(wParam)
420  {
421  EditLeftmost = ((POINTL*)wParam)->x;
422  pPrevRulerProc = (WNDPROC)lParam;
423  }
424  NewMetrics = TRUE;
425  break;
426 
427  case WM_PAINT:
428  paint_ruler(hWnd, EditLeftmost, NewMetrics);
429  break;
430 
431  default:
432  return CallWindowProcW(pPrevRulerProc, hWnd, msg, wParam, lParam);
433  }
434 
435  return 0;
436 }
437 
439 {
440  FORMATRANGE fr;
441  DOCINFOW di;
443  int printedPages = 0;
444 
445  fr.hdc = pd->hDC;
446  fr.hdcTarget = pd->hDC;
447 
448  fr.rc = get_print_rect(fr.hdc);
449  SetRect(&fr.rcPage, 0, 0, fr.rc.right + margins.right, fr.rc.bottom + margins.bottom);
450 
451  ZeroMemory(&di, sizeof(di));
452  di.cbSize = sizeof(di);
454 
455  if(pd->Flags & PD_PRINTTOFILE)
456  {
458  if(!di.lpszOutput)
459  return;
460  }
461 
462  if(pd->Flags & PD_SELECTION)
463  {
465  } else
466  {
467  GETTEXTLENGTHEX gt;
468  gt.flags = GTL_DEFAULT;
469  gt.codepage = 1200;
470  fr.chrg.cpMin = 0;
472 
473  if(pd->Flags & PD_PAGENUMS)
475  }
476 
477  StartDocW(fr.hdc, &di);
478  do
479  {
480  if(StartPage(fr.hdc) <= 0)
481  break;
482 
484 
485  if(EndPage(fr.hdc) <= 0)
486  break;
487 
488  printedPages++;
489  if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage)))
490  break;
491  }
492  while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax);
493 
494  EndDoc(fr.hdc);
496 }
497 
499 {
500  PAGESETUPDLGW ps;
501 
502  ZeroMemory(&ps, sizeof(ps));
503  ps.lStructSize = sizeof(ps);
504  ps.hwndOwner = hMainWnd;
508  ps.hDevMode = devMode;
509  ps.hDevNames = devNames;
510 
511  if(PageSetupDlgW(&ps))
512  {
515  devMode = ps.hDevMode;
516  devNames = ps.hDevNames;
518  }
519 }
520 
522 {
523  PRINTDLGW pd;
524  ZeroMemory(&pd, sizeof(pd));
525 
526  ZeroMemory(&pd, sizeof(pd));
527  pd.lStructSize = sizeof(pd);
529  pd.hDevMode = devMode;
530 
531  PrintDlgW(&pd);
532 
533  devMode = pd.hDevMode;
534  devNames = pd.hDevNames;
535 }
536 
538 {
539  PRINTDLGW pd;
540 
541  ZeroMemory(&pd, sizeof(pd));
542  pd.hwndOwner = hMainWnd;
543  pd.hDC = make_dc();
544 
545  print(&pd, wszFileName);
546  DeleteDC(pd.hDC);
547 }
548 
550 {
551  PRINTDLGW pd;
553  int from = 0;
554  int to = 0;
555 
556  ZeroMemory(&pd, sizeof(pd));
557  pd.lStructSize = sizeof(pd);
558  pd.hwndOwner = hMainWnd;
560  pd.nMinPage = 1;
561  pd.nMaxPage = -1;
562  pd.hDevMode = devMode;
563  pd.hDevNames = devNames;
564 
566  if(from == to)
567  pd.Flags |= PD_NOSELECTION;
568 
569  if(PrintDlgW(&pd))
570  {
571  devMode = pd.hDevMode;
572  devNames = pd.hDevNames;
573  print(&pd, wszFileName);
575  }
576 }
577 
578 static void preview_bar_show(HWND hMainWnd, BOOL show)
579 {
580  HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
581  int i;
582 
583  if(show)
584  {
585  REBARBANDINFOW rb;
586  HWND hStatic;
587  UINT num_pages_string = preview.pages_shown > 1 ? STRING_PREVIEW_ONEPAGE :
589 
593  AddTextButton(hReBar, num_pages_string, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4);
597 
598  hStatic = CreateWindowW(WC_STATICW, NULL,
599  WS_VISIBLE | WS_CHILD, 0, 0, 0, 0,
600  hReBar, NULL, NULL, NULL);
601 
605  rb.hwndChild = hStatic;
606  rb.cyChild = rb.cyMinChild = 22;
607  rb.cx = rb.cxMinChild = 90;
608  rb.cxIdeal = 100;
610 
611  SendMessageW(hReBar, RB_INSERTBANDW, -1, (LPARAM)&rb);
612  } else
613  {
614  for(i = 0; i <= PREVIEW_BUTTONS; i++)
616  }
617 }
618 
619 static const int min_spacing = 10;
620 
621 static void update_preview_scrollbars(HWND hwndPreview, RECT *window)
622 {
623  SCROLLINFO sbi;
624  sbi.cbSize = sizeof(sbi);
625  sbi.fMask = SIF_PAGE|SIF_RANGE;
626  sbi.nMin = 0;
627  if (preview.zoomlevel == 0)
628  {
629  /* Hide scrollbars when zoomed out. */
630  sbi.nMax = 0;
631  sbi.nPage = window->right;
632  SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
633  sbi.nPage = window->bottom;
634  SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
635  } else {
638  sbi.nPage = window->right;
639  SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE);
640  /* Change in the horizontal scrollbar visibility affects the
641  * client rect, so update the client rect. */
642  GetClientRect(hwndPreview, window);
643  sbi.nMax = preview.bmScaledSize.cy + min_spacing * 2;
644  sbi.nPage = window->bottom;
645  SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE);
646  }
647 }
648 
649 static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
650 {
651  RECT window;
652 
653  GetClientRect(hwndPreview, &window);
654 
655  /* The zoom ratio isn't updated for partial zoom because of resizing the window. */
656  if (zoomLevelUpdated || preview.zoomlevel != 1)
657  {
658  float ratio, ratioHeight, ratioWidth;
659  if (preview.zoomlevel == 2)
660  {
661  ratio = 1.0;
662  } else {
663  ratioHeight = (window.bottom - min_spacing * 2) / (float)preview.bmSize.cy;
664 
665  ratioWidth = (float)(window.right -
666  min_spacing * (preview.pages_shown + 1)) /
668 
669  if(ratioWidth > ratioHeight)
670  ratio = ratioHeight;
671  else
672  ratio = ratioWidth;
673 
674  if (preview.zoomlevel == 1)
675  ratio += (1.0 - ratio) / 2;
676  }
677  preview.zoomratio = ratio;
678  }
679 
682 
684 
685  preview.spacing.cx = (window.right -
687  (preview.pages_shown + 1);
690 
691  update_preview_scrollbars(hwndPreview, &window);
692 }
693 
694 static void draw_margin_lines(HDC hdc, int x, int y, float ratio)
695 {
696  HPEN hPen, oldPen;
697  SIZE dpi;
698  RECT page_margin = preview.rcPage;
699 
702 
705 
706  page_margin.left = (int)((float)twips_to_pixels(page_margin.left, dpi.cx) * ratio);
707  page_margin.top = (int)((float)twips_to_pixels(page_margin.top, dpi.cy) * ratio);
708  page_margin.bottom = (int)((float)twips_to_pixels(page_margin.bottom, dpi.cy) * ratio);
709  page_margin.right = (int)((float)twips_to_pixels(page_margin.right, dpi.cx) * ratio);
710 
711  OffsetRect(&page_margin, x, y);
712 
713  hPen = CreatePen(PS_DOT, 1, RGB(0,0,0));
714  oldPen = SelectObject(hdc, hPen);
715 
716  MoveToEx(hdc, x, page_margin.top, NULL);
717  LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.top);
718  MoveToEx(hdc, x, page_margin.bottom, NULL);
719  LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.bottom);
720 
721  MoveToEx(hdc, page_margin.left, y, NULL);
722  LineTo(hdc, page_margin.left, y + preview.bmScaledSize.cy);
723  MoveToEx(hdc, page_margin.right, y, NULL);
724  LineTo(hdc, page_margin.right, y + preview.bmScaledSize.cy);
725 
726  SelectObject(hdc, oldPen);
727  DeleteObject(hPen);
728 }
729 
731 {
732  return preview.pageEnds[page - 1] >= preview.textlength;
733 }
734 
736 {
738  preview.page = 1;
739  preview.hdc = 0;
740  preview.hdc2 = 0;
742  preview.zoomratio = 0;
743  preview.zoomlevel = 0;
745 
748  0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL);
749 }
750 
752 {
753  HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
754  preview.window.right = 0;
755  preview.window.bottom = 0;
756  preview.page = 0;
759  preview.pageCapacity = 0;
760  if (preview.zoomlevel > 0)
762  if(preview.hdc) {
765  DeleteObject(oldbm);
766  preview.hdc = NULL;
767  }
768  if(preview.hdc2) {
771  DeleteObject(oldbm);
772  preview.hdc2 = NULL;
773  }
774 
776  DestroyWindow(hwndPreview);
777 }
778 
780 {
781  return preview.page != 0;
782 }
783 
784 static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int page)
785 {
786  int bottom;
787 
788  if (!preview.pageEnds)
789  {
790  preview.pageCapacity = 32;
792  sizeof(int) * preview.pageCapacity);
793  if (!preview.pageEnds) return;
794  } else if (page >= preview.pageCapacity) {
795  int *new_buffer;
796  new_buffer = HeapReAlloc(GetProcessHeap(), 0, preview.pageEnds,
797  sizeof(int) * preview.pageCapacity * 2);
798  if (!new_buffer) return;
799  preview.pageCapacity *= 2;
800  preview.pageEnds = new_buffer;
801  }
802 
803  FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH));
804  if (page > 1 && is_last_preview_page(page - 1)) return;
805  lpFr->chrg.cpMin = page <= 1 ? 0 : preview.pageEnds[page-2];
806  bottom = lpFr->rc.bottom;
808 
809  /* EM_FORMATRANGE sets fr.rc.bottom to indicate the area printed in,
810  * but we want to keep the original for drawing margins */
811  lpFr->rc.bottom = bottom;
813 }
814 
816 {
817  HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
823  preview.pages_shown > 1 ||
824  (!is_last_preview_page(1) && preview.zoomlevel == 0));
827 }
828 
829 static LRESULT print_preview(HWND hwndPreview)
830 {
831  HPEN hPen, oldPen;
832  HDC hdc;
833  HRGN back_rgn, excl_rgn;
834  RECT window, background;
835  PAINTSTRUCT ps;
836  int x, y;
837 
838  hdc = BeginPaint(hwndPreview, &ps);
839  GetClientRect(hwndPreview, &window);
840  back_rgn = CreateRectRgnIndirect(&window);
841 
842  x = preview.spacing.cx - GetScrollPos(hwndPreview, SB_HORZ);
843  y = preview.spacing.cy - GetScrollPos(hwndPreview, SB_VERT);
844 
845  /* draw page outlines */
846  hPen = CreatePen(PS_SOLID|PS_INSIDEFRAME, 2, RGB(0,0,0));
847  oldPen = SelectObject(hdc, hPen);
848  SetRect(&background, x - 2, y - 2, x + preview.bmScaledSize.cx + 2,
849  y + preview.bmScaledSize.cy + 2);
850  Rectangle(hdc, background.left, background.top,
851  background.right, background.bottom);
852  excl_rgn = CreateRectRgnIndirect(&background);
853  CombineRgn(back_rgn, back_rgn, excl_rgn, RGN_DIFF);
854  if(preview.pages_shown > 1)
855  {
856  background.left += preview.bmScaledSize.cx + preview.spacing.cx;
857  background.right += preview.bmScaledSize.cx + preview.spacing.cx;
858  Rectangle(hdc, background.left, background.top,
859  background.right, background.bottom);
860  SetRectRgn(excl_rgn, background.left, background.top,
861  background.right, background.bottom);
862  CombineRgn(back_rgn, back_rgn, excl_rgn, RGN_DIFF);
863  }
864  SelectObject(hdc, oldPen);
865  DeleteObject(hPen);
866  FillRgn(hdc, back_rgn, GetStockObject(GRAY_BRUSH));
867  DeleteObject(excl_rgn);
868  DeleteObject(back_rgn);
869 
872 
874 
875  if(preview.pages_shown > 1)
876  {
879  StretchBlt(hdc, x, y,
881  preview.hdc2, 0, 0,
883 
885  } else {
886  InflateRect(&background, -2, -2);
887  FillRect(hdc, &background, GetStockObject(WHITE_BRUSH));
888  }
889  }
890 
892 
893  EndPaint(hwndPreview, &ps);
894 
895  return 0;
896 }
897 
899 {
900  HWND hStatusbar = GetDlgItem(hMainWnd, IDC_STATUSBAR);
902  WCHAR *p;
903  WCHAR wstr[MAX_STRING_LEN];
904 
905  p = wstr;
907  {
908  static const WCHAR fmt[] = {' ','%','d','\0'};
911  } else {
912  static const WCHAR fmt[] = {' ','%','d','-','%','d','\0'};
915  }
916  SetWindowTextW(hStatusbar, wstr);
917 }
918 
919 /* Update for page changes. */
921 {
922  RECT paper;
924  HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
925  HBITMAP hBitmapCapture;
926  FORMATRANGE fr;
927  HDC hdc = GetDC(hwndPreview);
928 
929  fr.hdcTarget = make_dc();
930  fr.rc = fr.rcPage = preview.rcPage;
931  fr.rc.left += margins.left;
932  fr.rc.top += margins.top;
933  fr.rc.bottom -= margins.bottom;
934  fr.rc.right -= margins.right;
935 
936  fr.chrg.cpMin = 0;
938 
939  SetRect(&paper, 0, 0, preview.bmSize.cx, preview.bmSize.cy);
940 
941  if (!preview.hdc) {
944  SelectObject(preview.hdc, hBitmapCapture);
945  }
946 
947  fr.hdc = preview.hdc;
948  draw_preview(hEditorWnd, &fr, &paper, preview.page);
949 
950  if(preview.pages_shown > 1)
951  {
952  if (!preview.hdc2)
953  {
955  hBitmapCapture = CreateCompatibleBitmap(hdc,
956  preview.bmSize.cx,
957  preview.bmSize.cy);
958  SelectObject(preview.hdc2, hBitmapCapture);
959  }
960 
961  fr.hdc = preview.hdc2;
962  draw_preview(hEditorWnd, &fr, &fr.rcPage, preview.page + 1);
963  }
964  DeleteDC(fr.hdcTarget);
965  ReleaseDC(hwndPreview, hdc);
966 
967  InvalidateRect(hwndPreview, NULL, FALSE);
970 }
971 
973 {
974  HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
977  int nPreviewPages;
978 
979  preview.pages_shown = preview.pages_shown > 1 ? 1 : 2;
980 
981  nPreviewPages = preview.zoomlevel > 0 ? preview.saved_pages_shown :
983 
984  LoadStringW(hInst, nPreviewPages > 1 ? STRING_PREVIEW_ONEPAGE :
987 
991 }
992 
993 /* Returns the page shown that the point is in (1 or 2) or 0 if the point
994  * isn't inside either page */
996 {
997  RECT rc;
998  rc.left = preview.spacing.cx;
999  rc.right = rc.left + preview.bmScaledSize.cx;
1000  rc.top = preview.spacing.cy;
1001  rc.bottom = rc.top + preview.bmScaledSize.cy;
1002  if (PtInRect(&rc, pt))
1003  return 1;
1004 
1005  if (preview.pages_shown <= 1)
1006  return 0;
1007 
1010  if (PtInRect(&rc, pt))
1011  return is_last_preview_page(preview.page) ? 1 : 2;
1012 
1013  return 0;
1014 }
1015 
1017 {
1018  switch(msg)
1019  {
1020  case WM_CREATE:
1021  {
1024  FORMATRANGE fr;
1025  GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200};
1026  HDC hdc = GetDC(hWnd);
1027  HDC hdcTarget = make_dc();
1028 
1033  fr.rcPage = preview.rcPage;
1034 
1037 
1039 
1040  fr.hdc = CreateCompatibleDC(hdc);
1041  fr.hdcTarget = hdcTarget;
1042  fr.chrg.cpMin = 0;
1044  DeleteDC(fr.hdc);
1046  ReleaseDC(hWnd, hdc);
1047 
1050  break;
1051  }
1052 
1053  case WM_PAINT:
1054  return print_preview(hWnd);
1055 
1056  case WM_SIZE:
1057  {
1060  break;
1061  }
1062 
1063  case WM_VSCROLL:
1064  case WM_HSCROLL:
1065  {
1066  SCROLLINFO si;
1067  RECT rc;
1068  int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ;
1069  int origPos;
1070 
1071  GetClientRect(hWnd, &rc);
1072  si.cbSize = sizeof(si);
1073  si.fMask = SIF_ALL;
1074  GetScrollInfo(hWnd, nBar, &si);
1075  origPos = si.nPos;
1076  switch(LOWORD(wParam))
1077  {
1078  case SB_TOP: /* == SB_LEFT */
1079  si.nPos = si.nMin;
1080  break;
1081  case SB_BOTTOM: /* == SB_RIGHT */
1082  si.nPos = si.nMax;
1083  break;
1084  case SB_LINEUP: /* == SB_LINELEFT */
1085  si.nPos -= si.nPage / 10;
1086  break;
1087  case SB_LINEDOWN: /* == SB_LINERIGHT */
1088  si.nPos += si.nPage / 10;
1089  break;
1090  case SB_PAGEUP: /* == SB_PAGELEFT */
1091  si.nPos -= si.nPage;
1092  break;
1093  case SB_PAGEDOWN: /* SB_PAGERIGHT */
1094  si.nPos += si.nPage;
1095  break;
1096  case SB_THUMBTRACK:
1097  si.nPos = si.nTrackPos;
1098  break;
1099  }
1100  si.fMask = SIF_POS;
1101  SetScrollInfo(hWnd, nBar, &si, TRUE);
1102  GetScrollInfo(hWnd, nBar, &si);
1103  if (si.nPos != origPos)
1104  {
1105  int amount = origPos - si.nPos;
1106  if (msg == WM_VSCROLL)
1107  ScrollWindow(hWnd, 0, amount, NULL, NULL);
1108  else
1109  ScrollWindow(hWnd, amount, 0, NULL, NULL);
1110  }
1111  return 0;
1112  }
1113 
1114  case WM_SETCURSOR:
1115  {
1116  POINT pt;
1117  RECT rc;
1118  int bHittest = 0;
1119  DWORD messagePos = GetMessagePos();
1120  pt.x = (short)LOWORD(messagePos);
1121  pt.y = (short)HIWORD(messagePos);
1122  ScreenToClient(hWnd, &pt);
1123 
1124  GetClientRect(hWnd, &rc);
1125  if (PtInRect(&rc, pt))
1126  {
1127  pt.x += GetScrollPos(hWnd, SB_HORZ);
1128  pt.y += GetScrollPos(hWnd, SB_VERT);
1129  bHittest = preview_page_hittest(pt);
1130  }
1131 
1132  if (bHittest)
1135  else
1137 
1138  return TRUE;
1139  }
1140 
1141  case WM_LBUTTONDOWN:
1142  {
1143  int page;
1144  POINT pt;
1147  if ((page = preview_page_hittest(pt)) > 0)
1148  {
1150 
1151  /* Convert point from client coordinate to unzoomed page
1152  * coordinate. */
1153  pt.x -= preview.spacing.cx;
1154  if (page > 1)
1156  pt.y -= preview.spacing.cy;
1157  pt.x /= preview.zoomratio;
1158  pt.y /= preview.zoomratio;
1159 
1160  if (preview.zoomlevel == 0)
1162  preview.zoomlevel = (preview.zoomlevel + 1) % 3;
1163  preview.zoomratio = 0;
1164  if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1)
1165  {
1167  } else if (preview.pages_shown > 1) {
1168  if (page >= 2) preview.page++;
1170  } else {
1174  }
1175 
1176  if (preview.zoomlevel > 0) {
1177  SCROLLINFO si;
1178  /* Convert the coordinate back to client coordinate. */
1179  pt.x *= preview.zoomratio;
1180  pt.y *= preview.zoomratio;
1181  pt.x += preview.spacing.cx;
1182  pt.y += preview.spacing.cy;
1183  /* Scroll to center view at that point on the page */
1184  si.cbSize = sizeof(si);
1185  si.fMask = SIF_PAGE;
1186  GetScrollInfo(hWnd, SB_HORZ, &si);
1187  pt.x -= si.nPage / 2;
1189  GetScrollInfo(hWnd, SB_VERT, &si);
1190  pt.y -= si.nPage / 2;
1192  }
1193  }
1194  }
1195 
1196  default:
1197  return DefWindowProcW(hWnd, msg, wParam, lParam);
1198  }
1199 
1200  return 0;
1201 }
1202 
1204 {
1205  switch(LOWORD(wParam))
1206  {
1207  case ID_FILE_EXIT:
1208  PostMessageW(hWnd, WM_CLOSE, 0, 0);
1209  break;
1210 
1211  case ID_PREVIEW_NEXTPAGE:
1212  case ID_PREVIEW_PREVPAGE:
1213  {
1215  preview.page++;
1216  else
1217  preview.page--;
1218 
1220  }
1221  break;
1222 
1223  case ID_PREVIEW_NUMPAGES:
1225  break;
1226 
1227  case ID_PREVIEW_ZOOMIN:
1228  if (preview.zoomlevel < 2)
1229  {
1230  if (preview.zoomlevel == 0)
1232  preview.zoomlevel++;
1233  preview.zoomratio = 0;
1234  if (preview.pages_shown > 1)
1235  {
1236  /* Forced switch to one page when zooming in. */
1238  } else {
1239  HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
1240  update_preview_sizes(hwndPreview, TRUE);
1241  InvalidateRect(hwndPreview, NULL, FALSE);
1243  }
1244  }
1245  break;
1246 
1247  case ID_PREVIEW_ZOOMOUT:
1248  if (preview.zoomlevel > 0)
1249  {
1250  HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
1251  preview.zoomlevel--;
1252  preview.zoomratio = 0;
1253  if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) {
1255  } else {
1256  update_preview_sizes(hwndPreview, TRUE);
1257  InvalidateRect(hwndPreview, NULL, FALSE);
1259  }
1260  }
1261  break;
1262 
1263  case ID_PRINT:
1265  SendMessageW(hWnd, WM_CLOSE, 0, 0);
1266  break;
1267  }
1268 
1269  return 0;
1270 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page)
Definition: print.c:269
void redraw_ruler(HWND hRulerWnd)
Definition: print.c:288
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
#define GTL_DEFAULT
Definition: richedit.h:1054
#define ID_WORDWRAP_MARGIN
Definition: wordpad.h:112
HDC hdc2
Definition: print.c:41
#define OFN_EXPLORER
Definition: commdlg.h:104
static WCHAR wszFileName[MAX_PATH]
Definition: wordpad.c:71
#define CENTMM_PER_INCH
Definition: wordpad.h:25
#define SB_PAGEDOWN
Definition: winuser.h:569
struct _previewinfo * ppreviewinfo
GLint GLint GLsizei width
Definition: gl.h:1546
static void preview_bar_show(HWND hMainWnd, BOOL show)
Definition: print.c:578
#define ULongToHandle(h)
Definition: basetsd.h:81
#define IDC_ZOOM
Definition: resource.h:16
#define SB_PAGEUP
Definition: winuser.h:568
#define max(a, b)
Definition: svc.c:63
#define LOGPIXELSX
Definition: wingdi.h:718
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define PD_NOSELECTION
Definition: commdlg.h:149
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
HFONT WINAPI CreateFontW(_In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_opt_ LPCWSTR)
static void draw_preview(HWND hEditorWnd, FORMATRANGE *lpFr, RECT *paper, int page)
Definition: print.c:784
int WINAPI FillRgn(_In_ HDC, _In_ HRGN, _In_ HBRUSH)
Definition: painting.c:183
#define IDC_STATUSBAR
Definition: resource.h:12
#define RBBIM_CHILD
Definition: commctrl.h:1506
#define ID_WORDWRAP_NONE
Definition: wordpad.h:110
static LONG twips_to_centmm(int twips)
Definition: print.c:166
#define SIF_RANGE
Definition: winuser.h:1225
HWND hwndOwner
Definition: commdlg.h:487
void dialog_print(HWND hMainWnd, LPWSTR wszFileName)
Definition: print.c:549
#define ERROR_SUCCESS
Definition: deptool.c:10
#define BANDID_PREVIEW_BTN7
Definition: wordpad.h:107
#define WM_LBUTTONDOWN
Definition: winuser.h:1766
#define PSD_INHUNDREDTHSOFMILLIMETERS
Definition: commdlg.h:175
static RECT get_print_rect(HDC hdc)
Definition: print.c:187
GLuint64EXT * result
Definition: glext.h:11304
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define STRING_PREVIEW_PREVPAGE
Definition: wordpad.h:220
#define RGB(r, g, b)
Definition: precomp.h:62
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
HDC WINAPI GetDC(_In_opt_ HWND)
HWND hwndOwner
Definition: commdlg.h:330
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
#define SB_VERT
Definition: winuser.h:553
#define REG_BINARY
Definition: nt_native.h:1496
static HGLOBAL devMode
Definition: print.c:52
#define TRUE
Definition: types.h:120
#define pt(x, y)
Definition: drawing.c:79
void dialog_printsetup(HWND hMainWnd)
Definition: print.c:498
#define PSD_MARGINS
Definition: commdlg.h:173
const WCHAR * text
Definition: package.c:1799
#define BANDID_PREVIEW_BTN3
Definition: wordpad.h:103
SIZE bmSize
Definition: print.c:44
#define STRING_PRINTER_FILES_PRN
Definition: wordpad.h:208
RECT rcPage
Definition: print.c:43
RECT rcPage
Definition: richedit.h:610
#define SB_HORZ
Definition: winuser.h:552
int * pageEnds
Definition: print.c:38
static DWORD wordWrap[2]
Definition: wordpad.c:67
HGLOBAL hDevNames
Definition: commdlg.h:489
HRGN WINAPI CreateRectRgnIndirect(_In_ LPCRECT)
static HDC
Definition: imagelist.c:92
static LONG devunits_to_twips(int units, int dpi)
Definition: print.c:181
#define CALLBACK
Definition: compat.h:35
HWND hWnd
Definition: settings.c:17
LONG top
Definition: windef.h:307
#define STRING_PREVIEW_PAGE
Definition: wordpad.h:226
OPENFILENAME ofn
Definition: main.cpp:37
#define RBBIM_ID
Definition: commctrl.h:1510
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define ZeroMemory
Definition: winbase.h:1670
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
LONG cpMax
Definition: richedit.h:501
LPCSTR lpstrDefExt
Definition: commdlg.h:345
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
#define EM_FORMATRANGE
Definition: richedit.h:90
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define WHITE_BRUSH
Definition: wingdi.h:902
#define MAX_STRING_LEN
Definition: precomp.h:36
#define STRING_PREVIEW_PAGES
Definition: wordpad.h:227
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int zoomlevel
Definition: print.c:48
static HWND hEditorWnd
Definition: wordpad.c:61
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
void close_preview(HWND hMainWnd)
Definition: print.c:751
UINT_PTR WPARAM
Definition: windef.h:207
#define WS_CHILD
Definition: pedump.c:617
DWORD WINAPI GetMessagePos(void)
Definition: message.c:1351
LONG left
Definition: windef.h:306
DWORD Flags
Definition: commdlg.h:491
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
UINT WINAPI SetTextAlign(_In_ HDC, _In_ UINT)
Definition: text.c:883
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
LONG right
Definition: windef.h:308
RECT rtMargin
Definition: commdlg.h:456
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4306
#define DWORD
Definition: nt_native.h:44
#define SIF_PAGE
Definition: winuser.h:1223
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
WPARAM wParam
Definition: combotst.c:138
HFONT hFont
Definition: main.c:53
int WINAPI EndPage(_In_ HDC)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
BOOL WINAPI GetSaveFileNameW(LPOPENFILENAMEW ofn)
Definition: filedlg.c:4742
HGLOBAL hDevNames
Definition: commdlg.h:452
LPCWSTR lpszOutput
Definition: wingdi.h:1685
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BANDID_PREVIEW_BTN1
Definition: wordpad.h:101
DWORD nMaxFile
Definition: commdlg.h:337
BOOL WINAPI ScrollWindow(_In_ HWND, _In_ int, _In_ int, _In_opt_ LPCRECT, _In_opt_ LPCRECT)
struct tagRECT RECT
#define EM_GETSEL
Definition: winuser.h:1987
int WINAPI StartPage(_In_ HDC)
#define EM_EXGETSEL
Definition: richedit.h:85
#define REBARBANDINFOW_V6_SIZE
Definition: commctrl.h:1542
#define PHYSICALHEIGHT
Definition: wingdi.h:736
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
#define STRING_PREVIEW_ONEPAGE
Definition: wordpad.h:222
#define RBBIM_STYLE
Definition: commctrl.h:1502
#define BF_RECT
Definition: winuser.h:462
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
#define PS_SOLID
Definition: wingdi.h:586
#define RBBIM_SIZE
Definition: commctrl.h:1508
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
HINSTANCE hInstance
Definition: charmap.c:19
static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id)
Definition: print.c:121
#define PD_USEDEVMODECOPIESANDCOLLATE
Definition: commdlg.h:166
static BOOL is_last_preview_page(int page)
Definition: print.c:730
unsigned char * LPBYTE
Definition: typedefs.h:53
#define BANDID_PREVIEW_BUFFER
Definition: wordpad.h:108
#define FALSE
Definition: types.h:117
float zoomratio
Definition: print.c:47
unsigned int BOOL
Definition: ntddk_ex.h:94
HDC hDC
Definition: commdlg.h:490
long LONG
Definition: pedump.c:60
static const int min_spacing
Definition: print.c:619
void registry_set_previewpages(HKEY hKey)
Definition: print.c:99
#define WM_SETCURSOR
Definition: winuser.h:1626
#define ID_FILE_EXIT
Definition: resource.h:46
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
BOOL WINAPI DrawEdge(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
static void draw_margin_lines(HDC hdc, int x, int y, float ratio)
Definition: print.c:694
int textlength
Definition: print.c:39
static void add_ruler_units(HDC hdcRuler, RECT *drawRect, BOOL NewMetrics, LONG EditLeftmost)
Definition: print.c:302
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
WORD nMinPage
Definition: commdlg.h:494
DWORD lStructSize
Definition: commdlg.h:449
WORD wDeviceOffset
Definition: commdlg.h:298
#define TRANSPARENT
Definition: wingdi.h:950
#define IDC_RULER
Definition: wordpad.h:170
BOOL WINAPI PrintDlgW(LPPRINTDLGW lppd)
Definition: printdlg.c:2403
HGLOBAL hDevMode
Definition: commdlg.h:488
const WCHAR * str
LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: print.c:410
static LPWSTR dialog_print_to_file(HWND hMainWnd)
Definition: print.c:243
const WCHAR wszPreviewWndClass[]
Definition: wordpad.c:57
#define COLOR_MENU
Definition: winuser.h:911
WORD wDriverOffset
Definition: commdlg.h:297
LONG cx
Definition: windef.h:334
#define PD_SELECTION
Definition: commdlg.h:147
LONG_PTR LPARAM
Definition: windef.h:208
BOOL preview_isactive(void)
Definition: print.c:779
GLint GLint bottom
Definition: glext.h:7726
#define PD_RETURNDC
Definition: commdlg.h:155
Definition: module.h:566
#define RB_INSERTBANDW
Definition: commctrl.h:1583
#define ID_PREVIEW_NUMPAGES
Definition: wordpad.h:50
#define GRAY_BRUSH
Definition: wingdi.h:898
int cbSize
Definition: wingdi.h:1683
#define RBBS_VARIABLEHEIGHT
Definition: commctrl.h:1495
#define STRING_ALL_FILES
Definition: notepad_res.h:80
DWORD lStructSize
Definition: commdlg.h:486
static HGLOBAL devNames
Definition: print.c:53
#define OFN_PATHMUSTEXIST
Definition: commdlg.h:117
static void update_preview(HWND hMainWnd)
Definition: print.c:920
#define BLACK_BRUSH
Definition: wingdi.h:896
#define BANDID_PREVIEW_BTN4
Definition: wordpad.h:104
HDC hdcTarget
Definition: richedit.h:608
static LONG centmm_to_twips(int mm)
Definition: print.c:171
BOOL WINAPI SetRectRgn(_In_ HRGN, _In_ int, _In_ int, _In_ int, _In_ int)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4900
BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW setupdlg)
Definition: printdlg.c:3938
static void update_ruler(HWND hRulerWnd)
Definition: print.c:296
#define dpi
Definition: sysparams.c:22
HWND hwndOwner
Definition: commdlg.h:450
#define EM_SETTARGETDEVICE
Definition: richedit.h:105
int pages_shown
Definition: print.c:36
GLsizeiptr size
Definition: glext.h:5919
#define GetProcessHeap()
Definition: compat.h:736
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define IDC_EDITOR
Definition: wordpad.h:156
int WINAPI StartDocW(_In_ HDC, _In_ const DOCINFOW *)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4121
#define STRING_PREVIEW_CLOSE
Definition: wordpad.h:225
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
int page
Definition: print.c:35
__wchar_t WCHAR
Definition: xmlstorage.h:180
WORD nToPage
Definition: commdlg.h:493
#define SB_THUMBTRACK
Definition: winuser.h:573
#define WM_SIZE
Definition: winuser.h:1601
void registry_read_previewpages(HKEY hKey)
Definition: print.c:105
static const WCHAR var_previewpages[]
Definition: print.c:61
#define WM_CLOSE
Definition: winuser.h:1611
int WINAPI GetScrollPos(_In_ HWND, _In_ int)
#define MAX_PATH
Definition: compat.h:34
DWORD lStructSize
Definition: commdlg.h:329
const char file[]
Definition: icontest.c:11
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define BANDID_PREVIEW_BTN5
Definition: wordpad.h:105
static LONG twips_to_pixels(int twips, int dpi)
Definition: print.c:176
unsigned long DWORD
Definition: ntddk_ex.h:95
static void paint_ruler(HWND hWnd, LONG EditLeftmost, BOOL NewMetrics)
Definition: print.c:377
SIZE spacing
Definition: print.c:46
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2074
#define RBBIM_CHILDSIZE
Definition: commctrl.h:1507
#define EDGE_ETCHED
Definition: winuser.h:452
#define WS_HSCROLL
Definition: pedump.c:628
#define WM_PAINT
Definition: winuser.h:1610
#define PD_PAGENUMS
Definition: commdlg.h:148
#define STRING_PREVIEW_ZOOMIN
Definition: wordpad.h:223
void init_preview(HWND hMainWnd, LPWSTR wszFileName)
Definition: print.c:735
BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO)
void registry_read_pagemargins(HKEY hKey)
Definition: print.c:90
int ret
HWND hMainWnd
Definition: magnifier.c:32
LPWSTR wszFileName
Definition: print.c:49
#define STRING_PREVIEW_NEXTPAGE
Definition: wordpad.h:219
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: print.c:1016
HGLOBAL hDevMode
Definition: commdlg.h:451
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
HDC hdc
Definition: main.c:9
CHARRANGE chrg
Definition: richedit.h:611
LPCWSTR lpszDocName
Definition: wingdi.h:1684
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define STRING_PREVIEW_PRINT
Definition: wordpad.h:218
HDC hdc
Definition: print.c:40
static IHTMLWindow2 * window
Definition: events.c:77
#define STRING_PREVIEW_ZOOMOUT
Definition: wordpad.h:224
#define BANDID_PREVIEW_BTN6
Definition: wordpad.h:106
int saved_pages_shown
Definition: print.c:37
#define PD_PRINTTOFILE
Definition: commdlg.h:152
#define TWIPS_PER_INCH
Definition: wordpad.h:24
BOOL WINAPI TextOutW(_In_ HDC hdc, _In_ int x, _In_ int y, _In_reads_(c) LPCWSTR lpString, _In_ int c)
WORD nFromPage
Definition: commdlg.h:492
#define IDC_PREVIEW
Definition: wordpad.h:171
static RECT margins
Definition: print.c:55
static LPWSTR get_print_file_filter(HWND hMainWnd)
Definition: print.c:63
#define WM_USER
Definition: winuser.h:1885
HDC hdcTarget
Definition: PatBlt.c:12
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
#define PS_INSIDEFRAME
Definition: wingdi.h:593
static void toggle_num_pages(HWND hMainWnd)
Definition: print.c:972
#define SIF_POS
Definition: winuser.h:1224
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2896
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HWND WINAPI GetParent(_In_ HWND)
WORD nMaxPage
Definition: commdlg.h:495
RECT window
Definition: print.c:42
#define PHYSICALWIDTH
Definition: wingdi.h:735
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define SB_TOP
Definition: winuser.h:578
static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
Definition: print.c:438
HINSTANCE hInst
Definition: dxdiag.c:13
#define ID_PRINT
Definition: wordpad.h:39
#define PREVIEW_BUTTONS
Definition: wordpad.h:89
#define ID_PREVIEW_ZOOMOUT
Definition: wordpad.h:52
#define PD_RETURNDEFAULT
Definition: commdlg.h:157
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define lstrcpyW
Definition: compat.h:749
void target_device(HWND hMainWnd, DWORD wordWrap)
Definition: print.c:209
BOOL WINAPI DeleteDC(_In_ HDC)
static previewinfo preview
Definition: print.c:56
#define RGN_DIFF
Definition: wingdi.h:358
LPSTR lpstrFile
Definition: commdlg.h:336
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
static float(__cdecl *square_half_float)(float x
void print_quick(HWND hMainWnd, LPWSTR wszFileName)
Definition: print.c:537
#define STRING_PREVIEW_TWOPAGES
Definition: wordpad.h:221
FxAutoRegKey hKey
#define WC_BUTTONW
Definition: commctrl.h:4623
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define HeapReAlloc
Definition: compat.h:734
#define OFN_OVERWRITEPROMPT
Definition: commdlg.h:116
DWORD Flags
Definition: commdlg.h:453
#define ID_PREVIEW_ZOOMIN
Definition: wordpad.h:51
#define RB_IDTOINDEX
Definition: commctrl.h:1588
LPCSTR lpstrFilter
Definition: commdlg.h:332
#define SRCAND
Definition: wingdi.h:330
LRESULT preview_command(HWND hWnd, WPARAM wParam)
Definition: print.c:1203
#define ID_PREVIEW_NEXTPAGE
Definition: wordpad.h:48
unsigned int UINT
Definition: ndis.h:50
#define SB_LINEDOWN
Definition: winuser.h:565
#define NULL
Definition: types.h:112
#define WM_HSCROLL
Definition: winuser.h:1733
#define SB_LINEUP
Definition: winuser.h:564
#define SB_BOTTOM
Definition: winuser.h:577
#define WS_VSCROLL
Definition: pedump.c:627
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
void get_default_printer_opts(void)
Definition: print.c:521
int pageCapacity
Definition: print.c:38
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
Definition: winddi.h:3706
#define WC_STATICW
Definition: commctrl.h:4680
HDC WINAPI CreateDCW(_In_opt_ LPCWSTR pszDriver, _In_opt_ LPCWSTR pszDevice, _In_opt_ LPCWSTR psz, _In_opt_ const DEVMODEW *pdmInit)
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define PS_DOT
Definition: wingdi.h:588
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
#define ID_PREVIEW_PREVPAGE
Definition: wordpad.h:49
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
Definition: name.c:38
#define WM_CREATE
Definition: winuser.h:1598
static int preview_page_hittest(POINT pt)
Definition: print.c:995
#define RBBS_NOGRIPPER
Definition: commctrl.h:1497
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define HIWORD(l)
Definition: typedefs.h:247
#define RB_DELETEBAND
Definition: commctrl.h:1576
GLenum GLuint id
Definition: glext.h:5579
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
static void update_preview_buttons(HWND hMainWnd)
Definition: print.c:815
LONG bottom
Definition: windef.h:309
#define BANDID_PREVIEW_BTN2
Definition: wordpad.h:102
#define LOGPIXELSY
Definition: wingdi.h:719
#define EDGE_SUNKEN
Definition: winuser.h:451
static const WCHAR var_pagemargin[]
Definition: print.c:60
static HBITMAP
Definition: button.c:44
void registry_set_pagemargins(HKEY hKey)
Definition: print.c:85
#define TA_CENTER
Definition: wingdi.h:931
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static void update_preview_statusbar(HWND hMainWnd)
Definition: print.c:898
static void update_preview_scrollbars(HWND hwndPreview, RECT *window)
Definition: print.c:621
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define EM_GETTEXTLENGTHEX
Definition: richedit.h:129
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
LONG_PTR LRESULT
Definition: windef.h:209
CardRegion * from
Definition: spigame.cpp:19
GLfloat units
Definition: glext.h:11727
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define WS_VISIBLE
Definition: pedump.c:620
HBRUSH WINAPI GetSysColorBrush(_In_ int)
static HDC make_dc(void)
Definition: print.c:145
static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
Definition: print.c:649
#define REG_DWORD
Definition: sdbapi.c:596
static LRESULT print_preview(HWND hwndPreview)
Definition: print.c:829
#define IDC_REBAR
Definition: wordpad.h:159
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
LONG cy
Definition: windef.h:335
int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL)
static HBITMAP hBitmap
Definition: timezone.c:26
LPARAM lParam
Definition: combotst.c:139
struct _previewinfo previewinfo
#define LOWORD(l)
Definition: pedump.c:82
SIZE bmScaledSize
Definition: print.c:45
Definition: dsound.c:943
int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL)
#define OBJ_BITMAP
Definition: objidl.idl:1415
#define HeapFree(x, y, z)
Definition: compat.h:735
#define SRCCOPY
Definition: wingdi.h:333
static HWND get_ruler_wnd(HWND hMainWnd)
Definition: print.c:283
#define RBBIM_IDEALSIZE
Definition: commctrl.h:1511
HGDIOBJ WINAPI GetCurrentObject(_In_ HDC, _In_ UINT)
Definition: dc.c:428
LONG cpMin
Definition: richedit.h:500
static VOID NTAPI BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:49
#define WM_VSCROLL
Definition: winuser.h:1734
#define SIF_ALL
Definition: winuser.h:1222
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
int WINAPI EndDoc(_In_ HDC)
DWORD Flags
Definition: commdlg.h:342
Definition: fci.c:126