source: dev/trunk/ab5.0/abdev/abdev/Print.cpp@ 681

Last change on this file since 681 was 629, checked in by dai_9181, 16 years ago

MDIINFO構造体をリファクタリング。

File size: 13.8 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5
6int iPreviewNowPage;
7int iZoomNowPage;
8
9#define ZOOM_NUM 8
10#define ZOOM_INIT 4
11int array_Zoom[ZOOM_NUM]={
12 500,
13 200,
14 150,
15 100,
16 75,
17 50,
18 25,
19 10
20};
21
22
23CPage obj_Page;
24
25CPage::CPage(){
26 memset(&psd, 0, sizeof(PAGESETUPDLG));
27 psd.lStructSize = sizeof(PAGESETUPDLG);
28 psd.hwndOwner = hOwner;
29 psd.Flags = PSD_MARGINS |PSD_INHUNDREDTHSOFMILLIMETERS|PSD_DISABLEORIENTATION;
30 psd.rtMargin.left=2500;
31 psd.rtMargin.top=2500;
32 psd.rtMargin.right=2500;
33 psd.rtMargin.bottom=2500;
34 psd.ptPaperSize.x=21000;
35 psd.ptPaperSize.y=29700;
36}
37CPage::~CPage(){
38}
39
40BOOL CPage::SetupDlg(void){
41 //ページ設定ダイアログ
42 return PageSetupDlg(&psd);
43}
44
45void DrawPage(HDC memdc,BOOL bPreview,BOOL *lpbLastPage=0){
46 RECT rc;
47
48 //ページの幅、高さ(単位は0.1ミリメートル)
49 int iPageWidth,iPageHeight;
50 iPageWidth=obj_Page.psd.ptPaperSize.x/10;
51 iPageHeight=obj_Page.psd.ptPaperSize.y/10;
52
53 //マッピングモードをセット
54 SetMapMode(memdc,MM_LOMETRIC);
55
56 POINT px_pos;
57 px_pos.x=iPageWidth;
58 px_pos.y=iPageHeight;
59 LPtoDP(memdc,&px_pos,1);
60 px_pos.y=-px_pos.y;
61
62 int WndNum;
63 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
64
65 //フォント生成
66 LOGFONT lf;
67 lf=pobj_nv->lfPrint;
68 lf.lfHeight=-MulDiv(pobj_nv->iPrintFontPointSize,GetDeviceCaps(memdc, LOGPIXELSY),960);
69 HFONT hFont;
70 hFont=CreateFontIndirect(&lf);
71
72 //フォントをセット
73 HFONT hOldFont;
74 hOldFont=(HFONT)SelectObject(memdc,hFont);
75
76 //マージン(単位は0.1ミリメートル)
77 RECT rcMargin;
78 rcMargin.left=obj_Page.psd.rtMargin.left/10;
79 rcMargin.top=obj_Page.psd.rtMargin.top/10;
80 rcMargin.right=obj_Page.psd.rtMargin.right/10;
81 rcMargin.bottom=obj_Page.psd.rtMargin.bottom/10;
82
83 //タブ文字数
84 DRAWTEXTPARAMS dtp;
85 dtp.cbSize=sizeof(DRAWTEXTPARAMS);
86 dtp.iLeftMargin=0;
87 dtp.iRightMargin=0;
88 dtp.iTabLength=pobj_nv->TabSize;
89 dtp.uiLengthDrawn=0;
90
91 char *temp;
92 temp=(char *)malloc(65535);
93
94 char *buffer;
95 buffer=MdiInfo[WndNum]->pMdiTextEdit->buffer;
96 int i=0,i2=0,iPage=0;
97 for(i=0,i2=0;;i++,i2++){
98 if(buffer[i]=='\0'||buffer[i]=='\r'&&buffer[i+1]=='\n'){
99 temp[i2]=0;
100
101 memset(&rc,0,sizeof(RECT));
102 rc.right=iPageWidth-(rcMargin.left + rcMargin.right);
103 DrawTextEx(memdc,temp,-1,&rc,DT_CALCRECT | DT_WORDBREAK|DT_TABSTOP|DT_EXPANDTABS|DT_NOPREFIX,&dtp);
104
105 if(rc.bottom<=-(iPageHeight-(rcMargin.top+rcMargin.bottom)) || buffer[i]=='\0'){
106
107 if(rc.bottom<-(iPageHeight-(rcMargin.top+rcMargin.bottom))){
108 i--;i2--;
109 while(i>0 && (!(buffer[i]=='\r'&&buffer[i+1]=='\n'))){
110 i--;
111 i2--;
112 }
113 temp[i2]=0;
114 }
115
116 rc.left=rcMargin.left;
117 rc.right=iPageWidth-rcMargin.right;
118 rc.top=-rcMargin.top;
119 rc.bottom=-(iPageHeight-rcMargin.bottom);
120
121 char szTempPage[255],*temp2,temp3[255];
122 lstrcpy(temp3,pobj_nv->szPageStr);
123 temp2=strstr(temp3,"&n");
124 if(temp2){
125 temp2[0]='%';
126 temp2[1]='d';
127
128 sprintf(szTempPage,temp3,iPage+1);
129 }
130
131 if(bPreview&&iPage==iPreviewNowPage || bPreview==0){
132 if(bPreview==0) StartPage(memdc);
133
134 DrawTextEx(memdc,temp,-1,&rc,DT_LEFT | DT_WORDBREAK|DT_TABSTOP|DT_EXPANDTABS|DT_NOPREFIX,&dtp);
135
136 if(pobj_nv->bShowPageNum){
137 //ページ番号
138 rc.top=-(iPageHeight-rcMargin.bottom);
139 rc.bottom=-iPageHeight;
140 DrawText(memdc,szTempPage,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX);
141 }
142
143 if(bPreview==0) EndPage(memdc);
144
145 if(lpbLastPage){
146 if(buffer[i]=='\0'){
147 *lpbLastPage=1;
148 }
149 else *lpbLastPage=0;
150 }
151
152 if(bPreview) break;
153 }
154
155 if(buffer[i]=='\0') break;
156
157 iPage++;
158
159 i++;
160 i2=-1;
161 continue;
162 }
163 }
164 temp[i2]=buffer[i];
165 }
166
167 free(temp);
168
169 SelectObject(memdc,hOldFont);
170}
171
172void CreatePreviewDCAndBmp(HDC *lphDC,HBITMAP *lphBmp,POINT *lpPxPos,BOOL *lpbLastPage){
173
174 //印刷ダイアログ
175 PRINTDLG pd;
176 memset(&pd,0,sizeof(PRINTDLG));
177 pd.lStructSize=sizeof(PRINTDLG);
178 pd.hwndOwner=hOwner;
179 pd.Flags=PD_RETURNDC|PD_RETURNDEFAULT;
180 pd.nFromPage=1;
181 pd.nToPage=1;
182 pd.nMinPage=1;
183 pd.nMaxPage=1;
184 pd.nCopies=1;
185 if(PrintDlg(&pd)==0){
186 return;
187 }
188
189 HDC memdc;
190 memdc=CreateCompatibleDC(pd.hDC);
191
192 //ページの幅、高さ(単位は0.1ミリメートル)
193 int iPageWidth,iPageHeight;
194 iPageWidth=obj_Page.psd.ptPaperSize.x/10;
195 iPageHeight=obj_Page.psd.ptPaperSize.y/10;
196
197 //マッピングモードをセット
198 SetMapMode(memdc,MM_LOMETRIC);
199
200 POINT px_pos;
201 px_pos.x=iPageWidth;
202 px_pos.y=iPageHeight;
203 LPtoDP(memdc,&px_pos,1);
204 px_pos.y=-px_pos.y;
205
206 HBITMAP hMemBmp;
207 hMemBmp=CreateCompatibleBitmap(pd.hDC,px_pos.x,px_pos.y);
208 SelectObject(memdc,hMemBmp);
209
210 //背景を初期化
211 HBRUSH hOldBrush;
212 hOldBrush=(HBRUSH)SelectObject(memdc,GetStockObject(WHITE_BRUSH));
213 PatBlt(memdc,0,0,px_pos.x,-px_pos.y,PATCOPY);
214 SelectObject(memdc,hOldBrush);
215
216 //メモリへ描画
217 DrawPage(memdc,1,lpbLastPage);
218
219 DeleteDC(pd.hDC);
220
221
222 *lphDC=memdc;
223 *lphBmp=hMemBmp;
224 *lpPxPos=px_pos;
225}
226
227void DrawPreview(HWND hPreview,HDC hdc,HDC memdc,POINT *lpPxPos){
228 SetMapMode(memdc,MM_TEXT);
229
230 POINT px_pos;
231 px_pos=*lpPxPos;
232
233 SIZE size;
234 RECT rc;
235 GetClientRect(hPreview,&rc);
236 size.cy=(long)((double)rc.bottom*0.9);
237 size.cx=(long)((double)size.cy*((double)obj_Page.psd.ptPaperSize.x/(double)obj_Page.psd.ptPaperSize.y));
238
239 SIZE size_hori;
240 size_hori.cx=(long)((double)rc.right*0.9);
241 size_hori.cy=(long)((double)size_hori.cx*((double)obj_Page.psd.ptPaperSize.y/(double)obj_Page.psd.ptPaperSize.x));
242
243 if(size.cx>size_hori.cx) size=size_hori;
244 size.cx=px_pos.x;
245 size.cy=px_pos.y;
246
247
248 //////////////////////////////////
249 // スクロールバー情報を取得
250 //////////////////////////////////
251
252 //垂直
253 SCROLLINFO si_vert;
254 si_vert.cbSize=sizeof(SCROLLINFO);
255 si_vert.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
256 GetScrollInfo(hPreview,SB_VERT,&si_vert);
257
258 //水平
259 SCROLLINFO si_horz;
260 si_horz.cbSize=sizeof(SCROLLINFO);
261 si_horz.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
262 GetScrollInfo(hPreview,SB_HORZ,&si_horz);
263
264
265
266 //表示率
267 double dblZoomRatio;
268 dblZoomRatio=((double)array_Zoom[iZoomNowPage]/(double)100)*0.18;
269
270
271 ///////////////////////////
272 // メモリへ描画
273 ///////////////////////////
274
275 HDC memdc2;
276 memdc2=CreateCompatibleDC(hdc);
277
278 HBITMAP hMemBmp;
279 hMemBmp=CreateCompatibleBitmap(hdc,(int)((double)size.cx*dblZoomRatio)+40, (int)((double)size.cy*dblZoomRatio)+40);
280
281 SelectObject(memdc2,hMemBmp);
282 RECT rc2;
283 rc2.left=0;rc2.top=0;
284 rc2.right=(int)((double)size.cx*dblZoomRatio)+40;
285 rc2.bottom=(int)((double)size.cy*dblZoomRatio)+40;
286 FillRect(memdc2,&rc2,(HBRUSH)GetStockObject(GRAY_BRUSH));
287
288 SetStretchBltMode(memdc2,HALFTONE);
289 StretchBlt(memdc2,
290 20, 20,
291 (int)((double)size.cx*dblZoomRatio), (int)((double)size.cy*dblZoomRatio),
292 memdc,0,0,px_pos.x,px_pos.y,SRCCOPY);
293
294 //画面へ描画
295 BitBlt(hdc,-si_horz.nPos,-si_vert.nPos,rc2.right,rc2.bottom,
296 memdc2,0,0,SRCCOPY);
297
298 DeleteDC(memdc2);
299 DeleteObject(hMemBmp);
300
301
302 //////////////////////////////
303 // スクロールバーを設定
304 //////////////////////////////
305 GetClientRect(hPreview,&rc);
306
307 //垂直
308 si_vert.nMin=0;
309 si_vert.nMax=rc2.bottom;
310 si_vert.nPage=rc.bottom;
311 SetScrollInfo(hPreview,SB_VERT,&si_vert,1);
312
313 //水平
314 si_horz.nMin=0;
315 si_horz.nMax=rc2.right;
316 si_horz.nPage=rc.right;
317 SetScrollInfo(hPreview,SB_HORZ,&si_horz,1);
318}
319#define WM_RESETPREVIEW WM_USER+100
320LRESULT CALLBACK PreviewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
321 static HDC memdc;
322 static HBITMAP hMemBmp;
323 static POINT px_pos;
324 SCROLLINFO si;
325 int i;
326 RECT rc;
327 switch(message){
328 case WM_CREATE:
329 memdc=0;
330 hMemBmp=0;
331 SendMessage(hwnd,WM_RESETPREVIEW,0,0);
332 return 0;
333 case WM_PAINT:
334 HDC hdc;
335 PAINTSTRUCT ps;
336 hdc=BeginPaint(hwnd,&ps);
337 DrawPreview(hwnd,hdc,memdc,&px_pos);
338 EndPaint(hwnd,&ps);
339 return 0;
340 case WM_RESETPREVIEW:
341 if(memdc) DeleteDC(memdc);
342 if(hMemBmp) DeleteObject(hMemBmp);
343 BOOL bLastPage;
344 CreatePreviewDCAndBmp(&memdc,&hMemBmp,&px_pos,&bLastPage);
345 InvalidateRect(hwnd,NULL,1);
346
347 if(iPreviewNowPage==0) EnableWindow(GetDlgItem(GetParent(hwnd),IDC_PREV),0);
348 else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_PREV),1);
349 if(bLastPage) EnableWindow(GetDlgItem(GetParent(hwnd),IDC_NEXT),0);
350 else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_NEXT),1);
351
352 if(iZoomNowPage<=0) EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMIN),0);
353 else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMIN),1);
354 if(iZoomNowPage>=ZOOM_NUM-1)
355 EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMOUT),0);
356 else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMOUT),1);
357 return 0;
358 case WM_VSCROLL:
359 case WM_HSCROLL:
360 int fnBar;
361 if(message==WM_VSCROLL) fnBar=SB_VERT;
362 else fnBar=SB_HORZ;
363
364 si.cbSize=sizeof(SCROLLINFO);
365 si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
366
367 GetScrollInfo(hwnd,fnBar,&si);
368 if(LOWORD(wParam)==SB_LINEUP) i=-1;
369 else if(LOWORD(wParam)==SB_LINEDOWN) i=1;
370 else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)si.nPage;
371 else if(LOWORD(wParam)==SB_PAGEDOWN) i=si.nPage;
372 else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-si.nPos;
373 else i=0;
374 GetClientRect(hwnd,&rc);
375 if(message==WM_VSCROLL)
376 i=max(-si.nPos,min(i,si.nMax-rc.bottom-si.nPos));
377 else
378 i=max(-si.nPos,min(i,si.nMax-rc.right-si.nPos));
379 if(i!=0){
380 si.nPos+=i;
381 SetScrollInfo(hwnd,fnBar,&si,1);
382
383 InvalidateRect(hwnd,NULL,0);
384 }
385 return 0;
386 case WM_DESTROY:
387 DeleteDC(memdc);
388 DeleteObject(hMemBmp);
389 return 0;
390 }
391 return DefWindowProc(hwnd,message,wParam,lParam);
392}
393BOOL CALLBACK DlgPreview(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
394 static HWND hPreview;
395 char temporary[255];
396 switch(message){
397 case WM_INITDIALOG:
398 SetPosCenter(GetDesktopWindow(),hwnd);
399
400 hPreview=CreateWindowEx(WS_EX_STATICEDGE,"PreviewWindow",NULL,
401 WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL,
402 0,0,0,0,
403 hwnd,0,hInst,0);
404
405 RECT rc;
406 GetClientRect(hwnd,&rc);
407 SetWindowPos(hwnd,NULL,0,0,rc.right,rc.bottom,SWP_NOMOVE);
408
409 iPreviewNowPage=0;
410
411 SetDlgItemText(hwnd,IDC_FONT,pobj_nv->lfPrint.lfFaceName);
412
413 //ページ番号を表示するかどうか
414 if(pobj_nv->bShowPageNum) SendDlgItemMessage(hwnd,IDC_SHOWPAGENUM,BM_SETCHECK,BST_CHECKED,0);
415 SendMessage(hwnd,WM_COMMAND,IDC_SHOWPAGENUM,0);
416
417 //ページ番号文字列
418 SetDlgItemText(hwnd,IDC_PAGESTR,pobj_nv->szPageStr);
419
420 //拡大・縮小アイコンを表示
421 SendDlgItemMessage(hwnd,IDC_ZOOMOUT,BM_SETIMAGE,IMAGE_ICON ,
422 (LPARAM)LoadImage(hResInst,MAKEINTRESOURCE(IDI_ZOOMOUT),IMAGE_ICON,16,16,LR_SHARED));
423 SendDlgItemMessage(hwnd,IDC_ZOOMIN,BM_SETIMAGE,IMAGE_ICON ,
424 (LPARAM)LoadImage(hResInst,MAKEINTRESOURCE(IDI_ZOOMIN),IMAGE_ICON,16,16,LR_SHARED));
425 iZoomNowPage=ZOOM_INIT;
426
427 sprintf(temporary,"%d%%",array_Zoom[iZoomNowPage]);
428 SetDlgItemText(hwnd,IDC_ZOOMRATIO,temporary);
429
430 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
431
432 break;
433 case WM_COMMAND:
434 switch(LOWORD(wParam)){
435 case IDOK:
436 case IDCANCEL:
437 EndDialog(hwnd,0);
438 return 1;
439
440 case IDC_PREV:
441 iPreviewNowPage--;
442 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
443 return 1;
444 case IDC_NEXT:
445 iPreviewNowPage++;
446 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
447 return 1;
448
449 case IDC_ZOOMOUT:
450 case IDC_ZOOMIN:
451 if(LOWORD(wParam)==IDC_ZOOMOUT)
452 iZoomNowPage++;
453 if(LOWORD(wParam)==IDC_ZOOMIN)
454 iZoomNowPage--;
455 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
456
457 sprintf(temporary,"%d%%",array_Zoom[iZoomNowPage]);
458 SetDlgItemText(hwnd,IDC_ZOOMRATIO,temporary);
459 return 1;
460
461 case IDC_PRINT:
462 Printout();
463 return 1;
464
465 case IDC_PAGESET:
466 if(obj_Page.SetupDlg()){
467 //再描画
468 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
469 }
470 return 1;
471
472 case IDC_FONT:
473 int iPointSize;
474 LOGFONT temp_lf;
475 temp_lf=pobj_nv->lfPrint;
476 if(!SetFontDialog(hwnd,&temp_lf,0,&iPointSize)) return 1;
477 pobj_nv->lfPrint=temp_lf;
478 pobj_nv->iPrintFontPointSize=iPointSize;
479
480 SetDlgItemText(hwnd,IDC_FONT,pobj_nv->lfPrint.lfFaceName);
481
482 //再描画
483 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
484 return 1;
485
486 case IDC_SHOWPAGENUM:
487 //ページ番号を表示するかどうか
488 if(SendDlgItemMessage(hwnd,IDC_SHOWPAGENUM,BM_GETCHECK,0,0)){
489 EnableWindow(GetDlgItem(hwnd,IDC_PAGESTR),1);
490 pobj_nv->bShowPageNum=1;
491 }
492 else{
493 EnableWindow(GetDlgItem(hwnd,IDC_PAGESTR),0);
494 pobj_nv->bShowPageNum=0;
495 }
496 SendMessage(hPreview,WM_RESETPREVIEW,0,0);
497 return 1;
498
499 case IDC_PAGESTR:
500 //ページ番号文字列
501 GetDlgItemText(hwnd,IDC_PAGESTR,pobj_nv->szPageStr,255);
502 return 1;
503 }
504 return 0;
505
506 case WM_SIZE:
507 MoveWindow(hPreview,
508 140,40,
509 LOWORD(lParam)-155,
510 HIWORD(lParam)-55,0);
511 InvalidateRect(hwnd,NULL,0);
512 return 0;
513
514 case WM_DESTROY:
515 DestroyWindow(hPreview);
516 return 0;
517 }
518 return 0;
519}
520
521void Preview(void){
522 DialogBox(hResInst,MAKEINTRESOURCE(IDD_PREVIEW),hOwner,(DLGPROC)DlgPreview);
523}
524
525
526void Printout(void){
527 int WndNum;
528 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
529
530 //印刷ダイアログ
531 PRINTDLG pd;
532 memset(&pd,0,sizeof(PRINTDLG));
533 pd.lStructSize=sizeof(PRINTDLG);
534 pd.hwndOwner=hOwner;
535 pd.Flags=PD_ALLPAGES | PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | PD_NOSELECTION | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE;
536 pd.nFromPage=1;
537 pd.nToPage=1;
538 pd.nMinPage=1;
539 pd.nMaxPage=1;
540 pd.nCopies=1;
541 if(PrintDlg(&pd)==0){
542 return;
543 }
544
545 //印刷ドキュメントをスタート
546 DOCINFO di;
547 memset(&di,0,sizeof(DOCINFO));
548 di.cbSize=sizeof(DOCINFO);
549 di.lpszDocName=MdiInfo[WndNum]->title.c_str();
550 if(StartDoc(pd.hDC,&di)==0){
551 MessageBox(hOwner,"印刷できません。プリンターの状況を確認してください。",APPLICATION_NAME,MB_OK | MB_ICONEXCLAMATION);
552 return;
553 }
554
555 //紙へ描画
556 DrawPage(pd.hDC,0);
557
558 //印刷ドキュメントを終了
559 EndDoc(pd.hDC);
560
561 DeleteDC(pd.hDC);
562}
Note: See TracBrowser for help on using the repository browser.