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

Last change on this file since 481 was 475, checked in by dai_9181, 15 years ago

構成管理を変更中・・・(いったんコミット)

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