[BACK]Return to ChildView.cpp CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / windows / engine2000

Annotation of OpenXM_contrib2/windows/engine2000/ChildView.cpp, Revision 1.1

1.1     ! noro        1: // ChildView.cpp : CChildView クラスの動作の定義を行います。
        !             2: //
        !             3:
        !             4: #include "stdafx.h"
        !             5: #include "ox_plot.h"
        !             6: #include "ChildView.h"
        !             7:
        !             8: #ifdef _DEBUG
        !             9: #define new DEBUG_NEW
        !            10: #undef THIS_FILE
        !            11: static char THIS_FILE[] = __FILE__;
        !            12: #endif
        !            13:
        !            14: #include <math.h>
        !            15:
        !            16: extern "C" {
        !            17: #include "ca.h"
        !            18: #include "ifplot.h"
        !            19:
        !            20: #if defined(sun) && !defined(__svr4__)
        !            21: #define EXP10(a) exp10(a)
        !            22: #else
        !            23: #define EXP10(a) pow(10.0,a)
        !            24: #endif
        !            25:
        !            26:        HANDLE hResizeNotify,hResizeNotify_Ack;
        !            27:        void destroy_canvas(struct canvas *);
        !            28:        void pline(int *,struct canvas *, HDC);
        !            29:        void draw_wideframe(struct canvas *, HDC);
        !            30:        double adjust_scale(double,double);
        !            31: }
        !            32: /////////////////////////////////////////////////////////////////////////////
        !            33: // CChildView
        !            34:
        !            35: CChildView::CChildView()
        !            36: {
        !            37:        can = 0;
        !            38: }
        !            39:
        !            40: CChildView::~CChildView()
        !            41: {
        !            42: }
        !            43:
        !            44:
        !            45: BEGIN_MESSAGE_MAP(CChildView,CWnd )
        !            46:        //{{AFX_MSG_MAP(CChildView)
        !            47:        ON_WM_PAINT()
        !            48:        ON_WM_LBUTTONDOWN()
        !            49:        ON_WM_MOUSEMOVE()
        !            50:        ON_WM_LBUTTONUP()
        !            51:        ON_COMMAND(ID_OPT_NOAXIS, OnOptNoaxis)
        !            52:        ON_UPDATE_COMMAND_UI(ID_OPT_NOAXIS, OnUpdateOptNoaxis)
        !            53:        ON_COMMAND(ID_OPT_PRECISE, OnOptPrecise)
        !            54:        ON_UPDATE_COMMAND_UI(ID_OPT_PRECISE, OnUpdateOptPrecise)
        !            55:        ON_COMMAND(ID_OPT_WIDE, OnOptWide)
        !            56:        ON_UPDATE_COMMAND_UI(ID_OPT_WIDE, OnUpdateOptWide)
        !            57:        //}}AFX_MSG_MAP
        !            58: END_MESSAGE_MAP()
        !            59:
        !            60:
        !            61: /////////////////////////////////////////////////////////////////////////////
        !            62: // CChildView メッセージ ハンドラ
        !            63:
        !            64: BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
        !            65: {
        !            66:        if (!CWnd::PreCreateWindow(cs))
        !            67:                return FALSE;
        !            68:
        !            69:        cs.dwExStyle |= WS_EX_CLIENTEDGE;
        !            70:        cs.style &= ~WS_BORDER;
        !            71:        cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
        !            72:                ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
        !            73:        return TRUE;
        !            74: }
        !            75:
        !            76: void CChildView::OnPaint()
        !            77: {
        !            78:        CPaintDC dc(this); // 描画用のデバイス コンテキスト
        !            79:
        !            80:        // TODO: メッセージ ハンドラのコードをここに追加してください。
        !            81:
        !            82:        // 描画のために CWnd::OnPaint を呼び出してはいけません。
        !            83:        if ( can->mode == MODE_INTERACTIVE ) {
        !            84:                ::BitBlt(dc.m_hDC,0,0,can->width,can->height,can->pix,0,0,SRCCOPY);
        !            85:        } else {
        !            86:                if ( !can->wide ) {
        !            87:                        ::BitBlt(dc.m_hDC,0,0,can->width,can->height,can->pix,0,0,SRCCOPY);
        !            88:                        pline(0,can,dc.m_hDC);
        !            89:                } else
        !            90:                        draw_wideframe(can,dc.m_hDC);
        !            91:        }
        !            92:        BringWindowToTop();
        !            93: }
        !            94:
        !            95: void CChildView::OnPrint(CDC &dc)
        !            96: {
        !            97:        DOCINFO docinfo;
        !            98:        NODE n;
        !            99:        int width,height,ratio,x,y;
        !           100:
        !           101:        memset(&docinfo,0,sizeof(DOCINFO));
        !           102:        docinfo.cbSize = sizeof(DOCINFO);
        !           103:        docinfo.lpszDocName = "test";
        !           104:        docinfo.lpszOutput = 0;
        !           105:
        !           106:        // black pen
        !           107:        CPen pen(PS_SOLID,0,(COLORREF)0);
        !           108:        dc.SelectObject(&pen);
        !           109:
        !           110:        // black brush
        !           111:        CBrush brush((COLORREF)0);
        !           112:        dc.SelectObject(&brush);
        !           113:
        !           114:        // setup
        !           115:        // isotropic mode
        !           116:        dc.SetMapMode(MM_ISOTROPIC);
        !           117:
        !           118:        // the page size in device pixel
        !           119:        width = dc.GetDeviceCaps(HORZRES)*9/10;
        !           120:        height = dc.GetDeviceCaps(VERTRES)*9/10;
        !           121:
        !           122:        dc.StartDoc(&docinfo);
        !           123:        dc.StartPage();
        !           124:
        !           125:        if ( can->mode == MODE_INTERACTIVE ) {
        !           126:                // We want to associate precisely one printer pixel to
        !           127:                // one bitmap pixel
        !           128:                // if can->width/can->height > width/height
        !           129:                // then match the widths, else match the height
        !           130:                if ( can->width*height > can->height*width )
        !           131:                        ratio = width/can->width;
        !           132:                else
        !           133:                        ratio = height/can->height;
        !           134:
        !           135:                // set the logical src bitmap size
        !           136:                dc.SetWindowExt(can->width*ratio,can->height*ratio);
        !           137:
        !           138:                // set the viewport size and the origine in printer pixel
        !           139:                dc.SetViewportOrg(width/18,height/18);
        !           140:                dc.SetViewportExt(width,height);
        !           141:
        !           142:                for ( n = can->history; n; n = NEXT(n) ) {
        !           143:                        RealVect *rv = (RealVect *)n->body;
        !           144:                        if ( rv->len == 2 ) {
        !           145: //                             dc.SetPixel(rv->body[0],rv->body[1],0);
        !           146:                                x = rv->body[0]*ratio;
        !           147:                                y = rv->body[1]*ratio;
        !           148: //                             dc.FillRect(CRect(x,y,x+1,y+1),&brush);
        !           149:                                dc.FillRect(CRect(x-1,y-1,x+1,y+1),&brush);
        !           150:                        } else if ( rv->len == 4 ) {
        !           151:                                dc.MoveTo(rv->body[0]*ratio,rv->body[1]*ratio);
        !           152:                                dc.LineTo(rv->body[2]*ratio,rv->body[3]*ratio);
        !           153:                        }
        !           154:                }
        !           155:        } else {
        !           156:                // set the logical src bitmap size
        !           157:                dc.SetWindowExt(can->width,can->height);
        !           158:
        !           159:                // set the viewport size and the origine in printer pixel
        !           160:                dc.SetViewportOrg(width/18,height/18);
        !           161:                dc.SetViewportExt(width,height);
        !           162:
        !           163:                if ( can->mode == MODE_PLOT )
        !           164:                        dc.Polyline(can->pa[0].pos,can->pa[0].length);
        !           165:                else
        !           166:                ::StretchBlt(dc.m_hDC,0,0,can->width,can->height,can->pix,
        !           167:                        0,0,can->width,can->height,SRCCOPY);
        !           168:                PrintAxis(dc);
        !           169:        }
        !           170:        dc.EndPage();
        !           171:        dc.EndDoc();
        !           172: }
        !           173:
        !           174: void CChildView::PrintAxis(CDC &dc)
        !           175: {
        !           176: #define D 5
        !           177:
        !           178:        double w,w1,k,e,n;
        !           179:        int x0,y0,x,y,xadj,yadj;
        !           180:        char buf[BUFSIZ];
        !           181:
        !           182:        /* XXX : should be cleaned up */
        !           183:        if ( can->noaxis || (can->mode == MODE_PLOT && !can->pa) )
        !           184:                return;
        !           185:        if ( can->mode == MODE_INTERACTIVE )
        !           186:                return;
        !           187:
        !           188:        xadj = yadj = 0;
        !           189:        if ( (can->xmin < 0) && (can->xmax > 0) ) {
        !           190:                x0 = (int)((can->width)*(-can->xmin/(can->xmax-can->xmin)));
        !           191:                dc.MoveTo(x0,0); dc.LineTo(x0,can->height);
        !           192:        } else if ( can->xmin >= 0 )
        !           193:                x0 = 0;
        !           194:        else
        !           195:                x0 = can->width-D;
        !           196:        if ( (can->ymin < 0) && (can->ymax > 0) ) {
        !           197:                y0 = (int)((can->height)*(can->ymax/(can->ymax-can->ymin)));
        !           198:                dc.MoveTo(0,y0); dc.LineTo(can->width,y0);
        !           199:        } else if ( can->ymin >= 0 )
        !           200:                y0 = can->height;
        !           201:        else
        !           202:                y0 = D;
        !           203:        w = can->xmax-can->xmin;
        !           204:        w1 = w * DEFAULTWIDTH/can->width;
        !           205:        e = adjust_scale(EXP10(floor(log10(w1))),w1);
        !           206:        for ( n = ceil(can->xmin/e); n*e<= can->xmax; n++ ) {
        !           207:                x = (int)can->width*(n*e-can->xmin)/w;
        !           208:                dc.MoveTo(x,y0); dc.LineTo(x,y0-D);
        !           209:                sprintf(buf,"%g",n*e);
        !           210:                dc.TextOut(x+2,y0+2,buf,strlen(buf));
        !           211:        }
        !           212:        w = can->ymax-can->ymin;
        !           213:        w1 = w * DEFAULTHEIGHT/can->height;
        !           214:        e = adjust_scale(EXP10(floor(log10(w1))),w1);
        !           215:        for ( n = ceil(can->ymin/e); n*e<= can->ymax; n++ ) {
        !           216:                y = (int)can->height*(1-(n*e-can->ymin)/w);
        !           217:                dc.MoveTo(x0,y); dc.LineTo(x0+D,y);
        !           218:                sprintf(buf,"%g",n*e);
        !           219:                if ( can->xmax <= 0 ) {
        !           220:                        xadj = dc.GetOutputTextExtent(buf,strlen(buf)).cx;
        !           221:                }
        !           222:                dc.TextOut(x0+2-xadj,y+2,buf,strlen(buf));
        !           223:        }
        !           224: }
        !           225:
        !           226: static CPoint start,prev;
        !           227:
        !           228: void CChildView::OnLButtonDown(UINT nFlags, CPoint point) {
        !           229:        start = point;
        !           230:        prev = point;
        !           231:        SetCapture();
        !           232:        CWnd::OnLButtonDown(nFlags,point);
        !           233: }
        !           234:
        !           235: void CChildView::OnMouseMove(UINT nFlags, CPoint point) {
        !           236:        if ( nFlags & MK_LBUTTON ) {
        !           237:                CDC *pDC = GetDC();
        !           238:                CRect prevrect(start,prev),rect(start,point);
        !           239:                CSize size(1,1);
        !           240:
        !           241:                pDC->DrawDragRect(&rect,size,&prevrect,size);
        !           242:                ReleaseDC(pDC);
        !           243:                prev = point;
        !           244:        }
        !           245:        CWnd::OnMouseMove(nFlags,point);
        !           246: }
        !           247:
        !           248: void CChildView::OnLButtonUp(UINT nFlags, CPoint point) {
        !           249:        CDC *pDC = GetDC();
        !           250:        CRect rect(start,point);
        !           251:        CSize size(1,1);
        !           252:
        !           253:        pDC->DrawDragRect(&rect,size,0,size);
        !           254:        ReleaseDC(pDC);
        !           255:        ReleaseCapture();
        !           256:        start_point = start; end_point = point;
        !           257:        current_can = can;
        !           258:        SetEvent(hResizeNotify);
        !           259:        WaitForSingleObject(hResizeNotify_Ack,(DWORD)-1);
        !           260:
        !           261:        CWnd::OnLButtonUp(nFlags,point);
        !           262: }
        !           263:
        !           264: void CChildView::DestroyCanvas() {
        !           265:        destroy_canvas(can);
        !           266: }
        !           267:
        !           268: void CChildView::OnOptNoaxis()
        !           269: {
        !           270:        // TODO: この位置にコマンド ハンドラ用のコードを追加してください
        !           271:        can->noaxis = !can->noaxis;
        !           272:        RedrawWindow();
        !           273: }
        !           274:
        !           275: void CChildView::OnUpdateOptNoaxis(CCmdUI* pCmdUI)
        !           276: {
        !           277:        // TODO: この位置に command update UI ハンドラ用のコードを追加してください
        !           278:        pCmdUI->SetCheck(can->noaxis);
        !           279: }
        !           280:
        !           281: void CChildView::OnOptPrecise()
        !           282: {
        !           283:        // TODO: この位置にコマンド ハンドラ用のコードを追加してください
        !           284:        can->precise = !can->precise;
        !           285: }
        !           286:
        !           287: void CChildView::OnUpdateOptPrecise(CCmdUI* pCmdUI)
        !           288: {
        !           289:        // TODO: この位置に command update UI ハンドラ用のコードを追加してください
        !           290:        pCmdUI->SetCheck(can->precise);
        !           291: }
        !           292:
        !           293: void CChildView::OnOptWide()
        !           294: {
        !           295:        // TODO: この位置にコマンド ハンドラ用のコードを追加してください
        !           296:        can->wide = !can->wide;
        !           297:        RedrawWindow();
        !           298: }
        !           299:
        !           300: void CChildView::OnUpdateOptWide(CCmdUI* pCmdUI)
        !           301: {
        !           302:        // TODO: この位置に command update UI ハンドラ用のコードを追加してください
        !           303:        pCmdUI->SetCheck(can->wide);
        !           304: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>