mmsstv/CItems/PERIMG/PerDlg.cpp

598 lines
16 KiB
C++
Raw Permalink Normal View History

2013-07-05 22:15:14 +02:00
//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "PerDlg.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
//---------------------------------------------------------------------
#if UseHWND
__fastcall TPerDlgBox::TPerDlgBox(HWND hWnd)
: TForm(hWnd)
#else
__fastcall TPerDlgBox::TPerDlgBox(TComponent* AOwner)
: TForm(AOwner)
#endif
{
m_Loaded = 0;
m_DisEvent = 1;
if( sys.m_MsgEng ){
Font->Name = "Arial";
Font->Charset = ANSI_CHARSET;
Caption = VER" - "TTL;
CancelBtn->Caption = "Cancel";
DefBtn->Caption = "Default";
L1->Caption = "Rot.X";
L2->Caption = "Rot.Y";
L3->Caption = "Rot.Z";
L4->Caption = "Move.Z";
L5->Caption = "Move.Y";
L6->Caption = "Move.X";
L7->Caption = "ViewP.";
L8->Caption = "Scale.X";
L9->Caption = "Scale.Y";
L10->Caption = "Rot";
L11->Caption = "Defo.";
RGSRC->Caption = "Source";
RGSRC->Items->Strings[0] = "History";
RGSRC->Items->Strings[1] = "Loaded image";
RGSRC->Items->Strings[2] = "Overlay";
ViewBtn->Caption = "Show";
PasteBtn->Caption = "Paste";
DefBtn->Hint = "Return to the default";
LoadBtn->Hint = "Load image file";
PasteBtn->Hint = "Load from the clipboard";
ViewBtn->Hint = "Show source image";
SBR->Hint = "Return to the default";
L12->Caption = "Frame W.";
CBF->Items->Strings[0] = "None";
PC->Hint = "Set frame color";
}
else {
Caption = VER" - "TTLJ;
}
m_pBitmap = NULL;
m_pItem = NULL;
m_XC = -1;
m_Wave = 0;
for( int i = 0; i < AN(m_DirTB); i++ ){
m_DirTB[i] = 1;
}
m_hClipNext = ::SetClipboardViewer(Handle);
ShowHint = sys.m_WinNT;
MultProc();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::FormDestroy(TObject *Sender)
{
::ChangeClipboardChain(Handle, m_hClipNext);
if( m_pBitmap != NULL ) delete m_pBitmap;
}
//---------------------------------------------------------------------------
int __fastcall TPerDlgBox::Execute(CItem *pItem)
{
m_pItem = pItem;
m_Item.Copy(pItem);
if( m_Item.m_pBitmap == NULL ) m_Item.CopyFromHistory();
m_Back = m_Item.m_Back;
LPSPERSPECT psp = &m_Item.m_sperspect;
MultProc();
TBAX->Position = psp->ax * 20.0 + 0.5;
TBAY->Position = psp->ay * 20.0 + 0.5;
TBPX->Position = psp->px * 40.0;
TBPY->Position = psp->py * 40.0;
TBPZ->Position = psp->pz * 40.0;
TBRX->Position = psp->rx;
TBRY->Position = psp->ry;
TBRZ->Position = psp->rz;
TBS->Position = psp->s * 10.0 + 0.5;
TBR->Position = psp->r;
RGSRC->ItemIndex = psp->flag & 0x0000ffff;
SBSC->Position = SHORT(m_Item.m_SC);
m_Wave = psp->flag >> 16;
CBF->ItemIndex = pItem->m_Frame;
PC->Color = pItem->m_FrameCol;
UpdateWaveBtn(0);
UpdateBitmap();
UpdateBtn();
m_DisEvent = 0;
MultProc();
if( ShowModal() == IDOK ){
MultProc();
psp = &pItem->m_sperspect;
psp->ax = double(TBAX->Position)/20.0;
psp->ay = double(TBAY->Position)/20.0;
psp->px = double(TBPX->Position)/40.0;
psp->py = double(TBPY->Position)/40.0;
psp->pz = double(TBPZ->Position)/40.0;
psp->rx = TBRX->Position;
psp->ry = TBRY->Position;
psp->rz = TBRZ->Position;
psp->s = double(TBS->Position)/10.0;
psp->r = TBR->Position;
pItem->m_SC = SBSC->Position;
pItem->m_Frame = CBF->ItemIndex;
pItem->m_FrameCol = PC->Color;
UpdateWaveBtn(1);
psp->flag = RGSRC->ItemIndex | (m_Wave << 16);
if( (psp->flag & 0x0000ffff) && m_Loaded && (m_Item.m_pBitmap != NULL) ){
pItem->CopySource(m_Item.m_pBitmap);
}
return TRUE;
}
MultProc();
return FALSE;
}
//---------------------------------------------------------------------
void __fastcall TPerDlgBox::UpdateWaveBtn(int dir)
{
TSpeedButton *tbl[]={
SB, SBZ1, SBZ2, SBZ3, SBZ4, SBZ5, SBZ6, SBZ7,
SBZ8, SBZ9, SBZ10, SBZ11, SBZ12, SBZ13, SBZ14,
SBZ15, SBZ16, SBZ17, SBZ18, SBZ19, SBZ20, SBZ21,
SBZ22, SBZ23, SBZ24, SBZ25, SBZ26, SBZ27, SBZ28,
SBZ29, SBZ30, SBZ31, SBZ32, SBZ33, SBZ34, SBZ35,
SBZ36, SBZ37, SBZ38,
NULL,
};
if( dir ){
for( int i = 0; tbl[i] != NULL; i++ ){
if( tbl[i]->Down ){
m_Wave = i;
break;
}
}
}
else {
if( m_Wave >= (AN(tbl)-1) ) m_Wave = 0;
tbl[m_Wave]->Down = TRUE;
}
}
//---------------------------------------------------------------------
void __fastcall TPerDlgBox::UpdateBitmap(void)
{
if( m_Item.m_pBitmap == NULL ) return;
m_Item.m_sperspect.ax = double(TBAX->Position)/20.0;
m_Item.m_sperspect.ay = double(TBAY->Position)/20.0;
m_Item.m_sperspect.px = double(TBPX->Position)/40.0;
m_Item.m_sperspect.py = double(TBPY->Position)/40.0;
m_Item.m_sperspect.pz = double(TBPZ->Position)/40.0;
m_Item.m_sperspect.rx = TBRX->Position;
m_Item.m_sperspect.ry = TBRY->Position;
m_Item.m_sperspect.rz = TBRZ->Position;
m_Item.m_sperspect.s = double(TBS->Position)/10.0;
m_Item.m_sperspect.r = TBR->Position;
m_Item.m_SC = SBSC->Position;
m_Item.m_Frame = CBF->ItemIndex;
m_Item.m_FrameCol = PC->Color;
m_pBitmap = m_Item.Perspect(m_pBitmap, m_Item.m_pBitmap);
UpdateHint();
UpdateTB();
if( ShowHint ) Application->CancelHint();
}
//---------------------------------------------------------------------
void __fastcall TPerDlgBox::PBoxPaint(TObject *Sender)
{
DrawBitmap(PBox, m_pBitmap);
}
//---------------------------------------------------------------------
void __fastcall TPerDlgBox::UpdateHint(void)
{
if( sys.m_WinNT ){
char bf[128];
wsprintf(bf, "VP: %d", TBS->Position);
TBS->Hint = bf;
wsprintf(bf, "SX: %d", TBAX->Position);
TBAX->Hint = bf;
wsprintf(bf, "SY: %d", TBAY->Position);
TBAY->Hint = bf;
wsprintf(bf, "PX: %d", TBPX->Position);
TBPX->Hint = bf;
wsprintf(bf, "PY: %d", TBPY->Position);
TBPY->Hint = bf;
wsprintf(bf, "PZ: %d", TBPZ->Position);
TBPZ->Hint = bf;
wsprintf(bf, "RX: %d", TBRX->Position);
TBRX->Hint = bf;
wsprintf(bf, "RY: %d", TBRY->Position);
TBRY->Hint = bf;
wsprintf(bf, "RZ: %d", TBRZ->Position);
TBRZ->Hint = bf;
wsprintf(bf, "R: %d", TBR->Position);
TBR->Hint = bf;
wsprintf(bf, "%d", SBSC->Position);
SBSC->Hint = bf;
}
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::DefBtnClick(TObject *Sender)
{
#if 0 // for to get default
FILE *fp = fopen("TEST.TXT", "wt");
fprintf(fp, "%d\n", TBAX->Position);
fprintf(fp, "%d\n", TBAY->Position);
fprintf(fp, "%d\n", TBPX->Position);
fprintf(fp, "%d\n", TBPY->Position);
fprintf(fp, "%d\n", TBPZ->Position);
fprintf(fp, "%d\n", TBRX->Position);
fprintf(fp, "%d\n", TBRY->Position);
fprintf(fp, "%d\n", TBRZ->Position);
fprintf(fp, "%d\n\n", TBS->Position);
SPERSPECT *psp = &m_Item.m_sperspect;
fprintf(fp, "%f\n", psp->ax);
fprintf(fp, "%f\n", psp->ay);
fprintf(fp, "%f\n", psp->px);
fprintf(fp, "%f\n", psp->py);
fprintf(fp, "%f\n", psp->pz);
fprintf(fp, "%f\n", psp->rx);
fprintf(fp, "%f\n", psp->ry);
fprintf(fp, "%f\n", psp->rz);
fprintf(fp, "%f\n", psp->s);
fclose(fp);
#else
m_DisEvent++;
TBAX->Position = 60;
TBAY->Position = 60;
TBPX->Position = 0;
TBPY->Position = 0;
TBPZ->Position = 0;
TBRX->Position = 0;
TBRY->Position = 0;
TBRZ->Position = -180;
TBR->Position = 0;
TBS->Position = 23;
SBSC->Position = 0;
m_DisEvent--;
UpdateItem();
UpdateBtn();
#endif
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::UpdateBtn(void)
{
LoadBtn->Enabled = RGSRC->ItemIndex && sys.m_fLoadImageMenu;
PasteBtn->Enabled = RGSRC->ItemIndex && Clipboard()->HasFormat(CF_BITMAP);
ViewBtn->Visible = sys.m_fView && (m_Item.m_pBitmap != NULL);
SBSC->Enabled = !SB->Down;
SBR->Enabled = !SB->Down && SBSC->Position;
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::RGSRCClick(TObject *Sender)
{
if( m_DisEvent ) return;
if( !RGSRC->ItemIndex ){
if( m_Item.m_sperspect.flag & 0x0000ffff ) m_Item.CopyFromHistory();
}
else if( !(m_Item.m_sperspect.flag & 0x0000ffff) ){
if( m_pItem->m_pBitmap != NULL ){
m_Item.CopySource(m_pItem->m_pBitmap);
m_Loaded = 0;
}
else {
m_Loaded = 1;
}
}
UpdateWaveBtn(1);
m_Item.m_sperspect.flag = RGSRC->ItemIndex | (m_Wave << 16);
UpdateBitmap();
// PBoxPaint(NULL);
PBox->Invalidate();
UpdateBtn();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::PBoxMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( m_pBitmap == NULL ) return;
m_SCX = double(m_pBitmap->Width) / double(PBox->Width);
m_SCY = double(m_pBitmap->Height) / double(PBox->Height);
X = X * m_SCX;
Y = Y * m_SCY;
m_XC = m_pBitmap->Width / 2;
m_YC = m_pBitmap->Height / 2;
int x = X - m_XC;
int y = m_YC - Y;
if( x || y ){
m_Deg = atan2(y, x);
}
else {
m_Deg = 0;
}
m_Dist = sqrt(x * x + y * y);
m_SDeg = TBR->Position;
m_SDistX = TBAX->Position;
m_SDistY = TBAY->Position;
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::PBoxMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if( m_XC > 0 ){
X = X * m_SCX;
Y = Y * m_SCY;
int x = X - m_XC;
int y = m_YC - Y;
double Deg;
if( x || y ){
Deg = atan2(y, x);
}
else {
Deg = 0;
}
Deg = (m_Deg - Deg) * 180.0 / PI;
Deg += m_SDeg;
if( Deg < -180 ) Deg += 360.0;
if( Deg > 180 ) Deg -= 360.0;
TBR->Position = SHORT(Deg);
double Dist = sqrt(x * x + y * y);
Dist = (Dist - m_Dist)/2;
int d = Dist + m_SDistX;
if( d > 201 ) d = 201;
if( d < 2 ) d = 2;
TBAX->Position = d;
d = Dist + m_SDistY;
if( d > 201 ) d = 201;
if( d < 2 ) d = 2;
TBAY->Position = d;
UpdateItem();
}
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::PBoxMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
m_XC = -1;
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::LoadBtnClick(TObject *Sender)
{
if( sys.m_fLoadImageMenu ){
NoTopMost();
CWaitCursor w;
HBITMAP hb = sys.m_fLoadImageMenu(1, 16, 16);
if( hb != NULL ){
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
pBitmap->Handle = hb;
m_Item.CopySource(pBitmap);
m_Loaded = 1;
UpdateBitmap();
PBox->Invalidate();
delete pBitmap;
}
TopMost();
}
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::PasteBtnClick(TObject *Sender)
{
NoTopMost();
TClipboard *pCB = Clipboard();
if (pCB->HasFormat(CF_BITMAP)){
CWaitCursor w;
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
try
{
pBitmap->LoadFromClipboardFormat(CF_BITMAP, pCB->GetAsHandle(CF_BITMAP), 0);
m_Item.CopySource(pBitmap);
m_Loaded = 1;
UpdateBitmap();
PBox->Invalidate();
}
catch(...){
ASSERT(0);
}
delete pBitmap;
}
TopMost();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::TopMost(void)
{
#if UseHWND
::SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
#endif
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::NoTopMost(void)
{
#if UseHWND
::SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
#endif
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::FormActivate(TObject *Sender)
{
TopMost();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::FormDeactivate(TObject *Sender)
{
NoTopMost();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::ViewBtnClick(TObject *Sender)
{
if( sys.m_fView && (m_Item.m_pBitmap != NULL) ){
NoTopMost();
sys.m_fView(m_Item.m_pBitmap->Handle);
TopMost();
}
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::SBRClick(TObject *Sender)
{
m_DisEvent++;
SBSC->Position = 0;
m_DisEvent--;
UpdateItem();
UpdateBtn();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::SBClick(TObject *Sender)
{
UpdateWaveBtn(1);
m_Item.m_sperspect.flag = RGSRC->ItemIndex | (m_Wave << 16);
UpdateBitmap();
PBoxPaint(NULL);
UpdateBtn();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::CBFChange(TObject *Sender)
{
if( m_DisEvent ) return;
UpdateItem();
UpdateBtn();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::PCClick(TObject *Sender)
{
ColorDialog->Color = PC->Color;
if( ColorDialog->Execute() == TRUE ){
PC->Color = ColorDialog->Color;
CBFChange(NULL);
}
}
//---------------------------------------------------------------------------
static void __fastcall UpdateDefTB(TTrackBar *pBar, int f, int def, int &dir)
{
if( f ){
pBar->Position = pBar->Position + (pBar->PageSize * dir);
if( pBar->Position == pBar->Max ){
dir = -1;
}
else if( pBar->Position == pBar->Min ){
dir = 1;
}
}
else {
pBar->Position = def;
}
pBar->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::LDefMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( (Button != mbLeft) && (Button != mbRight) ) return;
BOOL f = (Button != mbLeft);
TLabel *_tt[]={L7, L8, L9, L6, L5, L4, L1, L2, L3, L10};
int i;
for( i = 0; i < AN(_tt); i++ ){
if( _tt[i] == (TLabel *)Sender ) break;
}
m_DisEvent++;
switch(i){
case 0:
UpdateDefTB(TBS, f, 23, m_DirTB[0]);
break;
case 1:
UpdateDefTB(TBAX, f, 60, m_DirTB[1]);
break;
case 2:
UpdateDefTB(TBAY, f, 60, m_DirTB[2]);
break;
case 3:
UpdateDefTB(TBPX, f, 0, m_DirTB[3]);
break;
case 4:
UpdateDefTB(TBPY, f, 0, m_DirTB[4]);
break;
case 5:
UpdateDefTB(TBPZ, f, 0, m_DirTB[5]);
break;
case 6:
UpdateDefTB(TBRX, f, 0, m_DirTB[6]);
break;
case 7:
UpdateDefTB(TBRY, f, 0, m_DirTB[7]);
break;
case 8:
UpdateDefTB(TBRZ, f, -180, m_DirTB[8]);
break;
case 9:
UpdateDefTB(TBR, f, 0, m_DirTB[9]);
break;
}
m_DisEvent--;
UpdateItem();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::UpdateTB(void)
{
m_SBar[0] = TBS->Position;
m_SBar[1] = TBAX->Position;
m_SBar[2] = TBAY->Position;
m_SBar[3] = TBPX->Position;
m_SBar[4] = TBPY->Position;
m_SBar[5] = TBPZ->Position;
m_SBar[6] = TBRX->Position;
m_SBar[7] = TBRY->Position;
m_SBar[8] = TBRZ->Position;
m_SBar[9] = TBR->Position;
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::UpdateItem(void)
{
if( m_DisEvent ) return;
UpdateBitmap();
PBoxPaint(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::TBSChange(TObject *Sender)
{
if( m_DisEvent ) return;
TTrackBar *_tt[]={TBS, TBAX, TBAY, TBPX, TBPY, TBPZ, TBRX, TBRY, TBRZ, TBR};
TTrackBar *pBar = (TTrackBar *)Sender;
int i;
for( i = 0; i < AN(_tt); i++ ){
if( _tt[i] == pBar ) break;
}
if( m_SBar[i] != pBar->Position ){
m_SBar[i] = pBar->Position;
UpdateItem();
}
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::SBSCChange(TObject *Sender)
{
UpdateItem();
UpdateBtn();
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::OnDrawClipboard(TMessage Message)
{
PasteBtn->Enabled = RGSRC->ItemIndex && ::IsClipboardFormatAvailable(CF_BITMAP);
if( m_hClipNext ) ::SendMessage(m_hClipNext, WM_DRAWCLIPBOARD, Message.WParam, Message.LParam);
}
//---------------------------------------------------------------------------
void __fastcall TPerDlgBox::OnChangeCbChain(TMessage Message)
{
if( (HWND)Message.WParam == m_hClipNext ){
m_hClipNext = (HWND)Message.LParam;
}
if( m_hClipNext ) ::SendMessage(m_hClipNext, WM_CHANGECBCHAIN, Message.WParam, Message.LParam);
Message.Result = 0;
}
//---------------------------------------------------------------------------