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 >
Wrap
C/C++ Source or Header
|
1996-05-30
|
8KB
|
309 lines
/* Project partsasm
Project Team DoGA
Copyright (c) 1995. All Rights Reserved.
サブシステム: partsasm.apx Application
ファイル: status.cpp
作成者: Taka2
概要
====
TWinStatus (TWindow) のインプリメンテーション用のソースファイル
*/
#include <owl\owlpch.h>
#pragma hdrstop
#include <owl\statusba.h>
#include <owl\button.h>
#include <owl\edit.h>
#include "status.h"
#include "matrix.h"
#include "design.h"
#include "parts.h"
#include "suflib.h"
#include "syscolor.h"
#include "dinput.h"
#include "log.h"
#define ws (textwidth / 2)
#define hs (textheight-1)
#define ss 1 //(textheight / 4)
//
// このアプリケーションで処理するすべてのメッセージ/コマンドの
// 応答テーブルを作成する
//
DEFINE_RESPONSE_TABLE1(TWinStatus, TWindow)
//{{TWinStatusRSP_TBL_BEGIN}}
EV_WM_LBUTTONDOWN,
//{{TWinStatusRSP_TBL_END}}
END_RESPONSE_TABLE;
//{{TWinStatus Implementation}}
TWinStatus::TWinStatus (TWindow* parent, DesignData *dat, int x, int y, int w, int h):
TWindow(parent, 0, 0)
{
SetBkgndColor(TColor::LtGray);
designdata = dat;
nowstatus = STAT_NONE;
Attr.X = x;
Attr.Y = y;
Attr.W = w;
Attr.H = h;
}
TWinStatus::~TWinStatus ()
{
Destroy();
// INSERT>> デストラクタ用のコードはここに
}
void TWinStatus::VectorOutInt(TDC& dc, int x, int y, Vector &v)
{
char str[16];
sprintf(str, "%5.0lf ", v.x); dc.TextOut(x, y , str);
sprintf(str, "%5.0lf ", v.y); dc.TextOut(x, y + hs , str);
sprintf(str, "%5.0lf ", v.z); dc.TextOut(x, y + hs*2, str);
}
void TWinStatus::VectorOutFloat(TDC& dc, int x, int y, Vector &v)
{
char str[16];
sprintf(str, "%5.2lf ", v.x); dc.TextOut(x, y , str);
sprintf(str, "%5.2lf ", v.y); dc.TextOut(x, y + hs , str);
sprintf(str, "%5.2lf ", v.z); dc.TextOut(x, y + hs*2, str);
}
void TWinStatus::DisplayPosition(Vector& v)
{
TClientDC dc(*this);
dc.SetBkColor(TColor(cTextBG));
VectorOutInt(dc, textwidth*3, hs* 3+ss*2, v);
}
void TWinStatus::DisplayTarget(Vector& v)
{
TClientDC dc(*this);
dc.SetBkColor(TColor(cTextBG));
VectorOutInt(dc, textwidth*3, hs* 7+ss*3, v);
}
void TWinStatus::DisplayRotation(Vector& v)
{
TClientDC dc(*this);
dc.SetBkColor(TColor(cTextBG));
VectorOutInt(dc, textwidth*3, hs* 7+ss*3, rad(1) * v);
}
void TWinStatus::DisplayScale(Vector& v)
{
TClientDC dc(*this);
dc.SetBkColor(TColor(cTextBG));
VectorOutFloat(dc, textwidth*3, hs*11+ss*4, v);
}
void TWinStatus::Redraw(void)
{
if (UpdateStatus() == FALSE) {
DisplayStatus(FALSE);
}
}
void TWinStatus::DisplayStatusObject(TDC& dc, int flag, Parts *p)
{
if (flag == TRUE) {
// dc.SelectStockObject(WHITE_PEN);
dc.Rectangle(dc.GetClipBox());
// dc.TextOut(ws, ss , "パーツ:");
dc.TextOut(ws, hs* 2+ss*2, "位置");
dc.TextOut(ws, hs* 3+ss*2, "X:");
dc.TextOut(ws, hs* 4+ss*2, "Y:");
dc.TextOut(ws, hs* 5+ss*2, "Z:");
dc.TextOut(ws, hs* 6+ss*3, "回転");
dc.TextOut(ws, hs* 7+ss*3, "X:");
dc.TextOut(ws, hs* 8+ss*3, "Y:");
dc.TextOut(ws, hs* 9+ss*3, "Z:");
dc.TextOut(ws, hs*10+ss*4, "拡大");
dc.TextOut(ws, hs*11+ss*4, "X:");
dc.TextOut(ws, hs*12+ss*4, "Y:");
dc.TextOut(ws, hs*13+ss*4, "Z:");
}
char str[120];
if (p == designdata->combined) {
sprintf(str, "複数選択(%d) ", designdata->combined->nparts);
} else {
sprintf(str, "%s ", p->object->name);
}
dc.TextOut(ws, ss, str);
sprintf(str, "%3d面 ", p->polygons);
dc.TextOut(ws+textwidth, hs+ss, str);
VectorOutInt (dc, textwidth*3, hs* 3+ss*2, p->position);
VectorOutInt (dc, textwidth*3, hs* 7+ss*3, rad(1) * p->rotation);
VectorOutFloat(dc, textwidth*3, hs*11+ss*4, p->scale);
}
void TWinStatus::DisplayStatusCamera(TDC& dc, int flag, CameraParts *p)
{
if (flag == TRUE) {
// dc.SelectStockObject(WHITE_PEN);
dc.Rectangle(dc.GetClipBox());
dc.TextOut(ws, ss , "カメラ");
dc.TextOut(ws, hs*2+ss*2, "カメラ位置");
dc.TextOut(ws, hs*3+ss*2, "X:");
dc.TextOut(ws, hs*4+ss*2, "Y:");
dc.TextOut(ws, hs*5+ss*2, "Z:");
dc.TextOut(ws, hs*6+ss*3, "ターゲット位置");
dc.TextOut(ws, hs*7+ss*3, "X:");
dc.TextOut(ws, hs*8+ss*3, "Y:");
dc.TextOut(ws, hs*9+ss*3, "Z:");
}
VectorOutInt(dc, textwidth*3, hs* 3+ss*2, p->position);
VectorOutInt(dc, textwidth*3, hs* 7+ss*3, p->target);
}
void TWinStatus::DisplayStatus(int flag)
{
TClientDC dc(*this);
dc.SetBkColor(TColor(cTextBG));
dc.SelectObject(TPen(cTextBG));
dc.SelectObject(TBrush(cTextBG));
if (nowstatus == STAT_OBJ) {
DisplayStatusObject(dc, flag, designdata->select);
if (designdata->gridflag) {
designdata->statusbar->SetText("赤:移動 緑:回転 水:拡大 CTRL:グリッド無効 SHIFT赤:平行移動 SHIFT水:相似拡大 右:確定");
} else {
designdata->statusbar->SetText("赤:移動 緑:回転 水:拡大 CTRL:グリッド有効 SHIFT赤:平行移動 SHIFT水:相似拡大 右:確定");
}
} else if (nowstatus == STAT_CAMERA) {
DisplayStatusCamera(dc, flag, designdata->camera);
designdata->statusbar->SetText("赤マークを動かし、カメラ位置、ターゲット位置を変更してください");
} else {
if (flag == TRUE) {
dc.Rectangle(dc.GetClipBox());
}
if (designdata->zoommode == ZoomSelect) {
designdata->statusbar->SetText("ズームしたい位置をクリックしてください");
} else if (designdata->parts != NULL) {
designdata->statusbar->SetText("さらにパーツを追加するか、赤マークをクリックしてパーツを選択してください");
} else {
designdata->statusbar->SetText("[パーツ]/[パーツ追加] でパーツを追加してください");
}
}
}
void TWinStatus::DisplayStatusTemp(Parts *p)
{
TClientDC dc(*this);
dc.SelectObject(TPen(cTextBG));
dc.SelectObject(TBrush(cTextBG));
dc.SetBkColor(TColor(cTextBG));
if (nowdisplay != p) {
nowdisplay = p;
if (p == NULL) {
dc.SelectStockObject(WHITE_PEN);
dc.Rectangle(dc.GetClipBox());
} else if (p == designdata->camera) {
DisplayStatusCamera(dc, TRUE, designdata->camera);
} else {
DisplayStatusObject(dc, TRUE, p);
}
}
}
int TWinStatus::UpdateStatus(void)
{
StatusMode nstat;
if (designdata->select == NULL) {
nstat = STAT_NONE;
nowdisplay = NULL;
} else if (designdata->select == designdata->camera) {
nstat = STAT_CAMERA;
nowdisplay = designdata->camera;
} else {
nstat = STAT_OBJ;
nowdisplay = designdata->select;
}
if (designdata->zoommode == ZoomNow) {
designdata->button_zoom->Show(SW_SHOW);
} else {
designdata->button_zoom->Show(SW_HIDE);
}
if (nstat == STAT_NONE || designdata->zoommode == ZoomSelect) {
designdata->button_ok->Show(SW_HIDE);
designdata->button_cancel->Show(SW_HIDE);
} else {
designdata->button_ok->Show(SW_SHOW);
designdata->button_cancel->Show(SW_SHOW);
}
if (nstat != nowstatus) {
nowstatus = nstat;
DisplayStatus(TRUE);
return TRUE;
}
return FALSE;
}
void TWinStatus::Paint (TDC& dc, BOOL erase, TRect& rect)
{
TWindow::Paint(dc, erase, rect);
// INSERT>> 追加のコードはここに
DisplayStatus(TRUE);
}
void TWinStatus::SetupWindow ()
{
TWindow::SetupWindow();
// INSERT>> 追加のコードはここに
TClientDC dc(*this);
TEXTMETRIC metric;
dc.GetTextMetrics(metric);
textheight = metric.tmHeight;
textwidth = metric.tmAveCharWidth;
}
void TWinStatus::EvLButtonDown (UINT modKeys, TPoint& point)
{
TWindow::EvLButtonDown(modKeys, point);
// INSERT>> 追加コードはここに
if (designdata->select != NULL) {
TDDirectInput dialog(this, designdata, 0);
if (dialog.Execute() == IDOK) {
if (designdata->select != designdata->camera) designdata->editflag++;
if (designdata->select == designdata->camera) {
designdata->camera->SetTarget(designdata->camera->target);
designdata->Redraw(SelAll, TRUE);
} else {
designdata->CalcPoints(designdata->select);
designdata->Redraw();
}
}
}
}