home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / PASM.LZH / STATUS.CPP < prev    next >
C/C++ Source or Header  |  1996-05-30  |  8KB  |  309 lines

  1. /*  Project partsasm
  2.     Project Team DoGA
  3.     Copyright (c) 1995. All Rights Reserved.
  4.  
  5.     サブシステム:    partsasm.apx Application
  6.     ファイル:        status.cpp
  7.     作成者:          Taka2
  8.  
  9.  
  10.     概要
  11.     ====
  12.     TWinStatus (TWindow) のインプリメンテーション用のソースファイル
  13. */
  14.  
  15. #include <owl\owlpch.h>
  16. #pragma hdrstop
  17.  
  18. #include <owl\statusba.h>
  19. #include <owl\button.h>
  20. #include <owl\edit.h>
  21. #include "status.h"
  22. #include "matrix.h"
  23. #include "design.h"
  24. #include "parts.h"
  25. #include "suflib.h"
  26. #include "syscolor.h"
  27. #include "dinput.h"
  28.  
  29. #include "log.h"
  30.  
  31. #define ws (textwidth / 2)
  32. #define hs (textheight-1)
  33. #define ss 1 //(textheight / 4)
  34.  
  35.  
  36. //
  37. // このアプリケーションで処理するすべてのメッセージ/コマンドの
  38. // 応答テーブルを作成する
  39. //
  40. DEFINE_RESPONSE_TABLE1(TWinStatus, TWindow)
  41. //{{TWinStatusRSP_TBL_BEGIN}}
  42.     EV_WM_LBUTTONDOWN,
  43. //{{TWinStatusRSP_TBL_END}}
  44. END_RESPONSE_TABLE;
  45.  
  46.  
  47. //{{TWinStatus Implementation}}
  48.  
  49.  
  50. TWinStatus::TWinStatus (TWindow* parent, DesignData *dat, int x, int y, int w, int h):
  51.     TWindow(parent, 0, 0)
  52. {
  53.     SetBkgndColor(TColor::LtGray);
  54.  
  55.     designdata = dat;
  56.     nowstatus = STAT_NONE;
  57.     Attr.X = x;
  58.     Attr.Y = y;
  59.     Attr.W = w;
  60.     Attr.H = h;
  61. }
  62.  
  63.  
  64. TWinStatus::~TWinStatus ()
  65. {
  66.     Destroy();
  67.  
  68.     // INSERT>> デストラクタ用のコードはここに
  69.  
  70. }
  71.  
  72.  
  73.  
  74. void TWinStatus::VectorOutInt(TDC& dc, int x, int y, Vector &v)
  75. {
  76.     char str[16];
  77.     sprintf(str, "%5.0lf     ", v.x);     dc.TextOut(x, y       , str);
  78.     sprintf(str, "%5.0lf     ", v.y);     dc.TextOut(x, y + hs  , str);
  79.     sprintf(str, "%5.0lf     ", v.z);     dc.TextOut(x, y + hs*2, str);
  80. }
  81.  
  82. void TWinStatus::VectorOutFloat(TDC& dc, int x, int y, Vector &v)
  83. {
  84.     char str[16];
  85.     sprintf(str, "%5.2lf     ", v.x);     dc.TextOut(x, y       , str);
  86.     sprintf(str, "%5.2lf     ", v.y);     dc.TextOut(x, y + hs  , str);
  87.     sprintf(str, "%5.2lf     ", v.z);     dc.TextOut(x, y + hs*2, str);
  88. }
  89.  
  90. void TWinStatus::DisplayPosition(Vector& v)
  91. {
  92.     TClientDC dc(*this);
  93.     dc.SetBkColor(TColor(cTextBG));
  94.     VectorOutInt(dc, textwidth*3, hs* 3+ss*2, v);
  95.  
  96. }
  97.  
  98. void TWinStatus::DisplayTarget(Vector& v)
  99. {
  100.     TClientDC dc(*this);
  101.     dc.SetBkColor(TColor(cTextBG));
  102.     VectorOutInt(dc, textwidth*3, hs* 7+ss*3, v);
  103. }
  104.  
  105. void TWinStatus::DisplayRotation(Vector& v)
  106. {
  107.     TClientDC dc(*this);
  108.     dc.SetBkColor(TColor(cTextBG));
  109.     VectorOutInt(dc, textwidth*3, hs* 7+ss*3, rad(1) * v);
  110. }
  111.  
  112. void TWinStatus::DisplayScale(Vector& v)
  113. {
  114.     TClientDC dc(*this);
  115.     dc.SetBkColor(TColor(cTextBG));
  116.     VectorOutFloat(dc, textwidth*3, hs*11+ss*4, v);
  117. }
  118.  
  119. void TWinStatus::Redraw(void)
  120. {
  121.     if (UpdateStatus() == FALSE) {
  122.         DisplayStatus(FALSE);
  123.     }
  124. }
  125.  
  126. void TWinStatus::DisplayStatusObject(TDC& dc, int flag, Parts *p)
  127. {
  128.     if (flag == TRUE) {
  129. //        dc.SelectStockObject(WHITE_PEN);
  130.         dc.Rectangle(dc.GetClipBox());
  131. //        dc.TextOut(ws,       ss  , "パーツ:");
  132.         dc.TextOut(ws, hs* 2+ss*2, "位置");
  133.         dc.TextOut(ws, hs* 3+ss*2, "X:");
  134.         dc.TextOut(ws, hs* 4+ss*2, "Y:");
  135.         dc.TextOut(ws, hs* 5+ss*2, "Z:");
  136.         dc.TextOut(ws, hs* 6+ss*3, "回転");
  137.         dc.TextOut(ws, hs* 7+ss*3, "X:");
  138.         dc.TextOut(ws, hs* 8+ss*3, "Y:");
  139.         dc.TextOut(ws, hs* 9+ss*3, "Z:");
  140.         dc.TextOut(ws, hs*10+ss*4, "拡大");
  141.         dc.TextOut(ws, hs*11+ss*4, "X:");
  142.         dc.TextOut(ws, hs*12+ss*4, "Y:");
  143.         dc.TextOut(ws, hs*13+ss*4, "Z:");
  144.     }
  145.     char str[120];
  146.     if (p == designdata->combined) {
  147.         sprintf(str, "複数選択(%d)      ", designdata->combined->nparts);
  148.     } else {
  149.         sprintf(str, "%s    ", p->object->name);
  150.     }
  151.     dc.TextOut(ws, ss, str);
  152.     sprintf(str, "%3d面      ", p->polygons);
  153.     dc.TextOut(ws+textwidth, hs+ss, str);
  154.     VectorOutInt  (dc, textwidth*3, hs* 3+ss*2, p->position);
  155.     VectorOutInt  (dc, textwidth*3, hs* 7+ss*3, rad(1) * p->rotation);
  156.     VectorOutFloat(dc, textwidth*3, hs*11+ss*4, p->scale);
  157. }
  158.  
  159. void TWinStatus::DisplayStatusCamera(TDC& dc, int flag, CameraParts *p)
  160. {
  161.     if (flag == TRUE) {
  162. //        dc.SelectStockObject(WHITE_PEN);
  163.         dc.Rectangle(dc.GetClipBox());
  164.         dc.TextOut(ws,      ss  , "カメラ");
  165.         dc.TextOut(ws, hs*2+ss*2, "カメラ位置");
  166.         dc.TextOut(ws, hs*3+ss*2, "X:");
  167.         dc.TextOut(ws, hs*4+ss*2, "Y:");
  168.         dc.TextOut(ws, hs*5+ss*2, "Z:");
  169.         dc.TextOut(ws, hs*6+ss*3, "ターゲット位置");
  170.         dc.TextOut(ws, hs*7+ss*3, "X:");
  171.         dc.TextOut(ws, hs*8+ss*3, "Y:");
  172.         dc.TextOut(ws, hs*9+ss*3, "Z:");
  173.     }
  174.     VectorOutInt(dc, textwidth*3, hs* 3+ss*2, p->position);
  175.     VectorOutInt(dc, textwidth*3, hs* 7+ss*3, p->target);
  176.  
  177. }
  178.  
  179. void TWinStatus::DisplayStatus(int flag)
  180. {
  181.     TClientDC dc(*this);
  182.     dc.SetBkColor(TColor(cTextBG));
  183.     dc.SelectObject(TPen(cTextBG));
  184.     dc.SelectObject(TBrush(cTextBG));
  185.     if (nowstatus == STAT_OBJ) {
  186.         DisplayStatusObject(dc, flag, designdata->select);
  187.         if (designdata->gridflag) {
  188.             designdata->statusbar->SetText("赤:移動 緑:回転 水:拡大 CTRL:グリッド無効 SHIFT赤:平行移動 SHIFT水:相似拡大 右:確定");
  189.         } else {
  190.             designdata->statusbar->SetText("赤:移動 緑:回転 水:拡大 CTRL:グリッド有効 SHIFT赤:平行移動 SHIFT水:相似拡大 右:確定");
  191.         }
  192.     } else if (nowstatus == STAT_CAMERA) {
  193.         DisplayStatusCamera(dc, flag, designdata->camera);
  194.         designdata->statusbar->SetText("赤マークを動かし、カメラ位置、ターゲット位置を変更してください");
  195.     } else {
  196.         if (flag == TRUE) {
  197.             dc.Rectangle(dc.GetClipBox());
  198.         }
  199.         if (designdata->zoommode == ZoomSelect) {
  200.             designdata->statusbar->SetText("ズームしたい位置をクリックしてください");
  201.         } else if (designdata->parts != NULL) {
  202.             designdata->statusbar->SetText("さらにパーツを追加するか、赤マークをクリックしてパーツを選択してください");
  203.         } else {
  204.             designdata->statusbar->SetText("[パーツ]/[パーツ追加] でパーツを追加してください");
  205.         }
  206.  
  207.     }
  208. }
  209.  
  210. void TWinStatus::DisplayStatusTemp(Parts *p)
  211. {
  212.     TClientDC dc(*this);
  213.     dc.SelectObject(TPen(cTextBG));
  214.     dc.SelectObject(TBrush(cTextBG));
  215.     dc.SetBkColor(TColor(cTextBG));
  216.     if (nowdisplay != p) {
  217.         nowdisplay = p;
  218.         if (p == NULL) {
  219.             dc.SelectStockObject(WHITE_PEN);
  220.             dc.Rectangle(dc.GetClipBox());
  221.         } else if (p == designdata->camera) {
  222.             DisplayStatusCamera(dc, TRUE, designdata->camera);
  223.         } else {
  224.             DisplayStatusObject(dc, TRUE, p);
  225.         }
  226.     }
  227. }
  228.  
  229. int TWinStatus::UpdateStatus(void)
  230. {
  231.     StatusMode nstat;
  232.     if (designdata->select == NULL) {
  233.         nstat = STAT_NONE;
  234.         nowdisplay = NULL;
  235.     } else if (designdata->select == designdata->camera) {
  236.         nstat = STAT_CAMERA;
  237.         nowdisplay = designdata->camera;
  238.     } else {
  239.         nstat = STAT_OBJ;
  240.         nowdisplay = designdata->select;
  241.     }
  242.     if (designdata->zoommode == ZoomNow) {
  243.         designdata->button_zoom->Show(SW_SHOW);
  244.     } else {
  245.         designdata->button_zoom->Show(SW_HIDE);
  246.     }
  247.     if (nstat == STAT_NONE || designdata->zoommode == ZoomSelect) {
  248.         designdata->button_ok->Show(SW_HIDE);
  249.         designdata->button_cancel->Show(SW_HIDE);
  250.     } else {
  251.         designdata->button_ok->Show(SW_SHOW);
  252.         designdata->button_cancel->Show(SW_SHOW);
  253.     }
  254.  
  255.     if (nstat != nowstatus) {
  256.         nowstatus = nstat;
  257.         DisplayStatus(TRUE);
  258.         return TRUE;
  259.     }
  260.     return FALSE;
  261. }
  262.  
  263.  
  264. void TWinStatus::Paint (TDC& dc, BOOL erase, TRect& rect)
  265. {
  266.     TWindow::Paint(dc, erase, rect);
  267.  
  268.     // INSERT>> 追加のコードはここに
  269.  
  270.     DisplayStatus(TRUE);
  271. }
  272.  
  273.  
  274.  
  275. void TWinStatus::SetupWindow ()
  276. {
  277.     TWindow::SetupWindow();
  278.  
  279.     // INSERT>> 追加のコードはここに
  280.     TClientDC dc(*this);
  281.     TEXTMETRIC metric;
  282.     dc.GetTextMetrics(metric);
  283.     textheight = metric.tmHeight;
  284.     textwidth = metric.tmAveCharWidth;
  285.  
  286. }
  287.  
  288. void TWinStatus::EvLButtonDown (UINT modKeys, TPoint& point)
  289. {
  290.     TWindow::EvLButtonDown(modKeys, point);
  291.  
  292.     // INSERT>> 追加コードはここに
  293.  
  294.     if (designdata->select != NULL) {
  295.         TDDirectInput dialog(this, designdata, 0);
  296.         if (dialog.Execute() == IDOK) {
  297.             if (designdata->select != designdata->camera) designdata->editflag++;
  298.             if (designdata->select == designdata->camera) {
  299.                 designdata->camera->SetTarget(designdata->camera->target);
  300.                 designdata->Redraw(SelAll, TRUE);
  301.             } else {
  302.                 designdata->CalcPoints(designdata->select);
  303.                 designdata->Redraw();
  304.             }
  305.         }
  306.     }
  307. }
  308.  
  309.