home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
PASM.LZH
/
PARTSDLG.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-03
|
8KB
|
329 lines
/* Project partsasm
Project Team DoGA
Copyright (c) 1995. All Rights Reserved.
サブシステム: partsasm.apx Application
ファイル: partsdlg.cpp
作成者: Taka2
概要
====
PartsDialog (TDialog) のインプリメンテーション用のソースファイル
*/
#include <owl\owlpch.h>
#pragma hdrstop
#include <stdio.h>
#include "partsdlg.h"
//#include "pasmapp.rh"
#include "profile.h"
#include "files.h"
#include "log.h"
static const int PixelWidth=512, PixelHeight=384;
static const TColor& cSelect = TColor::LtRed;
static const TSize CatalogSize(PixelWidth, PixelHeight);
//static const TPoint CatalogPosition(120, 10);
#define CatalogPosition TPoint(textwidth*15,textwidth)
//
// このアプリケーションで処理するすべてのメッセージ/コマンドの
// 応答テーブルを作成する
//
DEFINE_RESPONSE_TABLE1(PartsDialog, TDialog)
//{{PartsDialogRSP_TBL_BEGIN}}
EV_WM_LBUTTONDOWN,
EV_WM_PAINT,
EV_LBN_SELCHANGE(IDC_PARTS_LISTBOX, LBNSelchange),
EV_WM_PALETTECHANGED,
EV_WM_QUERYNEWPALETTE,
EV_WM_LBUTTONDBLCLK,
//{{PartsDialogRSP_TBL_END}}
END_RESPONSE_TABLE;
//{{PartsDialog Implementation}}
PartsDialog::PartsDialog (TWindow* parent, int lastmenu, int lastparts):
TDialog(parent, IDD_PARTS, NULL)
{
// INSERT>> コンストラクタ用のコードはここに
// SetBkgndColor(TColor::LtGray);
pListBox = new TListBox(this, IDC_PARTS_LISTBOX);
pStatic = new TStatic(this, IDC_PARTS_NAME);
// pStatic->SetBkgndColor(TColor::LtGray);
nowmenu = -1;
nowparts = -1;
CatalogDib = NULL;
CatalogPalette = NULL;
// partsname = NULL;
// partscount = 0;
// ProfileRead();
OpenCatalog(lastmenu);
SelectParts(lastparts);
}
PartsDialog::~PartsDialog ()
{
Destroy();
// INSERT>> デストラクタ用のコードはここに
delete CatalogPalette;
delete CatalogDib;
// delete [] partsname;
}
void PartsDialog::SelectParts(int no)
{
if (no == -1) {
nowparts = -1;
filename[0] = '\0';
pStatic->SetText(filename);
} else if (nowparts != no) {
nowparts = no;
wsprintf(filename, "%s%02d", partsname[nowmenu].partsfile.c_str(), no+1);
pStatic->SetText(filename);
strcat(filename, ".SUF");
}
}
static void GetXY(int *ux, int *uy, int tw)
{
if (tw < 8) {
*ux = tw * 16;
*uy = tw * 12;
} else {
*ux = PixelWidth/4;
*uy = PixelHeight/4;
}
}
void PartsDialog::drawSelBox(TDC& dc, int no)
{
if (no < 0 || no >= 16) {
return;
}
// const int ux=textwidth*16, uy=textwidth*12;
int ux, uy;
GetXY(&ux, &uy, textwidth);
int x = no % 4;
int y = no / 4;
dc.MoveTo(CatalogPosition + TPoint( x *ux, y *uy));
dc.LineTo(CatalogPosition + TPoint((x+1)*ux, y *uy));
dc.LineTo(CatalogPosition + TPoint((x+1)*ux, (y+1)*uy));
dc.LineTo(CatalogPosition + TPoint( x *ux, (y+1)*uy));
dc.LineTo(CatalogPosition + TPoint( x *ux, y *uy));
dc.MoveTo(CatalogPosition + TPoint( x *ux+1, y *uy+1));
dc.LineTo(CatalogPosition + TPoint((x+1)*ux-1, y *uy+1));
dc.LineTo(CatalogPosition + TPoint((x+1)*ux-1, (y+1)*uy-1));
dc.LineTo(CatalogPosition + TPoint( x *ux+1, (y+1)*uy-1));
dc.LineTo(CatalogPosition + TPoint( x *ux+1, y *uy+1));
}
void PartsDialog::EvLButtonDown (UINT modKeys, TPoint& point)
{
TDialog::EvLButtonDown(modKeys, point);
// INSERT>> 追加コードはここに
// const ux=textwidth*16, uy=textwidth*12;
int ux, uy;
GetXY(&ux, &uy, textwidth);
TPoint p;
p = point - CatalogPosition;
if (nowmenu >= 0 && 0 <= p.x && p.x < ux*4 && 0 <= p.y && p.y < uy*4) {
int x, y, n;
x = p.x / ux;
y = p.y / uy;
n = y * 4 + x;
if (n != nowparts) {
TClientDC dc(*this);
dc.SelectStockObject(WHITE_PEN);
// dc.SelectObject(TPen(TColor::LtGray));
drawSelBox(dc, nowparts);
dc.SelectObject(TPen(cSelect));
drawSelBox(dc, n);
SelectParts(n);
}
}
}
void PartsDialog::EvPaint ()
{
TDialog::EvPaint();
// int ux=textwidth*16, uy=textwidth*12;
int ux, uy;
GetXY(&ux, &uy, textwidth);
// INSERT>> 追加コードはここに
TClientDC dc(*this);
if (CatalogPalette) {
dc.SelectObject(*CatalogPalette, FALSE);
dc.RealizePalette();
}
TRect clientRect(CatalogPosition, TSize(ux*4,uy*4));
if (CatalogDib) {
if (textwidth < 8) {
TRect srcRect(TPoint(0,0), CatalogSize);
dc.StretchDIBits(clientRect, srcRect, *CatalogDib);
} else {
dc.SetDIBitsToDevice(clientRect, TPoint(0,0), *CatalogDib);
}
} else {
dc.PatBlt(clientRect, PATCOPY);
}
// dc.SelectObject(TPen(TColor::LtGray));
dc.SelectStockObject(WHITE_PEN);
for (int i = 0; i < 5; ++i) {
dc.MoveTo(CatalogPosition + TPoint( 0, i*uy-1)); dc.LineTo(CatalogPosition + TPoint(4*ux, i*uy-1));
dc.MoveTo(CatalogPosition + TPoint( 0, i*uy)); dc.LineTo(CatalogPosition + TPoint(4*ux, i*uy ));
dc.MoveTo(CatalogPosition + TPoint( 0, i*uy+1)); dc.LineTo(CatalogPosition + TPoint(4*ux, i*uy+1));
dc.MoveTo(CatalogPosition + TPoint(i*ux-1, 0)); dc.LineTo(CatalogPosition + TPoint(i*ux-1, 4*uy));
dc.MoveTo(CatalogPosition + TPoint(i*ux , 0)); dc.LineTo(CatalogPosition + TPoint(i*ux , 4*uy));
dc.MoveTo(CatalogPosition + TPoint(i*ux+1, 0)); dc.LineTo(CatalogPosition + TPoint(i*ux+1, 4*uy));
}
if (nowparts >= 0) {
dc.SelectObject(TPen(cSelect));
drawSelBox(dc, nowparts);
}
}
void PartsDialog::LBNSelchange ()
{
// INSERT>> 追加コードはここに
int no;
if ((no = int(pListBox->GetItemData(pListBox->GetSelIndex()))) != nowmenu) {
OpenCatalog(no);
EvPaint();
}
}
void PartsDialog::SetupWindow ()
{
TDialog::SetupWindow();
// INSERT>> 追加のコードはここに
for (int i = 0; i < partscount; ++i) {
int no = pListBox->AddString(partsname[i].title.c_str());
pListBox->SetItemData(no, i);
}
pListBox->SetSelIndex(nowmenu);
int n = nowparts;
nowparts = -1;
SelectParts(n);
TEXTMETRIC metric;
TClientDC(*this).GetTextMetrics(metric);
textwidth = metric.tmAveCharWidth;
}
void PartsDialog::UpdatePalette(BOOL alwaysRepaint)
{
if (CatalogPalette) {
TClientDC clientDC(*this);
#if !defined(__WIN32__)
CatalogPalette->UnrealizeObject();
#endif
clientDC.SelectObject(*CatalogPalette, FALSE);
if (clientDC.RealizePalette() > 0)
if (alwaysRepaint)
Invalidate(FALSE);
else
clientDC.UpdateColors();
}
}
void PartsDialog::OpenCatalog(int no)
{
if (no < 0 || no >= partscount) {
return;
}
TDib* dib = 0;
try {
dib = new TDib(partsname[no].catalogfile.c_str());
}
catch (TGdiBase::TXGdi) {
char str[120];
sprintf(str, "ビットマップファイル(%s)を開けません", partsname[no].catalogfile.c_str());
MessageBox(str, GetApplication()->GetName(), MB_OK);
return;
}
nowmenu = no;
SelectParts(-1);
delete CatalogDib;
delete CatalogPalette;
CatalogDib = dib;
CatalogPalette = new TPalette(*dib);
UpdatePalette(TRUE);
}
void PartsDialog::EvPaletteChanged (HWND hWndPalChg)
{
TDialog::EvPaletteChanged(hWndPalChg);
// INSERT>> 追加コードはここに
if (hWndPalChg != HWindow)
UpdatePalette(TRUE); // 再描画する代わりに,UpdateColors() に FALSE を渡す
}
BOOL PartsDialog::EvQueryNewPalette ()
{
BOOL result;
result = TDialog::EvQueryNewPalette();
// INSERT>> 追加コードはここに
UpdatePalette(TRUE);
return result;
}
void PartsDialog::EvLButtonDblClk (UINT modKeys, TPoint& point)
{
TDialog::EvLButtonDblClk(modKeys, point);
// INSERT>> 追加コードはここに
// const int ux=textwidth*16, uy=textwidth*12;
int ux, uy;
GetXY(&ux, &uy, textwidth);
TPoint p;
p = point - CatalogPosition;
if (nowmenu >= 0 && 0 <= p.x && p.x < ux*4 && 0 <= p.y && p.y < uy*4) {
int x, y, n;
x = p.x / ux;
y = p.y / uy;
n = y * 4 + x;
SelectParts(n);
CloseWindow(IDOK);
}
}