通过应用Windows的消息传递机制,在应用程序中模拟Micaps系统的人工操作,以实现文件的检索、图像的显隐、缩放甚至勾画等值线、标天气符号、显示指定站点的时序图、TlogP图等交互工作,使得Micaps的二次开发产品及预报工具能够与Micaps系统本身更加紧密结合,更有效地发挥Micaps的预报操作平台功能。
CMicaps.cpp
0001 //***************************************************************************
0002 // 功能:与Micaps系统的交互访问
0003 // 文件名:CMicaps.cpp
0004 // 头文件:CMicaps.h
0005 // 相关文件:SMicaps.hpp
0006 // FStrings.p - 字符串处理
0007 // SFloatPoint.hpp - Point类的浮点版
0008 // CCoordinate.h - 地图坐标处理
0009 // CDiamond19.h - Micaps 初始化参数文件
0010 // 编写者:刘泽军
0011 // 开始日期:2001-08-04
0012 // 更新日期:2002-05-04
0013 // 备注:
0014 //***************************************************************************
0015
0016 //===========================================================================
0017 // 程序名:CMicaps.cpp
0018 // 功能:
0019 //程序设计:广西壮族自治区柳州地区气象台 刘泽军
0020 // EMail:BJ0773@gmail.com
0021 //===========================================================================
0022 // 本文件:CMicaps.cpp
0023 // 头文件:CMicaps.h
0024 // SMicaps.hpp
0025 //开发平台:Microsoft Windows 2000 + Borland C++Builder 5.0
0026 //辅助工具:Microsoft Spy++ 6.0, Borland WorkShop 4.5
0027 //相关文章:《应用程序与Micaps系统的交互访问》 2001-10-19已投给《气象》,未获录用。
0028 //开始日期:2001-08-04
0029 //更新日期:2001-11-26
0030 //===========================================================================
0031 //开发历程:
0032 // 2001-08-04 启动、关闭Micaps
0033 // 2001-08-05 访问Micaps菜单项 - 打开
0034 // 2001-08-07 访问显示设置窗口
0035 // 2001-08-08 访问图形检索窗口、其它的Micaps菜单项
0036 // 2001-08-27 在Micaps主窗口 显示 工具窗口 指定的符号(Lambert投影下)
0037 // 2001-09-06 打开多个文件
0038 // 2001-09-17 完善Micaps菜单访问(因键盘方式访问Micaps菜单在Win98不正常)
0039 // WM_SYSCOMMAND+SC_KEYMENU => WM_COMMAND+MenuID
0040 // 2001-10-13 在Lambert投影方式下的 经纬度 => Micaps主窗口坐标
0041 // 2001-10-15 完成《应用程序与Micaps系统的交互访问》
0042 // 2001-11-12 相互独立的函数 => CMicaps 类
0043 // 2001-11-22 根据预定义的操作记录文件来控制Micaps
0044 //===========================================================================
0045 #include <vcl.h>
0046 #include <clipbrd.hpp>
0047 #pragma hdrstop
0048
0049 #include "CMicaps.h"
0050 //---------------------------------------------------------------------------
0051 #include <FileCtrl.hpp>
0052 #include "../Common/CDiamondList.h"
0053 //---------------------------------------------------------------------------
0054 #pragma package ( smart_init )
0055 //---------------------------------------------------------------------------
0056 CMicaps::~CMicaps ( void )
0057 //功能:析构函数
0058 {
0059 // if( FOwnerExecute )//若Micaps是由应用程序本身运行则关闭Micaps。
0060 // Close();
0061 }
0062 //---------------------------------------------------------------------------
0063 CMicaps::CMicaps ( void )
0064 //功能:结构函数
0065 {
0066 FOwnerExecute = false ;
0067 Enabled = Setup ( "C://Micaps" ) ;
0068 if ( Enabled )
0069 SetMicapsParameter ( FMicapsParameter ) ;
0070 FCurrentOpenFileName = "" ;
0071 }
0072 //---------------------------------------------------------------------------
0073 CMicaps::CMicaps ( AnsiString FMicapsPath )
0074 //功能:结构函数
0075 //参数:
0076 //FMicapsPath - Micaps的安装目录(如:C:/Micaps)
0077 {
0078 FOwnerExecute = false ;
0079 Enabled = Setup ( FMicapsPath ) ;
0080 if ( Enabled )
0081 SetMicapsParameter ( FMicapsParameter ) ;
0082 FCurrentOpenFileName = "" ;
0083 }
0084 //---------------------------------------------------------------------------
0085 CMicaps::CMicaps ( AnsiString FMicapsPath, AnsiString FMicapsParam )
0086 //功能:结构函数
0087 //参数:
0088 //FMicapsPath - Micaps的安装目录(如:C:/Micaps)
0089 //FMicapsParam - 运行Micaps的参数文件(diamond 19)
0090 {
0091 FOwnerExecute = false ;
0092 Enabled = Setup ( FMicapsPath ) ;
0093 if ( Enabled && FileExists ( FMicapsParam ) )
0094 {
0095 FMicapsParameter = FMicapsParam;
0096 SetMicapsParameter ( FMicapsParameter ) ;
0097 }
0098 }
0099 //---------------------------------------------------------------------------
0100 HWND CMicaps::FindMicapsWindow ( void )
0101 //功能:查找Micaps主窗口
0102 {
0103 return ( FindWindow ( "MainClass" , "气象信息综合分析处理系统(MICAPS)" )) ;
0104 }
0105 //---------------------------------------------------------------------------
0106 bool CMicaps::Setup ( AnsiString FMicapsPath )
0107 //功能:设置本机的Micaps安装目录
0108 //参数:
0109 //FMicapsPath - 本机的Micaps安装目录 缺省为 C:/Micaps
0110 {
0111 bool FEnabled = false ;
0112 FCoordinateEnabled = false ;
0113 FMicapsDirectory = FMicapsPath.Trim () ;
0114 if ( FMicapsDirectory [ FMicapsDirectory.Length ()] != '//' )
0115 FMicapsDirectory = FMicapsDirectory + "//" ;
0116 FMicapsExecuteFile = FMicapsDirectory + "Code//Micaps.exe" ;
0117 FMicapsParameter = FMicapsDirectory + "Code//Para1.dat" ;
0118 if ( !FileExists ( FMicapsExecuteFile ) )
0119 {
0120 if ( SelectDirectory ( "请选择 Micaps 的安装目录!(例如:C://Micaps)" , "我的电脑" ,FMicapsDirectory ) )
0121 FEnabled = Setup ( FMicapsDirectory ) ;
0122 else
0123 FEnabled = false ;
0124 }
0125 else
0126 FEnabled = true ;
0127 return ( FEnabled ) ;
0128 }
0129 //---------------------------------------------------------------------------
0130 AnsiString CMicaps::GetMicapsDirectory ( void )
0131 //功能:返回Micaps安装目录
0132 {
0133 return ( FMicapsDirectory ) ;
0134 }
0135 //---------------------------------------------------------------------------
0136 AnsiString CMicaps::GetMicapsParameter ( void )
0137 //功能:返回Micaps启动参数
0138 {
0139 return ( FMicapsParameter ) ;
0140 }
0141 //---------------------------------------------------------------------------
0142 bool CMicaps::SetMicapsParameter ( AnsiString FMicapsParam )
0143 //功能:设置Micaps启动参数
0144 {
0145 bool FMessage = false ;
0146 FParameterCorrect = false ;
0147
0148 if ( FileExists ( FMicapsParam ) )
0149 {
0150 FMicapsParameter = FMicapsParam;
0151 CDiamond19 *d19 = new CDiamond19 ( FMicapsParam ) ;
0152 FParameterCorrect = d19->Enabled;
0153 if ( d19->Enabled )
0154 {
0155 FStartData = d19->GetStartData () ;
0156 RECT lpRect;
0157 if ( IsMicapsRunning () )
0158 MicapsClientRect ( &lpRect ) ;
0159 else
0160 lpRect = Rect ( 0 , 0 ,Screen->Width - 8 ,Screen->Height - 46 ) ;
0161 FCoordinate = new CCoordinate (
0162 1 , //Lambert
0163 d19->GetCenterLongitudeLatitude () , //TFloatPoint(100,35),
0164 TFloatPoint ( lpRect.right/ 2 ,lpRect.bottom/ 2 + 2 ) ,
0165 d19->GetZoom () ) ; //缩放系数
0166 FCoordinateEnabled = true ;
0167 FMessage == true ;
0168 }
0169 delete d19;
0170 }
0171 return ( FMessage ) ;
0172 }
0173 //---------------------------------------------------------------------------
0174 bool CMicaps::IsMicapsRunning ( void )
0175 //功能:判断Micaps是否运行
0176 {
0177 return ( FindMicapsWindow () != NULL ) ;
0178 }
0179 //---------------------------------------------------------------------------
0180 bool CMicaps::MenuFromId ( int FMicapsMenuId )
0181 //功能:执行ID号为FMicapsMenuId的Micaps菜单
0182 //参数:
0183 //FMicapsMenuId - 指定的Micaps菜单ID号
0184 {
0185 HWND hWndMicaps = FindMicapsWindow () ;
0186 bool FMessage = false ;
0187 if ( hWndMicaps != NULL )
0188 {
0189 FMessage = PostMessage ( hWndMicaps,WM_COMMAND,MAKELONG ( FMicapsMenuId, 0 ) ,NULL ) ;
0190 // FMessage = SendMessage(hWndMicaps,WM_COMMAND,MAKELONG(FMicapsMenuId,0),NULL);
0191 Sleep ( 132 ) ;
0192 }
0193 return ( FMessage ) ;
0194 }
0195 //---------------------------------------------------------------------------
0196 bool CMicaps::Execute ( bool FExecuteType ) //private member function
0197 //功能:运行Micaps
0198 //参数:
0199 //FExecuteType: 运行方式
0200 // true 强制运行并返回运行结果
0201 // false 若Micaps已运行则返回true,否则返回运行结果
0202 {
0203 if ( FExecuteType ) //强制运行方式
0204 {
0205 Close () ;
0206 Sleep ( 1032 ) ;
0207 }
0208 bool FMessage = IsMicapsRunning () ;
0209 if ( !FMessage ) //Micaps未运行
0210 {
0211 FMessage = ( int ) ShellExecute (
0212 Application->Handle,
0213 "open" ,
0214 FMicapsExecuteFile.c_str () ,
0215 FMicapsParameter.c_str () ,
0216 ExtractFilePath ( FMicapsExecuteFile ) .c_str () ,
0217 SW_SHOWNORMAL )
0218 > 32 ;
0219 FOwnerExecute = true ;
0220 SetMicapsParameter ( FMicapsParameter ) ;
0221 }
0222 else
0223 {
0224 HWND hWndMicaps = FindMicapsWindow () ;
0225 if ( hWndMicaps != NULL )
0226 {
0227 ShowWindow ( hWndMicaps,SW_SHOWNORMAL ) ; //显示Micaps主窗口
0228 SetForegroundWindow ( hWndMicaps ) ; //设置Micaps为当前活动窗口
0229 }
0230 }
0231 return ( FMessage ) ;
0232 }
0233 //---------------------------------------------------------------------------
0234 bool CMicaps::Execute ( void )
0235 //功能:运行Micaps(非强制方式)
0236 {
0237 return ( Execute ( false ) ) ; //非强制方式运行Micaps
0238 }
0239 //---------------------------------------------------------------------------
0240 bool CMicaps::Execute ( AnsiString FMicapsParam )
0241 //功能:带参数运行Micaps(非强制方式)
0242 //参数:
0243 //FMicapsParam - 指向一个文件名(diamond 19),该文件包含Micaps的启动设置
0244 {
0245 if ( !IsMicapsRunning () && FileExists ( FMicapsParam.Trim ()) )
0246 FMicapsParameter = FMicapsParam.Trim () ;
0247 return ( Execute ( false ) ) ;
0248 }
0249 //---------------------------------------------------------------------------
0250 bool CMicaps::ForceExecute ( void )
0251 //功能:运行Micaps(强制方式)
0252 {
0253 return ( Execute ( true ) ) ; //非运行Micaps
0254 }
0255 //---------------------------------------------------------------------------
0256 bool CMicaps::ForceExecute ( AnsiString FMicapsParam )
0257 //功能:带参数运行Micaps(强制方式)
0258 //参数:
0259 //FMicapsParam - 指向一个文件名(diamond 19),该文件包含Micaps的启动设置
0260 {
0261 if ( FileExists ( FMicapsParam.Trim ()) )
0262 FMicapsParameter = FMicapsParam.Trim () ;
0263 return ( Execute ( true ) ) ;
0264 }
0265 //---------------------------------------------------------------------------
0266 bool CMicaps::Close ( void ) //关闭 Micaps
0267 {
0268 bool FMessage = false ;
0269 try {
0270 HWND hWndMicaps = FindMicapsWindow () ;
0271 if ( hWndMicaps != NULL )
0272 {
0273 FMessage = PostMessage ( hWndMicaps, WM_CLOSE, 0 , 0 ) ;
0274 HWND hWndMicapsClose = NULL;
0275 int iSleepCount = 0 ;
0276 while ( hWndMicapsClose == NULL && iSleepCount < 12 )
0277 {
0278 Sleep ( 132 ) ; //延时
0279 hWndMicapsClose = FindWindow ( "#32770" , "退出Micaps" ) ;
0280 iSleepCount ++;
0281 }
0282 if ( ( FParameterCorrect && FStartData.WindowClose == 1 )
0283 || hWndMicapsClose != NULL )
0284 {
0285 SendDlgItemMessage (
0286 hWndMicapsClose, MICAPS_DLG_CLOSE_OKBUTTON, BM_CLICK, 0 , 0 ) ;
0287 FMessage = true ;
0288 }
0289 FOwnerExecute = false ;
0290 }
0291 return ( FMessage ) ;
0292 }
0293 catch ( ... )
0294 {
0295 return ( FMessage ) ;
0296 }
0297 }
0298 //---------------------------------------------------------------------------
0299 bool CMicaps::OpenFile ( AnsiString FOpenFileName )
0300 //功能:打开文件
0301 //参数:
0302 //FOpenFileName - 要打开的文件名
0303 {
0304 bool FMessage = false ;
0305 try {
0306 if ( FOpenFileName.Pos ( "*" ) || FOpenFileName.Pos ( "?" ) )
0307 FOpenFileName = SearchFile ( FOpenFileName,FSM_NEW ) ; //搜索最新文件
0308 if ( !FileExists ( FOpenFileName ) || !IsMicapsRunning () )
0309 return ( FMessage ) ; //指定文件不存在 或 Micaps未运行
0310 HWND hWndMicaps = FindMicapsWindow () ;
0311 int iSleepCount = 0 ;
0312 HWND hWndMicapsOpenFile = NULL;
0313 if ( hWndMicaps != NULL
0314 // && ShowWindow(hWndMicaps,SW_SHOWNORMAL)//显示Micaps主窗口
0315 // && SetForegroundWindow(hWndMicaps) //设置Micaps为当前活动窗口
0316 )
0317 {
0318 MenuFromId ( MICAPS_MENU_FILE ) ;
0319 while ( hWndMicapsOpenFile == NULL && iSleepCount < 12 )
0320 { //找 打开新文件 窗口
0321 Sleep ( 512 ) ;
0322 hWndMicapsOpenFile = FindWindow ( "#32770" , "打开新文件" ) ;
0323 iSleepCount++;
0324 }
0325 if ( hWndMicapsOpenFile!=NULL ) // && GetParent(hWndMicapsOpenFile) == hWndMicaps )
0326 {
0327 //清除 文件编辑框 文本
0328 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_EDITCTRL, WM_CLEAR, 0 , 0 ) ;
0329 FCurrentOpenFileName = FOpenFileName;
0330 //将文件名放入剪切板
0331 Clipboard () ->SetTextBuf ( FOpenFileName.c_str ()) ;
0332 //从剪切板粘贴文本
0333 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_EDITCTRL, WM_PASTE, 0 , 0 ) ;
0334 // Application->MainForm->Caption = FOpenFileName;
0335
0336 //按 打开新文件 窗口的 确定 按钮
0337 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_OKBUTTON, BM_CLICK, 0 , 0 ) ;
0338 FMessage = true ;
0339 }
0340 //判断 打开新文件 窗口是否仍未关闭
0341 iSleepCount = 0 ;
0342 hWndMicapsOpenFile = NULL;
0343 while ( hWndMicapsOpenFile == NULL && iSleepCount < 6 )
0344 { //找 打开新文件 窗口
0345 Sleep ( 132 ) ;
0346 hWndMicapsOpenFile = FindWindow ( "#32770" , "打开新文件" ) ;
0347 iSleepCount++;
0348 }
0349 if ( hWndMicapsOpenFile != NULL )
0350 { //按 打开新文件 窗口的 取消 按钮
0351 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_CANCELBUTTON, BM_CLICK, 0 , 0 ) ;
0352 FMessage = true ;
0353 }
0354 }
0355 return ( FMessage ) ;
0356 }
0357 catch ( ... )
0358 {
0359 return ( FMessage ) ;
0360 }
0361 }
0362 //---------------------------------------------------------------------------
0363 bool CMicaps::OpenFiles ( AnsiString FFiles )
0364 //功能:打开多个文件
0365 //参数:
0366 //FFiles - 包括多个指定要打开的文件名,以 ; 或 | 号分隔
0367 {
0368 return ( OpenFiles ( FFiles, ";" , "|" ) ) ;
0369 }
0370 //---------------------------------------------------------------------------
0371 bool CMicaps::OpenFiles ( AnsiString FFiles, AnsiString FAndStr, AnsiString FOrStr )
0372 //功能:在Micaps中打开多个文件
0373 //参数:
0374 //FFiles - 包括多个指定要打开的文件名,以 FAdnStr 或 ForStr 指定的符号分隔
0375 //FAndStr - 表示 和 的符号
0376 //FOrStr - 表示 或 的符号
0377 {
0378 //缺省 FAndStr - ;
0379 //缺省 FOrStr - |
0380 //间隔号(;) - 所有文件均打开
0381 //例: a,b,c 打开文件a及b及c
0382 //间隔号(|) - 打开第一个存在的文件
0383 //例: a|b|c 若a存在则打开a并返回,否则若b存在则打开b并返回...
0384 TStringList *StringList = new TStringList () ;
0385 TStringList *ChildStringList = new TStringList () ;
0386 ExtractString ( FFiles,FAndStr,false,StringList ) ;
0387
0388 //2002-01-30
0389 // 修改 CMicaps 类中有关 Micaps 文件的打开方式,根据记录文件 Code/File.lst,
0390 // 当需要打开的文件已被 Micaps 打开时,程序只是将该文件设为“显示”状态,而不是
0391 // 重新打开,否则将打开该文件;其他不需要显示的文件则从“显示设置”窗口中删除掉。
0392 for ( int i= 0 ;i<StringList->Count;i++ )
0393 {
0394 if ( StringList->Strings [ i ] .Pos ( FOrStr ) > 0 )
0395 {
0396 ExtractString ( StringList->Strings [ i ] ,FOrStr,false,ChildStringList ) ;
0397 for ( int j= 0 ;j<ChildStringList->Count;j++ )
0398 if ( ChildStringList->Strings [ j ] .Pos ( "*" )
0399 || ChildStringList->Strings [ j ] .Pos ( "?" ) )
0400 ChildStringList->Strings [ j ] =
0401 SearchFile ( ChildStringList->Strings [ j ] ,FSM_NEW ) ; //搜索最新文件
0402 for ( int j= 0 ;j<ChildStringList->Count;j++ )
0403 if ( FileExists ( ChildStringList->Strings [ j ]) )
0404 {
0405 StringList->Strings [ i ] = ChildStringList->Strings [ j ] ;
0406 j = ChildStringList->Count;
0407 }
0408 }
0409 else if ( StringList->Strings [ i ] .Pos ( "*" )
0410 || StringList->Strings [ i ] .Pos ( "?" ) )
0411 {
0412 StringList->Strings [ i ] =
0413 SearchFile ( StringList->Strings [ i ] ,FSM_NEW ) ; //搜索最新文件
0414 }
0415 }
0416 for ( int i=StringList->Count- 1 ;i>= 0 ;i-- )
0417 if ( StringList->Strings [ i ] .Trim () == ""
0418 || !FileExists ( StringList->Strings [ i ] .Trim ()) )
0419 StringList->Delete ( i ) ;
0420 TMicapsOpenFileList *mofl = new TMicapsOpenFileList (
0421 GetMicapsDirectory () + "Code//File.LST" ) ;
0422 if ( mofl->Enabled )
0423 {
0424 bool *bFile = new bool [ mofl->GetCount () + 1 ] ;
0425 mofl->CurrentOpened ( StringList,bFile ) ;
0426 for ( int i= 0 ;i<mofl->GetCount () ;i++ )
0427 bFile [ i ] = !bFile [ i ] ;
0428 Status ( bFile,mofl->GetCount () ,MICAPS_FILE_STATUS_MOVE ) ; //让Micaps删除所有不需要打开的文件
0429 Status ( - 1 ,MICAPS_FILE_STATUS_VIEW ) ; //让Micaps显示所有已打开的文件
0430 delete bFile;
0431 }
0432 else
0433 Status ( - 1 ,MICAPS_FILE_STATUS_MOVE ) ; //让Micaps删除所有已打开的文件
0434 delete mofl;
0435
0436 //打开文件
0437 for ( int i= 0 ;i<StringList->Count;i++ )
0438 if ( StringList->Strings [ i ] .Trim () != "" )
0439 OpenFile ( StringList->Strings [ i ] .Trim ()) ;
0440
0441 delete ChildStringList;
0442 delete StringList;
0443 return ( true ) ;
0444 }
0445 //---------------------------------------------------------------------------
0446 bool CMicaps::SaveToFile ( AnsiString FSaveFileName )
0447 //功能:保存文件
0448 //参数:
0449 //FSaveFileName - 要保存的文件名
0450 {
0451 bool FMessage = false ;
0452 if ( !IsMicapsRunning () ) return ( false ) ;
0453 AnsiString TempFSaveFileName = "C://TempSave.LZJ" ;
0454 try {
0455 if ( FileExists ( TempFSaveFileName ) )
0456 DeleteFile ( TempFSaveFileName.c_str ()) ;
0457 HWND hWndMicaps = FindMicapsWindow () ;
0458 if ( hWndMicaps == NULL ) return ( false ) ;
0459 FMessage = Explore ( 3 ) ;
0460 if ( !FMessage ) return ( FMessage ) ;
0461 int iSleepCount = 0 ;
0462 HWND hWndMicapsSaveFile = NULL;
0463 while ( hWndMicapsSaveFile == NULL && iSleepCount < 12 )
0464 {
0465 Sleep ( 132 ) ;
0466 hWndMicapsSaveFile = FindWindow ( "#32770" , "保存文件" ) ;
0467 iSleepCount++;
0468 }
0469 if ( hWndMicapsSaveFile != NULL
0470 && GetParent ( hWndMicapsSaveFile ) == FindWindow ( "OperateClass" , "工具" ) )
0471 {
0472 Clipboard () ->SetTextBuf ( TempFSaveFileName.c_str ()) ;
0473 SendDlgItemMessage (
0474 hWndMicapsSaveFile,
0475 MICAPS_DLG_SAVE_EDITCTRL,
0476 WM_CLEAR,
0477 0 , 0 ) ;
0478 SendDlgItemMessage (
0479 hWndMicapsSaveFile,
0480 MICAPS_DLG_SAVE_EDITCTRL,
0481 WM_PASTE,
0482 0 , 0 ) ;
0483 SendDlgItemMessage (
0484 hWndMicapsSaveFile,
0485 MICAPS_DLG_SAVE_OKBUTTON,
0486 BM_CLICK,
0487 0 , 0 ) ;
0488 FMessage = true ;
0489 }
0490 if ( FileExists ( TempFSaveFileName ) )
0491 {
0492 FMessage = CopyFile (
0493 TempFSaveFileName.c_str () ,
0494 FSaveFileName.c_str () ,
0495 false ) ;
0496 DeleteFile ( TempFSaveFileName.c_str ()) ;
0497 }
0498 else
0499 FMessage = false ;
0500 return ( FMessage ) ;
0501 }
0502 catch ( ... )
0503 {
0504 return ( FMessage ) ;
0505 }
0506 }
0507 //---------------------------------------------------------------------------
0508 bool CMicaps::Status ( int FFileIndex, int FFileStatus )
0509 //功能:设置Micaps文件状态
0510 //参数:
0511 //FFileIndex - 文件序号 -2, -1, 0, 1, 2 ... -2 为所有项 -1 为除0项外
0512 //FFileStatus - 状态 {MICAPS_FILE_STATUS_VIEW,MICAPS_FILE_STATUS_HIDE, MICAPS_FILE_STATUS_MODIFY, MICAPS_FILE_STATUS_EDIT, MICAPS_FILE_STATUS_MOVE}
0513 {
0514 if ( FFileIndex < - 2 ) FFileIndex == - 2 ;
0515 bool FMessage = false ;
0516 try {
0517 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0518 HWND hWndMicaps = FindMicapsWindow () ;
0519 if ( hWndMicaps == NULL ) return ( FMessage ) ; //无法定位Micaps窗口
0520 DialogOption ( true ) ;
0521 HWND hWndMicapsFileStatus = NULL; //Micaps的显示设置对话框
0522 int iSleepCount = 0 ;
0523 if ( hWndMicaps != NULL
0524 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0525 && SetForegroundWindow ( hWndMicaps )
0526 )
0527 {
0528 iSleepCount = 0 ;
0529 while ( hWndMicapsFileStatus == NULL && iSleepCount < 12 )
0530 {
0531 Sleep ( 132 ) ;
0532 hWndMicapsFileStatus = FindWindow ( "#32770" , "显示设置" ) ;
0533 iSleepCount++;
0534 }
0535 int FItemCount = 0 ;
0536 if ( hWndMicapsFileStatus!=NULL
0537 && ShowWindow ( hWndMicapsFileStatus,SW_SHOWNORMAL ) //显示Micaps主窗口
0538 && SetForegroundWindow ( hWndMicapsFileStatus ) //设置Micaps为当前活动窗口
0539 && GetDlgItem ( hWndMicapsFileStatus, FFileStatus ) != NULL //有状态按钮
0540 && ( FItemCount = SendDlgItemMessage (
0541 hWndMicapsFileStatus,
0542 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0543 LB_GETCOUNT, 0 , 0 )) > 0
0544 )
0545 {
0546 SendDlgItemMessage ( //不选所有项
0547 hWndMicapsFileStatus,
0548 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0549 LB_SELITEMRANGE,
0550 false,
0551 MAKELONG ( 0 ,FItemCount- 1 )) ;
0552 switch ( FFileIndex )
0553 {
0554 case - 2 : //设置所有项
0555 SendDlgItemMessage (
0556 hWndMicapsFileStatus,
0557 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0558 LB_SELITEMRANGE,
0559 true,
0560 MAKELONG ( 0 ,FItemCount- 1 )) ;
0561 break ;
0562 case - 1 : //设置非0项
0563 if ( FItemCount > 1 )
0564 SendDlgItemMessage ( //选定项目
0565 hWndMicapsFileStatus,
0566 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0567 LB_SELITEMRANGE,
0568 true,
0569 MAKELONG ( 1 ,FItemCount- 1 )) ;
0570 break ;
0571 default :
0572 if ( FFileIndex < FItemCount ) //设置指定项
0573 SendDlgItemMessage (
0574 hWndMicapsFileStatus,
0575 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0576 LB_SETSEL,
0577 true,
0578 FFileIndex ) ;
0579 break ;
0580 } //siwtch
0581 if ( SendDlgItemMessage ( //已选择有项目
0582 hWndMicapsFileStatus,
0583 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0584 LB_GETSELCOUNT,
0585 0 ,
0586 0 ) > 0 )
0587 { //单击 显示设置 窗口的指定按钮
0588 SendDlgItemMessage (
0589 hWndMicapsFileStatus,
0590 FFileStatus,
0591 BM_CLICK,
0592 0 ,
0593 0 ) ;
0594 FMessage = true ;
0595 }
0596 } //if hWndMicapsFileStatus!=NULL
0597 } //if hWndMicaps != NULL
0598 return ( FMessage ) ;
0599 }
0600 catch ( ... )
0601 {
0602 return ( FMessage ) ;
0603 }
0604 }
0605 //---------------------------------------------------------------------------
0606 bool CMicaps::Status ( int FFileFirst, int FFileLast, int FFileStatus )
0607 //功能:设置Micaps文件状态
0608 //参数:
0609 //FFileFirst - 始文件序号
0610 //FFileLast - 止文件序号
0611 //FFileStatus - 状态 {MICAPS_FILE_STATUS_VIEW,MICAPS_FILE_STATUS_HIDE, MICAPS_FILE_STATUS_MODIFY, MICAPS_FILE_STATUS_EDIT, MICAPS_FILE_STATUS_MOVE}
0612 // 若 FFileFirst < 0 或 FFileLast < 0 则仅设置状态
0613 {
0614 bool FMessage = false ;
0615 try {
0616 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0617 HWND hWndMicaps = FindMicapsWindow () ;
0618 if ( hWndMicaps == NULL ) return ( FMessage ) ; //无法定位Micaps窗口
0619 DialogOption ( true ) ;
0620 HWND hWndMicapsFileStatus = NULL; //Micaps的显示设置对话框
0621 int iSleepCount = 0 ;
0622 if ( hWndMicaps != NULL
0623 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0624 && SetForegroundWindow ( hWndMicaps )
0625 )
0626 {
0627 iSleepCount = 0 ;
0628 while ( hWndMicapsFileStatus == NULL && iSleepCount < 12 )
0629 {
0630 Sleep ( 132 ) ;
0631 hWndMicapsFileStatus = FindWindow ( "#32770" , "显示设置" ) ;
0632 iSleepCount++;
0633 }
0634 int FItemCount = 0 ;
0635 if ( hWndMicapsFileStatus!=NULL
0636 && ShowWindow ( hWndMicapsFileStatus,SW_SHOWNORMAL ) //显示Micaps主窗口
0637 && SetForegroundWindow ( hWndMicapsFileStatus ) //设置Micaps为当前活动窗口
0638 && GetDlgItem ( hWndMicapsFileStatus, FFileStatus ) != NULL //有状态按钮
0639 && ( FItemCount = SendDlgItemMessage (
0640 hWndMicapsFileStatus,
0641 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0642 LB_GETCOUNT, 0 , 0 )) > 0
0643 )
0644 {
0645 if ( FFileFirst < 0 || FFileLast < 0 )
0646 { //仅设置文件状态
0647 if ( SendDlgItemMessage (
0648 hWndMicapsFileStatus,
0649 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0650 LB_GETSELCOUNT,
0651 0 ,
0652 0 ) > 0 ) //已选择有项目
0653 {
0654 SendDlgItemMessage (
0655 hWndMicapsFileStatus,
0656 FFileStatus,
0657 BM_CLICK,
0658 0 ,
0659 0 ) ;
0660 FMessage = true ;
0661 }
0662 } //if 0 0
0663 else if ( FFileFirst == 9999 && FFileLast == 9999 ) //所有项均不选
0664 {
0665 SendDlgItemMessage (
0666 hWndMicapsFileStatus,
0667 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0668 LB_SELITEMRANGE,
0669 false,
0670 MAKELONG ( 0 ,FItemCount- 1 )) ;
0671 } //else if 9999 9999
0672 else
0673 { //选择项目
0674 if ( FFileFirst > FItemCount - 1 )
0675 FFileFirst = FItemCount - 1 ;
0676 if ( FFileLast > FItemCount - 1 )
0677 FFileLast = FItemCount - 1 ;
0678 if ( FFileFirst > FFileLast )
0679 {
0680 FItemCount = FFileFirst;
0681 FFileFirst = FFileLast;
0682 FFileLast = FItemCount;
0683 }
0684 SendDlgItemMessage ( //选择指定项
0685 hWndMicapsFileStatus,
0686 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0687 LB_SELITEMRANGE,
0688 true,
0689 MAKELONG ( FFileFirst,FFileLast )) ;
0690 if ( SendDlgItemMessage (
0691 hWndMicapsFileStatus,
0692 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0693 LB_GETSELCOUNT,
0694 0 ,
0695 0 ) > 0 ) //已选择有项目
0696 { //设置文件状态
0697 SendDlgItemMessage (
0698 hWndMicapsFileStatus,
0699 FFileStatus,
0700 BM_CLICK,
0701 0 ,
0702 0 ) ;
0703 FMessage = true ;
0704 }
0705 } //else
0706 } //if(hWndMicapsFileStatus!=NULL
0707 } //if( hWndMicaps != NULL
0708 return ( FMessage ) ;
0709 }
0710 catch ( ... )
0711 {
0712 return ( FMessage ) ;
0713 }
0714 }
0715 //---------------------------------------------------------------------------
0716 bool CMicaps::Status ( bool FFile [] , int FFileCount, int FFileStatus )
0717 //功能:设置Micaps指定项目的文件状态
0718 //参数:
0719 //FFile[] - 待选值(true为选择,false为不选)
0720 //FFileCount - 总数
0721 //FFileStatus - 状态 {MICAPS_FILE_STATUS_VIEW,MICAPS_FILE_STATUS_HIDE, MICAPS_FILE_STATUS_MODIFY, MICAPS_FILE_STATUS_EDIT, MICAPS_FILE_STATUS_MOVE}
0722 // 若 FFileFirst < 0 或 FFileLast < 0 则仅设置状态
0723 {
0724 bool FMessage = false ;
0725 try {
0726 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0727 HWND hWndMicaps = FindMicapsWindow () ;
0728 if ( hWndMicaps == NULL ) return ( FMessage ) ; //无法定位Micaps窗口
0729 DialogOption ( true ) ;
0730 HWND hWndMicapsFileStatus = NULL; //Micaps的显示设置对话框
0731 int iSleepCount = 0 ;
0732 if ( hWndMicaps != NULL
0733 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0734 && SetForegroundWindow ( hWndMicaps )
0735 )
0736 {
0737 iSleepCount = 0 ;
0738 while ( hWndMicapsFileStatus == NULL && iSleepCount < 12 )
0739 {
0740 Sleep ( 132 ) ;
0741 hWndMicapsFileStatus = FindWindow ( "#32770" , "显示设置" ) ;
0742 iSleepCount++;
0743 }
0744 int FItemCount = 0 ;
0745 if ( hWndMicapsFileStatus != NULL
0746 && ShowWindow ( hWndMicapsFileStatus,SW_SHOWNORMAL ) //显示Micaps主窗口
0747 && SetForegroundWindow ( hWndMicapsFileStatus ) //设置Micaps为当前活动窗口
0748 && GetDlgItem ( hWndMicapsFileStatus, FFileStatus ) != NULL //有状态按钮
0749 && ( FItemCount = SendDlgItemMessage (
0750 hWndMicapsFileStatus,
0751 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0752 LB_GETCOUNT, 0 , 0 )) > 0
0753 )
0754 {
0755 SendDlgItemMessage ( //取消所有项目的选择状态
0756 hWndMicapsFileStatus,
0757 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0758 LB_SELITEMRANGE,
0759 false,
0760 MAKELONG ( 0 ,FItemCount- 1 )) ;
0761 for ( int i= 0 ;i<FItemCount;i++ )
0762 if ( i<FFileCount )
0763 SendDlgItemMessage ( //选择指定项
0764 hWndMicapsFileStatus,
0765 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0766 LB_SETSEL,
0767 FFile [ i ] ,
0768 i ) ;
0769 if ( SendDlgItemMessage (
0770 hWndMicapsFileStatus,
0771 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0772 LB_GETSELCOUNT,
0773 0 ,
0774 0 ) > 0 ) //已选择有项目
0775 { //设置文件状态
0776 SendDlgItemMessage (
0777 hWndMicapsFileStatus,
0778 FFileStatus,
0779 BM_CLICK,
0780 0 ,
0781 0 ) ;
0782 FMessage = true ;
0783 }
0784 } //if(hWndMicapsFileStatus!=NULL
0785 } //if( hWndMicaps != NULL
0786 return ( FMessage ) ;
0787 }
0788 catch ( ... )
0789 {
0790 return ( FMessage ) ;
0791 }
0792 }
0793 //---------------------------------------------------------------------------
0794 bool CMicaps::Explore ( int FTools )
0795 //功能:按下图形检索窗口的第FTools个按钮
0796 //参数:
0797 //FTools - 按钮序号 自上而下 由0开始
0798 {
0799 bool FMessage = false ;
0800 TPoint FToolsPoint = OperateTools ( FTools ) ;
0801 try {
0802 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0803 HWND hWndMicaps = FindMicapsWindow () ;
0804 HWND hWndMicapsTools; //检索窗口
0805 if ( hWndMicaps != NULL
0806 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0807 && SetForegroundWindow ( hWndMicaps )
0808 )
0809 {
0810 hWndMicapsTools = FindWindow ( "OperateClass" , "工具" ) ;
0811 FMessage = hWndMicapsTools != NULL
0812 && PostMessage ( hWndMicapsTools, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG ( FToolsPoint.x,FToolsPoint.y ) )
0813 && PostMessage ( hWndMicapsTools, WM_LBUTTONUP, MK_LBUTTON, MAKELONG ( FToolsPoint.x,FToolsPoint.y ) ) ;
0814 }
0815 return ( FMessage ) ;
0816 }
0817 catch ( ... )
0818 {
0819 return ( FMessage ) ;
0820 }
0821 }
0822 //---------------------------------------------------------------------------
0823 bool CMicaps::ZoomStatus ( void )
0824 //功能:设置Micaps窗口为缩放状态
0825 {
0826 return ( Explore ( 11 ) ) ;
0827 }
0828 //---------------------------------------------------------------------------
0829 bool CMicaps::Zoom ( bool FZoom )
0830 //功能:缩放
0831 //参数:
0832 //FZoom - 缩放标志 {true(放大), false(缩小)}
0833 {
0834 RECT lpRect;
0835 HWND hWndMicaps = FindMicapsWindow () ;
0836 int x, y;
0837 if ( GetWindowRect ( hWndMicaps, &lpRect ) )
0838 {
0839 x = ( lpRect.left + lpRect.right ) / 2 ;
0840 y = ( lpRect.top + lpRect.bottom ) / 2 ;
0841 }
0842 return ( Zoom ( FZoom,Point ( x,y ))) ;
0843 }
0844 //---------------------------------------------------------------------------
0845 bool CMicaps::Zoom ( bool FZoom, TPoint FPlace )
0846 //功能:缩放
0847 //参数:
0848 //FZoom - 缩放标志 {true(放大), false(缩小)}
0849 //FPoint - 窗口位置
0850 {
0851 bool FMessage = false ;
0852 try {
0853 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0854 HWND hWndMicaps = FindMicapsWindow () ;
0855 if ( hWndMicaps != NULL
0856 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0857 && SetForegroundWindow ( hWndMicaps )
0858 )
0859 {
0860 if ( FZoom ) ZoomStatus () ; //放大时需要将Micaps的缩放按钮设为按下状态
0861 if ( FZoom )
0862 FMessage = PostMessage ( hWndMicaps, WM_LBUTTONDBLCLK, MK_LBUTTON, MAKELONG ( FPlace.x,FPlace.y ) ) ;
0863 else
0864 FMessage = PostMessage ( hWndMicaps, WM_RBUTTONDBLCLK, MK_RBUTTON, MAKELONG ( FPlace.x,FPlace.y ) ) ;
0865 }
0866 return ( FMessage ) ;
0867 }
0868 catch ( ... )
0869 {
0870 return ( FMessage ) ;
0871 }
0872 }
0873 //---------------------------------------------------------------------------
0874 bool CMicaps::Revert ( void )
0875 //功能:还原
0876 {
0877 return ( Explore ( 1 ) ) ;
0878 }
0879 //---------------------------------------------------------------------------
0880 bool CMicaps::LongitudeLatitude ( void )
0881 //功能:经纬度隐现
0882 {
0883 return ( Explore ( 0 ) ) ;
0884 }
0885 //---------------------------------------------------------------------------
0886 bool CMicaps::Print ( void )
0887 //功能:打印Micaps主窗口
0888 {
0889 return ( Explore ( 2 ) ) ;
0890 }
0891 //---------------------------------------------------------------------------
0892 bool CMicaps::Background ( int FBackgroundType )
0893 //功能:设置Micaps背景图类型
0894 //参数:
0895 //FBackgroundType - 类型 {
0896 // MICAPS_BACKGROUNG_TYPE_BBQ,
0897 // MICAPS_BACKGROUNG_TYPE_LAMBERT,
0898 // MICAPS_BACKGROUNG_TYPE_MECATOR,
0899 // MICAPS_BACKGROUNG_TYPE_LINEAR}
0900 {
0901 AnsiString FBackFileName = FMicapsDirectory;
0902 switch ( FBackgroundType )
0903 {
0904 case MICAPS_BACKGROUNG_TYPE_BBQ:
0905 FBackFileName = FMicapsDirectory + "Code//BBQMAPXY.dat" ;
0906 break ;
0907 case MICAPS_BACKGROUNG_TYPE_LAMBERT:
0908 FBackFileName = FMicapsDirectory + "Code//LAMBERTM.dat" ;
0909 break ;
0910 case MICAPS_BACKGROUNG_TYPE_MECATOR:
0911 FBackFileName = FMicapsDirectory + "Code//MECATORM.dat" ;
0912 break ;
0913 case MICAPS_BACKGROUNG_TYPE_LINEAR:
0914 FBackFileName = FMicapsDirectory + "Code//LINEARMA.dat" ;
0915 break ;
0916 default :
0917 FBackFileName = FMicapsDirectory + "Code//BBQMAPXY.dat" ;
0918 break ;
0919 }
0920 return ( FileExists ( FBackFileName ) && OpenFile ( FBackFileName ) ) ;
0921 }
0922 //---------------------------------------------------------------------------
0923 bool CMicaps::Palette ( int FPaletteIndex )
0924 //功能:调置Micaps调色板
0925 //参数:
0926 //FPaletteIndex - 调色板索引值 0~16 缺省为 0
0927 {
0928 bool FMessage = IsMicapsRunning () ;
0929 if ( !FMessage ) return ( FMessage ) ;
0930 AnsiString FPaletteFile;
0931 FPaletteFile = FMicapsDirectory + "ColorMap//ColorMap." + FormatFloat ( "000" ,FPaletteIndex ) ;
0932 return ( FileExists ( FPaletteFile ) && OpenFile ( FPaletteFile ) ) ;
0933 }
0934 //---------------------------------------------------------------------------
0935 bool CMicaps::PrevTime ( void )
0936 //功能:前翻
0937 {
0938 return ( MenuFromId ( MICAPS_MENU_PREVTIME )) ;
0939 }
0940 //---------------------------------------------------------------------------
0941 bool CMicaps::NextTime ( void )
0942 //功能:后翻
0943 {
0944 return ( MenuFromId ( MICAPS_MENU_NEXTTIME )) ;
0945 }
0946 //---------------------------------------------------------------------------
0947 bool CMicaps::Animate ( void )
0948 //功能:动画
0949 {
0950 return ( MenuFromId ( MICAPS_MENU_ANIMATE )) ;
0951 }
0952 //---------------------------------------------------------------------------
0953 bool CMicaps::Tools ( int FColIndex, int FRowIndex )
0954 //功能:针对图形检索窗口的操作
0955 //参数:
0956 //FColIndex - 列数
0957 //FRowIndex - 行数
0958 {
0959 return ( Tools ( EditTools ( FColIndex,FRowIndex ))) ;
0960 }
0961 //---------------------------------------------------------------------------
0962 bool CMicaps::Tools ( TPoint FEditPoint )
0963 //功能:针对工具窗口的操作
0964 //参数说明:
0965 //FEditPoint - 位置
0966 {
0967 bool FMessage = false ;
0968 try {
0969 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0970 HWND hWndMicaps = FindMicapsWindow () ;
0971 HWND hWndMicapsEditTools = NULL; //工具窗口
0972 if ( hWndMicaps != NULL
0973 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0974 && SetForegroundWindow ( hWndMicaps )
0975 )
0976 {
0977 MenuFromId ( MICAPS_MENU_EDITTOOL ) ;
0978 hWndMicapsEditTools = FindWindow ( "EditClass" , "工具" ) ;
0979 if ( hWndMicapsEditTools != NULL )
0980 {
0981 FMessage =
0982 PostMessage ( hWndMicapsEditTools, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG ( FEditPoint.x,FEditPoint.y ) )
0983 && PostMessage ( hWndMicapsEditTools, WM_LBUTTONUP, MK_LBUTTON, MAKELONG ( FEditPoint.x,FEditPoint.y ) ) ;
0984 }
0985 }
0986 return ( FMessage ) ;
0987 }
0988 catch ( ... )
0989 {
0990 return ( FMessage ) ;
0991 }
0992 }
0993 //---------------------------------------------------------------------------
0994 bool CMicaps::Transparency ( void )
0995 //功能:清透明板
0996 {
0997 return ( MenuFromId ( MICAPS_MENU_TRANSPARENCY )) ;
0998 }
0999 //---------------------------------------------------------------------------
1000 bool CMicaps::DialogTools ( bool FEditToolsDlg )
1001 //功能:隐现工具对话框
1002 //参数:
1003 //FEditToolsDlg - 隐现标志 (true 为显示,false 为消隐)
1004 {
1005 bool FMessage = false ;
1006 try {
1007 if ( IsMicapsRunning () )
1008 {
1009 if ( FEditToolsDlg )
1010 FMessage = MenuFromId ( MICAPS_MENU_EDITTOOL ) ;
1011 else
1012 {
1013 HWND hWndMicapsEditTools = FindWindow ( "EditClass" , "工具" ) ;
1014 if ( hWndMicapsEditTools != NULL )
1015 FMessage = PostMessage ( hWndMicapsEditTools, WM_CLOSE, 0 , 0 ) ;
1016 }
1017 }
1018 return ( FMessage ) ;
1019 }
1020 catch ( ... )
1021 {
1022 return ( FMessage ) ;
1023 }
1024 }
1025 //---------------------------------------------------------------------------
1026 bool CMicaps::DialogOption ( bool FViewOptionDlg )
1027 //功能:隐现显示设置对话框
1028 //参数:
1029 //FViewOptionDlg - 隐现标志 (true 为显示,false 为消隐)
1030 {
1031 bool FMessage = false ;
1032 try {
1033 if ( IsMicapsRunning () )
1034 {
1035 if ( FViewOptionDlg )
1036 FMessage = MenuFromId ( MICAPS_MENU_VIEWOPTION ) ;
1037 else
1038 {
1039 HWND hWndMicapsViewOption = FindWindow ( "#32770" , "显示设置" ) ;
1040 if ( hWndMicapsViewOption != NULL )
1041 FMessage = PostMessage ( hWndMicapsViewOption, WM_CLOSE, 0 , 0 ) ;
1042 }
1043 }
1044 return ( FMessage ) ;
1045 }
1046 catch ( ... )
1047 {
1048 return ( FMessage ) ;
1049 }
1050 }
1051 //---------------------------------------------------------------------------
1052 bool CMicaps::PointEvent ( POINTEVENT *FPointEvent, int FPointCount )
1053 //功能:在指定的窗口位置按下指定的鼠标键
1054 //参数:
1055 //FPointEvent - 包含鼠标操作信息(窗口)的结构地址 &FPointEvent
1056 //FPointCount - FPointEvent[]的总数
1057 {
1058 bool FMessage = false ;
1059 HWND hWndMicaps = FindMicapsWindow () ;
1060 if ( hWndMicaps == NULL ) return ( false ) ;
1061 try {
1062 for ( int i= 0 ;i<FPointCount;i++ )
1063 {
1064 PostMessage (
1065 hWndMicaps,
1066 FPointEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1067 FPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1068 MAKELONG ( FPointEvent [ i ] .Place.x,FPointEvent [ i ] .Place.y ) ) ;
1069 PostMessage (
1070 hWndMicaps,
1071 FPointEvent [ i ] .Event ? WM_LBUTTONUP : WM_RBUTTONUP,
1072 FPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1073 MAKELONG ( FPointEvent [ i ] .Place.x,FPointEvent [ i ] .Place.y ) ) ;
1074 }
1075 FMessage = true ;
1076 return ( FMessage ) ;
1077 }
1078 catch ( ... )
1079 {
1080 return ( FMessage ) ;
1081 }
1082 }
1083 //---------------------------------------------------------------------------
1084 bool CMicaps::PointEvent ( FLOATPOINTEVENT *FFloatPointEvent, int FFloatPointCount )
1085 //功能:在指定的经纬度按下指定的鼠标键
1086 //参数:
1087 //FPointEvent - 包含鼠标操作信息(经纬度)的结构地址 &FPointEvent
1088 //FPointCount - FPointEvent[]的总数
1089 {
1090 bool FMessage = false ;
1091 HWND hWndMicaps = FindMicapsWindow () ;
1092 if ( hWndMicaps == NULL || !FCoordinateEnabled ) return ( false ) ;
1093 try {
1094 TPoint pp;
1095 // CCoordinate
1096 for ( int i= 0 ;i<FFloatPointCount;i++ )
1097 {
1098 pp = FCoordinate->WindowPlace ( FFloatPointEvent [ i ] .Place ) ;
1099 PostMessage (
1100 hWndMicaps,
1101 FFloatPointEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1102 FFloatPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1103 MAKELONG ( pp.x,pp.y ) ) ;
1104 PostMessage (
1105 hWndMicaps,
1106 FFloatPointEvent [ i ] .Event ? WM_LBUTTONUP : WM_RBUTTONUP,
1107 FFloatPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1108 MAKELONG ( pp.x,pp.y ) ) ;
1109 }
1110 FMessage = true ;
1111 return ( FMessage ) ;
1112 }
1113 catch ( ... )
1114 {
1115 return ( FMessage ) ;
1116 }
1117 }
1118 //---------------------------------------------------------------------------
1119 bool CMicaps::PointEvent ( OBJECTEVENT *FObjectEvent, int FObjectEventCount )
1120 //功能:在指定的窗口位置按下指定的鼠标键
1121 //功能:
1122 //参数:
1123 //FObjectEvent - 包含鼠标操作信息(键、事件、经、纬度)的结构地址
1124 //FObjectEventCount - FObjectEvent 的数据长度
1125 {
1126 bool FMessage = false ;
1127 UINT FButton, FEvent;
1128 RECT lpRect;
1129 TPoint pp;
1130 HWND hWndMicaps = FindMicapsWindow () ;
1131 if ( hWndMicaps == NULL || !FCoordinateEnabled ) return ( false ) ;
1132 try {
1133 for ( int i= 0 ;i<FObjectEventCount;i++ )
1134 {
1135 pp = FCoordinate->WindowPlace ( FObjectEvent [ i ] .Longitude,FObjectEvent [ i ] .Latitude ) ;
1136 //鼠标键
1137 if ( FObjectEvent [ i ] .Button == 0 )
1138 FButton = MK_LBUTTON;
1139 else
1140 FButton = MK_RBUTTON;
1141 //事件
1142 if ( FObjectEvent [ i ] .Event == 0 )
1143 FEvent = FObjectEvent [ i ] .Button == 0 ? WM_LBUTTONDOWN : WM_RBUTTONDOWN;
1144 else if ( FObjectEvent [ i ] .Event == 1 )
1145 FEvent = FObjectEvent [ i ] .Button == 0 ? WM_LBUTTONUP : WM_RBUTTONUP;
1146 else if ( FObjectEvent [ i ] .Event == 3 )
1147 FEvent = FObjectEvent [ i ] .Button == 0 ? WM_LBUTTONDBLCLK : WM_RBUTTONDBLCLK;
1148 else FEvent = FObjectEvent [ i ] .Event;
1149 switch ( FObjectEvent [ i ] .Event )
1150 {
1151 case MICAPS_CONTROL_CLICK: //单击事件包含按下和弹起两个事件
1152 PostMessage (
1153 hWndMicaps,
1154 FObjectEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1155 FObjectEvent [ i ] .Button ? MK_LBUTTON : MK_RBUTTON,
1156 MAKELONG ( pp.x,pp.y ) ) ;
1157 PostMessage (
1158 hWndMicaps,
1159 FObjectEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1160 FObjectEvent [ i ] .Button ? MK_LBUTTON : MK_RBUTTON,
1161 MAKELONG ( pp.x,pp.y ) ) ;
1162 break ;
1163 default :
1164 PostMessage (
1165 hWndMicaps,
1166 FEvent,
1167 FButton,
1168 MAKELONG ( pp.x,pp.y ) ) ;
1169 break ;
1170 }
1171 }
1172 FMessage = true ;
1173 return ( FMessage ) ;
1174 }
1175 catch ( ... )
1176 {
1177 return ( FMessage ) ;
1178 }
1179 }
1180 //---------------------------------------------------------------------------
1181 bool CMicaps::MicapsClientRect ( LPRECT lpRect )
1182 //功能:获得Micaps窗口区域
1183 //参数:
1184 //lpRect - 指向Micaps窗口区域的RECT结构的指针
1185 {
1186 HWND hWndMicaps = FindMicapsWindow () ;
1187 bool bMessage = ::GetClientRect ( hWndMicaps, lpRect ) ;
1188 return ( bMessage ) ;
1189 }
1190 //---------------------------------------------------------------------------
1191 bool CMicaps::MicapsWindowRect ( LPRECT lpRect )
1192 //功能:获得Micaps窗口区域
1193 //参数:
1194 //lpRect - 指向Micaps窗口区域的RECT结构的指针
1195 {
1196 HWND hWndMicaps = FindMicapsWindow () ;
1197 bool bMessage = ::GetWindowRect ( hWndMicaps, lpRect ) ;
1198 return ( bMessage ) ;
1199 }
1200 //---------------------------------------------------------------------------
1201 bool CMicaps::OperateFromFile ( AnsiString FOperateFile )
1202 //功能:根据预定义的操作记录文件来执行Micaps操作
1203 //功能:
1204 //参数:
1205 //FOperateFile - 文件名
1206 {
1207 bool FMessage = false ;
1208 if ( !FileExists ( FOperateFile ) ) return ( FMessage ) ;
1209 Sleep ( 1032 ) ;
1210 MICAPSEVENT me;
1211 OBJECTEVENT *oe;
1212 try {
1213 oe = new OBJECTEVENT [ 12 ] ;
1214 int iFileHandle = FileOpen ( FOperateFile,fmOpenRead ) ;
1215 int iFileRead = - 1 ;
1216 char Symbol [ 33 ] ;
1217 if ( iFileHandle != - 1 )
1218 {
1219 iFileRead = FileRead ( iFileHandle, ( LPSTR ) Symbol, 32 ) ; //First
1220 Symbol [ 32 ] = '/0' ;
1221 }
1222 if ( iFileHandle != - 1 && AnsiString ( Symbol ) == "MicapsControl-LiuZeJun-CBuilder5" )
1223 {
1224 iFileRead = FileRead ( iFileHandle, ( LPSTR ) &me,sizeof ( MICAPSEVENT )) ; //First
1225 while ( iFileRead == sizeof ( MICAPSEVENT )
1226 && me.Object != MICAPS_OBJECT_NULL
1227 && me.Count > 0 )
1228 {
1229 oe = new OBJECTEVENT [ me.Count ] ;
1230 for ( int i= 0 ;i<me.Count;i++ )
1231 iFileRead = FileRead ( iFileHandle, ( LPSTR ) &oe [ i ] , sizeof ( OBJECTEVENT )) ;
1232
1233 FMessage = Operate ( me, oe ) ;
1234 iFileRead = FileRead ( iFileHandle, ( LPSTR ) &me,sizeof ( MICAPSEVENT )) ; //Next
1235 }
1236 FileClose ( iFileHandle ) ;
1237 iFileHandle = - 1 ;
1238 delete oe;
1239 }
1240 if ( iFileHandle != - 1 )
1241 FileClose ( iFileHandle ) ;
1242 return ( FMessage ) ;
1243 }
1244 catch ( ... )
1245 {
1246 return ( FMessage ) ;
1247 }
1248 }
1249 //---------------------------------------------------------------------------
1250 bool CMicaps::Operate ( MICAPSEVENT FMicapsEvent, OBJECTEVENT *FObjectEvent )
1251 //功能:执行Micaps操作
1252 //参数:
1253 //FMicapsEvent - 包含要操纵的Micaps对象及次数的数据结构
1254 //FObjectEvent - 包含鼠标操作信息(键、事件、经、纬度)的结构地址
1255 {
1256 bool FMessage = false ;
1257 switch ( FMicapsEvent.Object )
1258 {
1259 case MICAPS_OBJECT_NULL:
1260 break ;
1261 case MICAPS_OBJECT_MICAPS: //Micaps主窗口
1262 Revert () ; //还原
1263 FMessage = PointEvent ( FObjectEvent,FMicapsEvent.Count ) ;
1264 break ;
1265 case MICAPS_OBJECT_MENU: //Micaps主菜单
1266 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1267 FMessage = MenuFromId ( FObjectEvent [ i ] .Event ) ;
1268 break ;
1269 case MICAPS_OBJECT_TOOLS: //Micaps工具窗口
1270 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1271 {
1272 if ( FObjectEvent [ i ] .Longitude == - 1 || FObjectEvent [ i ] .Latitude == - 1 )
1273 FMessage = DialogTools ( false ) ;
1274 else if ( FObjectEvent [ i ] .Longitude == - 2 || FObjectEvent [ i ] .Latitude == - 2 )
1275 FMessage = DialogTools ( true ) ;
1276 else
1277 FMessage = Tools (
1278 FObjectEvent [ i ] .Longitude,
1279 FObjectEvent [ i ] .Latitude ) ;
1280 }
1281 break ;
1282 case MICAPS_OBJECT_EXPLORE: //Micaps检索窗口
1283 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1284 FMessage = Explore ( FObjectEvent [ i ] .Latitude ) ;
1285 break ;
1286 case MICAPS_OBJECT_OPTION: //Micaps显示设置窗口
1287 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1288 {
1289 if ( FObjectEvent [ i ] .Longitude == - 3 || FObjectEvent [ i ] .Latitude == - 3 )
1290 FMessage = DialogOption ( false ) ;
1291 else if ( FObjectEvent [ i ] .Longitude == - 4 || FObjectEvent [ i ] .Latitude == - 4 )
1292 FMessage = DialogOption ( true ) ;
1293 else
1294 FMessage = Status (
1295 FObjectEvent [ i ] .Longitude, //First Item Index
1296 FObjectEvent [ i ] .Latitude, //Last Item Index
1297 FObjectEvent [ i ] .Event ) ;
1298 }
1299 break ;
1300 default :
1301 break ;
1302 }
1303 return ( FMessage ) ;
1304 }
1305 //---------------------------------------------------------------------------
1306 AnsiString CMicaps::GetOpenFileName ( void )
1307 //功能:返回当前Micaps打开的文件名
1308 {
1309 return ( FCurrentOpenFileName ) ;
1310 }
1311 //---------------------------------------------------------------------------
1312 bool CMicaps::SetParentWindow ( HWND hNewParentWindow )
1313 {
1314 if ( hNewParentWindow != NULL )
1315 return ( SetParent ( FindMicapsWindow () , hNewParentWindow ) != NULL ) ;
1316 else
1317 return ( false ) ;
1318 }
1319 //---------------------------------------------------------------------------
1320 bool CMicaps::SetChildWindow ( HWND hNewChildWindow )
1321 {
1322 if ( hNewChildWindow != NULL )
1323 return ( SetParent ( hNewChildWindow, FindMicapsWindow () ) != NULL ) ;
1324 else
1325 return ( false ) ;
1326 }
1327 //---------------------------------------------------------------------------
1328 bool CMicaps::Show ( void )
1329 {
1330 HWND hWndMicaps = FindMicapsWindow () ;
1331 return ( hWndMicaps != NULL
1332 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
1333 && SetForegroundWindow ( hWndMicaps ) ) ;
1334 }
1335 //---------------------------------------------------------------------------
1336 bool CMicaps::SaveMicapsImage ( AnsiString ImageFileName )
1337 //功能:以Bitmap位图方式保存Micaps主窗口的图像信息 - 用于气象信息网站建设所需
1338 //
1339 //ImageFileName - 目标文件名
1340 //
1341 {
1342 HWND hWndMicaps = FindMicapsWindow () ;
1343 if ( hWndMicaps == NULL ) return ( false ) ;
1344 HWND hWndMicapsTools = FindWindow ( "OperateClass" , "工具" ) ;
1345 if ( hWndMicapsTools == NULL ) return ( false ) ;
1346 TRect mrect;
1347 bool move =
1348 GetWindowRect ( hWndMicapsTools,&mrect )
1349 && MoveWindow ( hWndMicapsTools,
1350 -mrect.Right- 1 ,mrect.Top,-mrect.Right- 1 +mrect.Width () ,mrect.Height () ,true ) ;
1351 bool ok = false ;
1352
1353 if ( hWndMicaps != NULL //主窗口
1354 && hWndMicapsTools != NULL //数据检索窗口
1355 && GetDC ( hWndMicaps ) != NULL //主窗口设备描述表
1356 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL ) //显示主窗口
1357 && SetForegroundWindow ( hWndMicaps ) //将主窗口设置为前端显示
1358 && DialogTools ( false ) //隐藏工具窗口
1359 && DialogOption ( false ) ) //隐藏显示设置窗口
1360 {
1361 HDC dc = GetDC ( hWndMicaps ) ;
1362 TRect rect;
1363 Graphics::TBitmap *bitmap = new Graphics::TBitmap () ;
1364 MicapsClientRect ( &rect ) ;
1365 bitmap->Width = rect.Width () ;
1366 bitmap->Height = rect.Height () ;
1367 UpdateWindow ( hWndMicaps ) ;
1368 bool ok1 = BitBlt (
1369 ( HDC ) bitmap->Canvas->Handle, // handle to destination device context
1370 0 , // x-coordinate of destination rectangle's upper-left corner
1371 0 , // y-coordinate of destination rectangle's upper-left corner
1372 rect.Width () , // width of destination rectangle
1373 rect.Height () , // height of destination rectangle
1374 dc, // handle to source device context
1375 0 , // x-coordinate of source rectangle's upper-left corner
1376 0 , // y-coordinate of source rectangle's upper-left corner
1377 SRCCOPY // raster operation code
1378 ) ;
1379 if ( ok1 )
1380 {
1381 bitmap->SaveToFile ( ImageFileName ) ;
1382 ok = ok1 && FileExists ( ImageFileName ) ;
1383 }
1384 delete bitmap;
1385 }
1386 if ( move )
1387 MoveWindow ( hWndMicapsTools,mrect.Left,mrect.Top,mrect.Width () ,mrect.Height () ,true ) ;
1388 return ( ok ) ;
1389 }
1390 //---------------------------------------------------------------------------
CMicaps.cpp
0001 //***************************************************************************
0002 // 功能:与Micaps系统的交互访问
0003 // 文件名:CMicaps.cpp
0004 // 头文件:CMicaps.h
0005 // 相关文件:SMicaps.hpp
0006 // FStrings.p - 字符串处理
0007 // SFloatPoint.hpp - Point类的浮点版
0008 // CCoordinate.h - 地图坐标处理
0009 // CDiamond19.h - Micaps 初始化参数文件
0010 // 编写者:刘泽军
0011 // 开始日期:2001-08-04
0012 // 更新日期:2002-05-04
0013 // 备注:
0014 //***************************************************************************
0015
0016 //===========================================================================
0017 // 程序名:CMicaps.cpp
0018 // 功能:
0019 //程序设计:广西壮族自治区柳州地区气象台 刘泽军
0020 // EMail:BJ0773@gmail.com
0021 //===========================================================================
0022 // 本文件:CMicaps.cpp
0023 // 头文件:CMicaps.h
0024 // SMicaps.hpp
0025 //开发平台:Microsoft Windows 2000 + Borland C++Builder 5.0
0026 //辅助工具:Microsoft Spy++ 6.0, Borland WorkShop 4.5
0027 //相关文章:《应用程序与Micaps系统的交互访问》 2001-10-19已投给《气象》,未获录用。
0028 //开始日期:2001-08-04
0029 //更新日期:2001-11-26
0030 //===========================================================================
0031 //开发历程:
0032 // 2001-08-04 启动、关闭Micaps
0033 // 2001-08-05 访问Micaps菜单项 - 打开
0034 // 2001-08-07 访问显示设置窗口
0035 // 2001-08-08 访问图形检索窗口、其它的Micaps菜单项
0036 // 2001-08-27 在Micaps主窗口 显示 工具窗口 指定的符号(Lambert投影下)
0037 // 2001-09-06 打开多个文件
0038 // 2001-09-17 完善Micaps菜单访问(因键盘方式访问Micaps菜单在Win98不正常)
0039 // WM_SYSCOMMAND+SC_KEYMENU => WM_COMMAND+MenuID
0040 // 2001-10-13 在Lambert投影方式下的 经纬度 => Micaps主窗口坐标
0041 // 2001-10-15 完成《应用程序与Micaps系统的交互访问》
0042 // 2001-11-12 相互独立的函数 => CMicaps 类
0043 // 2001-11-22 根据预定义的操作记录文件来控制Micaps
0044 //===========================================================================
0045 #include <vcl.h>
0046 #include <clipbrd.hpp>
0047 #pragma hdrstop
0048
0049 #include "CMicaps.h"
0050 //---------------------------------------------------------------------------
0051 #include <FileCtrl.hpp>
0052 #include "../Common/CDiamondList.h"
0053 //---------------------------------------------------------------------------
0054 #pragma package ( smart_init )
0055 //---------------------------------------------------------------------------
0056 CMicaps::~CMicaps ( void )
0057 //功能:析构函数
0058 {
0059 // if( FOwnerExecute )//若Micaps是由应用程序本身运行则关闭Micaps。
0060 // Close();
0061 }
0062 //---------------------------------------------------------------------------
0063 CMicaps::CMicaps ( void )
0064 //功能:结构函数
0065 {
0066 FOwnerExecute = false ;
0067 Enabled = Setup ( "C://Micaps" ) ;
0068 if ( Enabled )
0069 SetMicapsParameter ( FMicapsParameter ) ;
0070 FCurrentOpenFileName = "" ;
0071 }
0072 //---------------------------------------------------------------------------
0073 CMicaps::CMicaps ( AnsiString FMicapsPath )
0074 //功能:结构函数
0075 //参数:
0076 //FMicapsPath - Micaps的安装目录(如:C:/Micaps)
0077 {
0078 FOwnerExecute = false ;
0079 Enabled = Setup ( FMicapsPath ) ;
0080 if ( Enabled )
0081 SetMicapsParameter ( FMicapsParameter ) ;
0082 FCurrentOpenFileName = "" ;
0083 }
0084 //---------------------------------------------------------------------------
0085 CMicaps::CMicaps ( AnsiString FMicapsPath, AnsiString FMicapsParam )
0086 //功能:结构函数
0087 //参数:
0088 //FMicapsPath - Micaps的安装目录(如:C:/Micaps)
0089 //FMicapsParam - 运行Micaps的参数文件(diamond 19)
0090 {
0091 FOwnerExecute = false ;
0092 Enabled = Setup ( FMicapsPath ) ;
0093 if ( Enabled && FileExists ( FMicapsParam ) )
0094 {
0095 FMicapsParameter = FMicapsParam;
0096 SetMicapsParameter ( FMicapsParameter ) ;
0097 }
0098 }
0099 //---------------------------------------------------------------------------
0100 HWND CMicaps::FindMicapsWindow ( void )
0101 //功能:查找Micaps主窗口
0102 {
0103 return ( FindWindow ( "MainClass" , "气象信息综合分析处理系统(MICAPS)" )) ;
0104 }
0105 //---------------------------------------------------------------------------
0106 bool CMicaps::Setup ( AnsiString FMicapsPath )
0107 //功能:设置本机的Micaps安装目录
0108 //参数:
0109 //FMicapsPath - 本机的Micaps安装目录 缺省为 C:/Micaps
0110 {
0111 bool FEnabled = false ;
0112 FCoordinateEnabled = false ;
0113 FMicapsDirectory = FMicapsPath.Trim () ;
0114 if ( FMicapsDirectory [ FMicapsDirectory.Length ()] != '//' )
0115 FMicapsDirectory = FMicapsDirectory + "//" ;
0116 FMicapsExecuteFile = FMicapsDirectory + "Code//Micaps.exe" ;
0117 FMicapsParameter = FMicapsDirectory + "Code//Para1.dat" ;
0118 if ( !FileExists ( FMicapsExecuteFile ) )
0119 {
0120 if ( SelectDirectory ( "请选择 Micaps 的安装目录!(例如:C://Micaps)" , "我的电脑" ,FMicapsDirectory ) )
0121 FEnabled = Setup ( FMicapsDirectory ) ;
0122 else
0123 FEnabled = false ;
0124 }
0125 else
0126 FEnabled = true ;
0127 return ( FEnabled ) ;
0128 }
0129 //---------------------------------------------------------------------------
0130 AnsiString CMicaps::GetMicapsDirectory ( void )
0131 //功能:返回Micaps安装目录
0132 {
0133 return ( FMicapsDirectory ) ;
0134 }
0135 //---------------------------------------------------------------------------
0136 AnsiString CMicaps::GetMicapsParameter ( void )
0137 //功能:返回Micaps启动参数
0138 {
0139 return ( FMicapsParameter ) ;
0140 }
0141 //---------------------------------------------------------------------------
0142 bool CMicaps::SetMicapsParameter ( AnsiString FMicapsParam )
0143 //功能:设置Micaps启动参数
0144 {
0145 bool FMessage = false ;
0146 FParameterCorrect = false ;
0147
0148 if ( FileExists ( FMicapsParam ) )
0149 {
0150 FMicapsParameter = FMicapsParam;
0151 CDiamond19 *d19 = new CDiamond19 ( FMicapsParam ) ;
0152 FParameterCorrect = d19->Enabled;
0153 if ( d19->Enabled )
0154 {
0155 FStartData = d19->GetStartData () ;
0156 RECT lpRect;
0157 if ( IsMicapsRunning () )
0158 MicapsClientRect ( &lpRect ) ;
0159 else
0160 lpRect = Rect ( 0 , 0 ,Screen->Width - 8 ,Screen->Height - 46 ) ;
0161 FCoordinate = new CCoordinate (
0162 1 , //Lambert
0163 d19->GetCenterLongitudeLatitude () , //TFloatPoint(100,35),
0164 TFloatPoint ( lpRect.right/ 2 ,lpRect.bottom/ 2 + 2 ) ,
0165 d19->GetZoom () ) ; //缩放系数
0166 FCoordinateEnabled = true ;
0167 FMessage == true ;
0168 }
0169 delete d19;
0170 }
0171 return ( FMessage ) ;
0172 }
0173 //---------------------------------------------------------------------------
0174 bool CMicaps::IsMicapsRunning ( void )
0175 //功能:判断Micaps是否运行
0176 {
0177 return ( FindMicapsWindow () != NULL ) ;
0178 }
0179 //---------------------------------------------------------------------------
0180 bool CMicaps::MenuFromId ( int FMicapsMenuId )
0181 //功能:执行ID号为FMicapsMenuId的Micaps菜单
0182 //参数:
0183 //FMicapsMenuId - 指定的Micaps菜单ID号
0184 {
0185 HWND hWndMicaps = FindMicapsWindow () ;
0186 bool FMessage = false ;
0187 if ( hWndMicaps != NULL )
0188 {
0189 FMessage = PostMessage ( hWndMicaps,WM_COMMAND,MAKELONG ( FMicapsMenuId, 0 ) ,NULL ) ;
0190 // FMessage = SendMessage(hWndMicaps,WM_COMMAND,MAKELONG(FMicapsMenuId,0),NULL);
0191 Sleep ( 132 ) ;
0192 }
0193 return ( FMessage ) ;
0194 }
0195 //---------------------------------------------------------------------------
0196 bool CMicaps::Execute ( bool FExecuteType ) //private member function
0197 //功能:运行Micaps
0198 //参数:
0199 //FExecuteType: 运行方式
0200 // true 强制运行并返回运行结果
0201 // false 若Micaps已运行则返回true,否则返回运行结果
0202 {
0203 if ( FExecuteType ) //强制运行方式
0204 {
0205 Close () ;
0206 Sleep ( 1032 ) ;
0207 }
0208 bool FMessage = IsMicapsRunning () ;
0209 if ( !FMessage ) //Micaps未运行
0210 {
0211 FMessage = ( int ) ShellExecute (
0212 Application->Handle,
0213 "open" ,
0214 FMicapsExecuteFile.c_str () ,
0215 FMicapsParameter.c_str () ,
0216 ExtractFilePath ( FMicapsExecuteFile ) .c_str () ,
0217 SW_SHOWNORMAL )
0218 > 32 ;
0219 FOwnerExecute = true ;
0220 SetMicapsParameter ( FMicapsParameter ) ;
0221 }
0222 else
0223 {
0224 HWND hWndMicaps = FindMicapsWindow () ;
0225 if ( hWndMicaps != NULL )
0226 {
0227 ShowWindow ( hWndMicaps,SW_SHOWNORMAL ) ; //显示Micaps主窗口
0228 SetForegroundWindow ( hWndMicaps ) ; //设置Micaps为当前活动窗口
0229 }
0230 }
0231 return ( FMessage ) ;
0232 }
0233 //---------------------------------------------------------------------------
0234 bool CMicaps::Execute ( void )
0235 //功能:运行Micaps(非强制方式)
0236 {
0237 return ( Execute ( false ) ) ; //非强制方式运行Micaps
0238 }
0239 //---------------------------------------------------------------------------
0240 bool CMicaps::Execute ( AnsiString FMicapsParam )
0241 //功能:带参数运行Micaps(非强制方式)
0242 //参数:
0243 //FMicapsParam - 指向一个文件名(diamond 19),该文件包含Micaps的启动设置
0244 {
0245 if ( !IsMicapsRunning () && FileExists ( FMicapsParam.Trim ()) )
0246 FMicapsParameter = FMicapsParam.Trim () ;
0247 return ( Execute ( false ) ) ;
0248 }
0249 //---------------------------------------------------------------------------
0250 bool CMicaps::ForceExecute ( void )
0251 //功能:运行Micaps(强制方式)
0252 {
0253 return ( Execute ( true ) ) ; //非运行Micaps
0254 }
0255 //---------------------------------------------------------------------------
0256 bool CMicaps::ForceExecute ( AnsiString FMicapsParam )
0257 //功能:带参数运行Micaps(强制方式)
0258 //参数:
0259 //FMicapsParam - 指向一个文件名(diamond 19),该文件包含Micaps的启动设置
0260 {
0261 if ( FileExists ( FMicapsParam.Trim ()) )
0262 FMicapsParameter = FMicapsParam.Trim () ;
0263 return ( Execute ( true ) ) ;
0264 }
0265 //---------------------------------------------------------------------------
0266 bool CMicaps::Close ( void ) //关闭 Micaps
0267 {
0268 bool FMessage = false ;
0269 try {
0270 HWND hWndMicaps = FindMicapsWindow () ;
0271 if ( hWndMicaps != NULL )
0272 {
0273 FMessage = PostMessage ( hWndMicaps, WM_CLOSE, 0 , 0 ) ;
0274 HWND hWndMicapsClose = NULL;
0275 int iSleepCount = 0 ;
0276 while ( hWndMicapsClose == NULL && iSleepCount < 12 )
0277 {
0278 Sleep ( 132 ) ; //延时
0279 hWndMicapsClose = FindWindow ( "#32770" , "退出Micaps" ) ;
0280 iSleepCount ++;
0281 }
0282 if ( ( FParameterCorrect && FStartData.WindowClose == 1 )
0283 || hWndMicapsClose != NULL )
0284 {
0285 SendDlgItemMessage (
0286 hWndMicapsClose, MICAPS_DLG_CLOSE_OKBUTTON, BM_CLICK, 0 , 0 ) ;
0287 FMessage = true ;
0288 }
0289 FOwnerExecute = false ;
0290 }
0291 return ( FMessage ) ;
0292 }
0293 catch ( ... )
0294 {
0295 return ( FMessage ) ;
0296 }
0297 }
0298 //---------------------------------------------------------------------------
0299 bool CMicaps::OpenFile ( AnsiString FOpenFileName )
0300 //功能:打开文件
0301 //参数:
0302 //FOpenFileName - 要打开的文件名
0303 {
0304 bool FMessage = false ;
0305 try {
0306 if ( FOpenFileName.Pos ( "*" ) || FOpenFileName.Pos ( "?" ) )
0307 FOpenFileName = SearchFile ( FOpenFileName,FSM_NEW ) ; //搜索最新文件
0308 if ( !FileExists ( FOpenFileName ) || !IsMicapsRunning () )
0309 return ( FMessage ) ; //指定文件不存在 或 Micaps未运行
0310 HWND hWndMicaps = FindMicapsWindow () ;
0311 int iSleepCount = 0 ;
0312 HWND hWndMicapsOpenFile = NULL;
0313 if ( hWndMicaps != NULL
0314 // && ShowWindow(hWndMicaps,SW_SHOWNORMAL)//显示Micaps主窗口
0315 // && SetForegroundWindow(hWndMicaps) //设置Micaps为当前活动窗口
0316 )
0317 {
0318 MenuFromId ( MICAPS_MENU_FILE ) ;
0319 while ( hWndMicapsOpenFile == NULL && iSleepCount < 12 )
0320 { //找 打开新文件 窗口
0321 Sleep ( 512 ) ;
0322 hWndMicapsOpenFile = FindWindow ( "#32770" , "打开新文件" ) ;
0323 iSleepCount++;
0324 }
0325 if ( hWndMicapsOpenFile!=NULL ) // && GetParent(hWndMicapsOpenFile) == hWndMicaps )
0326 {
0327 //清除 文件编辑框 文本
0328 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_EDITCTRL, WM_CLEAR, 0 , 0 ) ;
0329 FCurrentOpenFileName = FOpenFileName;
0330 //将文件名放入剪切板
0331 Clipboard () ->SetTextBuf ( FOpenFileName.c_str ()) ;
0332 //从剪切板粘贴文本
0333 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_EDITCTRL, WM_PASTE, 0 , 0 ) ;
0334 // Application->MainForm->Caption = FOpenFileName;
0335
0336 //按 打开新文件 窗口的 确定 按钮
0337 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_OKBUTTON, BM_CLICK, 0 , 0 ) ;
0338 FMessage = true ;
0339 }
0340 //判断 打开新文件 窗口是否仍未关闭
0341 iSleepCount = 0 ;
0342 hWndMicapsOpenFile = NULL;
0343 while ( hWndMicapsOpenFile == NULL && iSleepCount < 6 )
0344 { //找 打开新文件 窗口
0345 Sleep ( 132 ) ;
0346 hWndMicapsOpenFile = FindWindow ( "#32770" , "打开新文件" ) ;
0347 iSleepCount++;
0348 }
0349 if ( hWndMicapsOpenFile != NULL )
0350 { //按 打开新文件 窗口的 取消 按钮
0351 SendDlgItemMessage ( hWndMicapsOpenFile, MICAPS_DLG_OPEN_CANCELBUTTON, BM_CLICK, 0 , 0 ) ;
0352 FMessage = true ;
0353 }
0354 }
0355 return ( FMessage ) ;
0356 }
0357 catch ( ... )
0358 {
0359 return ( FMessage ) ;
0360 }
0361 }
0362 //---------------------------------------------------------------------------
0363 bool CMicaps::OpenFiles ( AnsiString FFiles )
0364 //功能:打开多个文件
0365 //参数:
0366 //FFiles - 包括多个指定要打开的文件名,以 ; 或 | 号分隔
0367 {
0368 return ( OpenFiles ( FFiles, ";" , "|" ) ) ;
0369 }
0370 //---------------------------------------------------------------------------
0371 bool CMicaps::OpenFiles ( AnsiString FFiles, AnsiString FAndStr, AnsiString FOrStr )
0372 //功能:在Micaps中打开多个文件
0373 //参数:
0374 //FFiles - 包括多个指定要打开的文件名,以 FAdnStr 或 ForStr 指定的符号分隔
0375 //FAndStr - 表示 和 的符号
0376 //FOrStr - 表示 或 的符号
0377 {
0378 //缺省 FAndStr - ;
0379 //缺省 FOrStr - |
0380 //间隔号(;) - 所有文件均打开
0381 //例: a,b,c 打开文件a及b及c
0382 //间隔号(|) - 打开第一个存在的文件
0383 //例: a|b|c 若a存在则打开a并返回,否则若b存在则打开b并返回...
0384 TStringList *StringList = new TStringList () ;
0385 TStringList *ChildStringList = new TStringList () ;
0386 ExtractString ( FFiles,FAndStr,false,StringList ) ;
0387
0388 //2002-01-30
0389 // 修改 CMicaps 类中有关 Micaps 文件的打开方式,根据记录文件 Code/File.lst,
0390 // 当需要打开的文件已被 Micaps 打开时,程序只是将该文件设为“显示”状态,而不是
0391 // 重新打开,否则将打开该文件;其他不需要显示的文件则从“显示设置”窗口中删除掉。
0392 for ( int i= 0 ;i<StringList->Count;i++ )
0393 {
0394 if ( StringList->Strings [ i ] .Pos ( FOrStr ) > 0 )
0395 {
0396 ExtractString ( StringList->Strings [ i ] ,FOrStr,false,ChildStringList ) ;
0397 for ( int j= 0 ;j<ChildStringList->Count;j++ )
0398 if ( ChildStringList->Strings [ j ] .Pos ( "*" )
0399 || ChildStringList->Strings [ j ] .Pos ( "?" ) )
0400 ChildStringList->Strings [ j ] =
0401 SearchFile ( ChildStringList->Strings [ j ] ,FSM_NEW ) ; //搜索最新文件
0402 for ( int j= 0 ;j<ChildStringList->Count;j++ )
0403 if ( FileExists ( ChildStringList->Strings [ j ]) )
0404 {
0405 StringList->Strings [ i ] = ChildStringList->Strings [ j ] ;
0406 j = ChildStringList->Count;
0407 }
0408 }
0409 else if ( StringList->Strings [ i ] .Pos ( "*" )
0410 || StringList->Strings [ i ] .Pos ( "?" ) )
0411 {
0412 StringList->Strings [ i ] =
0413 SearchFile ( StringList->Strings [ i ] ,FSM_NEW ) ; //搜索最新文件
0414 }
0415 }
0416 for ( int i=StringList->Count- 1 ;i>= 0 ;i-- )
0417 if ( StringList->Strings [ i ] .Trim () == ""
0418 || !FileExists ( StringList->Strings [ i ] .Trim ()) )
0419 StringList->Delete ( i ) ;
0420 TMicapsOpenFileList *mofl = new TMicapsOpenFileList (
0421 GetMicapsDirectory () + "Code//File.LST" ) ;
0422 if ( mofl->Enabled )
0423 {
0424 bool *bFile = new bool [ mofl->GetCount () + 1 ] ;
0425 mofl->CurrentOpened ( StringList,bFile ) ;
0426 for ( int i= 0 ;i<mofl->GetCount () ;i++ )
0427 bFile [ i ] = !bFile [ i ] ;
0428 Status ( bFile,mofl->GetCount () ,MICAPS_FILE_STATUS_MOVE ) ; //让Micaps删除所有不需要打开的文件
0429 Status ( - 1 ,MICAPS_FILE_STATUS_VIEW ) ; //让Micaps显示所有已打开的文件
0430 delete bFile;
0431 }
0432 else
0433 Status ( - 1 ,MICAPS_FILE_STATUS_MOVE ) ; //让Micaps删除所有已打开的文件
0434 delete mofl;
0435
0436 //打开文件
0437 for ( int i= 0 ;i<StringList->Count;i++ )
0438 if ( StringList->Strings [ i ] .Trim () != "" )
0439 OpenFile ( StringList->Strings [ i ] .Trim ()) ;
0440
0441 delete ChildStringList;
0442 delete StringList;
0443 return ( true ) ;
0444 }
0445 //---------------------------------------------------------------------------
0446 bool CMicaps::SaveToFile ( AnsiString FSaveFileName )
0447 //功能:保存文件
0448 //参数:
0449 //FSaveFileName - 要保存的文件名
0450 {
0451 bool FMessage = false ;
0452 if ( !IsMicapsRunning () ) return ( false ) ;
0453 AnsiString TempFSaveFileName = "C://TempSave.LZJ" ;
0454 try {
0455 if ( FileExists ( TempFSaveFileName ) )
0456 DeleteFile ( TempFSaveFileName.c_str ()) ;
0457 HWND hWndMicaps = FindMicapsWindow () ;
0458 if ( hWndMicaps == NULL ) return ( false ) ;
0459 FMessage = Explore ( 3 ) ;
0460 if ( !FMessage ) return ( FMessage ) ;
0461 int iSleepCount = 0 ;
0462 HWND hWndMicapsSaveFile = NULL;
0463 while ( hWndMicapsSaveFile == NULL && iSleepCount < 12 )
0464 {
0465 Sleep ( 132 ) ;
0466 hWndMicapsSaveFile = FindWindow ( "#32770" , "保存文件" ) ;
0467 iSleepCount++;
0468 }
0469 if ( hWndMicapsSaveFile != NULL
0470 && GetParent ( hWndMicapsSaveFile ) == FindWindow ( "OperateClass" , "工具" ) )
0471 {
0472 Clipboard () ->SetTextBuf ( TempFSaveFileName.c_str ()) ;
0473 SendDlgItemMessage (
0474 hWndMicapsSaveFile,
0475 MICAPS_DLG_SAVE_EDITCTRL,
0476 WM_CLEAR,
0477 0 , 0 ) ;
0478 SendDlgItemMessage (
0479 hWndMicapsSaveFile,
0480 MICAPS_DLG_SAVE_EDITCTRL,
0481 WM_PASTE,
0482 0 , 0 ) ;
0483 SendDlgItemMessage (
0484 hWndMicapsSaveFile,
0485 MICAPS_DLG_SAVE_OKBUTTON,
0486 BM_CLICK,
0487 0 , 0 ) ;
0488 FMessage = true ;
0489 }
0490 if ( FileExists ( TempFSaveFileName ) )
0491 {
0492 FMessage = CopyFile (
0493 TempFSaveFileName.c_str () ,
0494 FSaveFileName.c_str () ,
0495 false ) ;
0496 DeleteFile ( TempFSaveFileName.c_str ()) ;
0497 }
0498 else
0499 FMessage = false ;
0500 return ( FMessage ) ;
0501 }
0502 catch ( ... )
0503 {
0504 return ( FMessage ) ;
0505 }
0506 }
0507 //---------------------------------------------------------------------------
0508 bool CMicaps::Status ( int FFileIndex, int FFileStatus )
0509 //功能:设置Micaps文件状态
0510 //参数:
0511 //FFileIndex - 文件序号 -2, -1, 0, 1, 2 ... -2 为所有项 -1 为除0项外
0512 //FFileStatus - 状态 {MICAPS_FILE_STATUS_VIEW,MICAPS_FILE_STATUS_HIDE, MICAPS_FILE_STATUS_MODIFY, MICAPS_FILE_STATUS_EDIT, MICAPS_FILE_STATUS_MOVE}
0513 {
0514 if ( FFileIndex < - 2 ) FFileIndex == - 2 ;
0515 bool FMessage = false ;
0516 try {
0517 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0518 HWND hWndMicaps = FindMicapsWindow () ;
0519 if ( hWndMicaps == NULL ) return ( FMessage ) ; //无法定位Micaps窗口
0520 DialogOption ( true ) ;
0521 HWND hWndMicapsFileStatus = NULL; //Micaps的显示设置对话框
0522 int iSleepCount = 0 ;
0523 if ( hWndMicaps != NULL
0524 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0525 && SetForegroundWindow ( hWndMicaps )
0526 )
0527 {
0528 iSleepCount = 0 ;
0529 while ( hWndMicapsFileStatus == NULL && iSleepCount < 12 )
0530 {
0531 Sleep ( 132 ) ;
0532 hWndMicapsFileStatus = FindWindow ( "#32770" , "显示设置" ) ;
0533 iSleepCount++;
0534 }
0535 int FItemCount = 0 ;
0536 if ( hWndMicapsFileStatus!=NULL
0537 && ShowWindow ( hWndMicapsFileStatus,SW_SHOWNORMAL ) //显示Micaps主窗口
0538 && SetForegroundWindow ( hWndMicapsFileStatus ) //设置Micaps为当前活动窗口
0539 && GetDlgItem ( hWndMicapsFileStatus, FFileStatus ) != NULL //有状态按钮
0540 && ( FItemCount = SendDlgItemMessage (
0541 hWndMicapsFileStatus,
0542 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0543 LB_GETCOUNT, 0 , 0 )) > 0
0544 )
0545 {
0546 SendDlgItemMessage ( //不选所有项
0547 hWndMicapsFileStatus,
0548 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0549 LB_SELITEMRANGE,
0550 false,
0551 MAKELONG ( 0 ,FItemCount- 1 )) ;
0552 switch ( FFileIndex )
0553 {
0554 case - 2 : //设置所有项
0555 SendDlgItemMessage (
0556 hWndMicapsFileStatus,
0557 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0558 LB_SELITEMRANGE,
0559 true,
0560 MAKELONG ( 0 ,FItemCount- 1 )) ;
0561 break ;
0562 case - 1 : //设置非0项
0563 if ( FItemCount > 1 )
0564 SendDlgItemMessage ( //选定项目
0565 hWndMicapsFileStatus,
0566 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0567 LB_SELITEMRANGE,
0568 true,
0569 MAKELONG ( 1 ,FItemCount- 1 )) ;
0570 break ;
0571 default :
0572 if ( FFileIndex < FItemCount ) //设置指定项
0573 SendDlgItemMessage (
0574 hWndMicapsFileStatus,
0575 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0576 LB_SETSEL,
0577 true,
0578 FFileIndex ) ;
0579 break ;
0580 } //siwtch
0581 if ( SendDlgItemMessage ( //已选择有项目
0582 hWndMicapsFileStatus,
0583 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0584 LB_GETSELCOUNT,
0585 0 ,
0586 0 ) > 0 )
0587 { //单击 显示设置 窗口的指定按钮
0588 SendDlgItemMessage (
0589 hWndMicapsFileStatus,
0590 FFileStatus,
0591 BM_CLICK,
0592 0 ,
0593 0 ) ;
0594 FMessage = true ;
0595 }
0596 } //if hWndMicapsFileStatus!=NULL
0597 } //if hWndMicaps != NULL
0598 return ( FMessage ) ;
0599 }
0600 catch ( ... )
0601 {
0602 return ( FMessage ) ;
0603 }
0604 }
0605 //---------------------------------------------------------------------------
0606 bool CMicaps::Status ( int FFileFirst, int FFileLast, int FFileStatus )
0607 //功能:设置Micaps文件状态
0608 //参数:
0609 //FFileFirst - 始文件序号
0610 //FFileLast - 止文件序号
0611 //FFileStatus - 状态 {MICAPS_FILE_STATUS_VIEW,MICAPS_FILE_STATUS_HIDE, MICAPS_FILE_STATUS_MODIFY, MICAPS_FILE_STATUS_EDIT, MICAPS_FILE_STATUS_MOVE}
0612 // 若 FFileFirst < 0 或 FFileLast < 0 则仅设置状态
0613 {
0614 bool FMessage = false ;
0615 try {
0616 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0617 HWND hWndMicaps = FindMicapsWindow () ;
0618 if ( hWndMicaps == NULL ) return ( FMessage ) ; //无法定位Micaps窗口
0619 DialogOption ( true ) ;
0620 HWND hWndMicapsFileStatus = NULL; //Micaps的显示设置对话框
0621 int iSleepCount = 0 ;
0622 if ( hWndMicaps != NULL
0623 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0624 && SetForegroundWindow ( hWndMicaps )
0625 )
0626 {
0627 iSleepCount = 0 ;
0628 while ( hWndMicapsFileStatus == NULL && iSleepCount < 12 )
0629 {
0630 Sleep ( 132 ) ;
0631 hWndMicapsFileStatus = FindWindow ( "#32770" , "显示设置" ) ;
0632 iSleepCount++;
0633 }
0634 int FItemCount = 0 ;
0635 if ( hWndMicapsFileStatus!=NULL
0636 && ShowWindow ( hWndMicapsFileStatus,SW_SHOWNORMAL ) //显示Micaps主窗口
0637 && SetForegroundWindow ( hWndMicapsFileStatus ) //设置Micaps为当前活动窗口
0638 && GetDlgItem ( hWndMicapsFileStatus, FFileStatus ) != NULL //有状态按钮
0639 && ( FItemCount = SendDlgItemMessage (
0640 hWndMicapsFileStatus,
0641 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0642 LB_GETCOUNT, 0 , 0 )) > 0
0643 )
0644 {
0645 if ( FFileFirst < 0 || FFileLast < 0 )
0646 { //仅设置文件状态
0647 if ( SendDlgItemMessage (
0648 hWndMicapsFileStatus,
0649 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0650 LB_GETSELCOUNT,
0651 0 ,
0652 0 ) > 0 ) //已选择有项目
0653 {
0654 SendDlgItemMessage (
0655 hWndMicapsFileStatus,
0656 FFileStatus,
0657 BM_CLICK,
0658 0 ,
0659 0 ) ;
0660 FMessage = true ;
0661 }
0662 } //if 0 0
0663 else if ( FFileFirst == 9999 && FFileLast == 9999 ) //所有项均不选
0664 {
0665 SendDlgItemMessage (
0666 hWndMicapsFileStatus,
0667 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0668 LB_SELITEMRANGE,
0669 false,
0670 MAKELONG ( 0 ,FItemCount- 1 )) ;
0671 } //else if 9999 9999
0672 else
0673 { //选择项目
0674 if ( FFileFirst > FItemCount - 1 )
0675 FFileFirst = FItemCount - 1 ;
0676 if ( FFileLast > FItemCount - 1 )
0677 FFileLast = FItemCount - 1 ;
0678 if ( FFileFirst > FFileLast )
0679 {
0680 FItemCount = FFileFirst;
0681 FFileFirst = FFileLast;
0682 FFileLast = FItemCount;
0683 }
0684 SendDlgItemMessage ( //选择指定项
0685 hWndMicapsFileStatus,
0686 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0687 LB_SELITEMRANGE,
0688 true,
0689 MAKELONG ( FFileFirst,FFileLast )) ;
0690 if ( SendDlgItemMessage (
0691 hWndMicapsFileStatus,
0692 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0693 LB_GETSELCOUNT,
0694 0 ,
0695 0 ) > 0 ) //已选择有项目
0696 { //设置文件状态
0697 SendDlgItemMessage (
0698 hWndMicapsFileStatus,
0699 FFileStatus,
0700 BM_CLICK,
0701 0 ,
0702 0 ) ;
0703 FMessage = true ;
0704 }
0705 } //else
0706 } //if(hWndMicapsFileStatus!=NULL
0707 } //if( hWndMicaps != NULL
0708 return ( FMessage ) ;
0709 }
0710 catch ( ... )
0711 {
0712 return ( FMessage ) ;
0713 }
0714 }
0715 //---------------------------------------------------------------------------
0716 bool CMicaps::Status ( bool FFile [] , int FFileCount, int FFileStatus )
0717 //功能:设置Micaps指定项目的文件状态
0718 //参数:
0719 //FFile[] - 待选值(true为选择,false为不选)
0720 //FFileCount - 总数
0721 //FFileStatus - 状态 {MICAPS_FILE_STATUS_VIEW,MICAPS_FILE_STATUS_HIDE, MICAPS_FILE_STATUS_MODIFY, MICAPS_FILE_STATUS_EDIT, MICAPS_FILE_STATUS_MOVE}
0722 // 若 FFileFirst < 0 或 FFileLast < 0 则仅设置状态
0723 {
0724 bool FMessage = false ;
0725 try {
0726 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0727 HWND hWndMicaps = FindMicapsWindow () ;
0728 if ( hWndMicaps == NULL ) return ( FMessage ) ; //无法定位Micaps窗口
0729 DialogOption ( true ) ;
0730 HWND hWndMicapsFileStatus = NULL; //Micaps的显示设置对话框
0731 int iSleepCount = 0 ;
0732 if ( hWndMicaps != NULL
0733 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0734 && SetForegroundWindow ( hWndMicaps )
0735 )
0736 {
0737 iSleepCount = 0 ;
0738 while ( hWndMicapsFileStatus == NULL && iSleepCount < 12 )
0739 {
0740 Sleep ( 132 ) ;
0741 hWndMicapsFileStatus = FindWindow ( "#32770" , "显示设置" ) ;
0742 iSleepCount++;
0743 }
0744 int FItemCount = 0 ;
0745 if ( hWndMicapsFileStatus != NULL
0746 && ShowWindow ( hWndMicapsFileStatus,SW_SHOWNORMAL ) //显示Micaps主窗口
0747 && SetForegroundWindow ( hWndMicapsFileStatus ) //设置Micaps为当前活动窗口
0748 && GetDlgItem ( hWndMicapsFileStatus, FFileStatus ) != NULL //有状态按钮
0749 && ( FItemCount = SendDlgItemMessage (
0750 hWndMicapsFileStatus,
0751 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0752 LB_GETCOUNT, 0 , 0 )) > 0
0753 )
0754 {
0755 SendDlgItemMessage ( //取消所有项目的选择状态
0756 hWndMicapsFileStatus,
0757 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0758 LB_SELITEMRANGE,
0759 false,
0760 MAKELONG ( 0 ,FItemCount- 1 )) ;
0761 for ( int i= 0 ;i<FItemCount;i++ )
0762 if ( i<FFileCount )
0763 SendDlgItemMessage ( //选择指定项
0764 hWndMicapsFileStatus,
0765 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0766 LB_SETSEL,
0767 FFile [ i ] ,
0768 i ) ;
0769 if ( SendDlgItemMessage (
0770 hWndMicapsFileStatus,
0771 MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0772 LB_GETSELCOUNT,
0773 0 ,
0774 0 ) > 0 ) //已选择有项目
0775 { //设置文件状态
0776 SendDlgItemMessage (
0777 hWndMicapsFileStatus,
0778 FFileStatus,
0779 BM_CLICK,
0780 0 ,
0781 0 ) ;
0782 FMessage = true ;
0783 }
0784 } //if(hWndMicapsFileStatus!=NULL
0785 } //if( hWndMicaps != NULL
0786 return ( FMessage ) ;
0787 }
0788 catch ( ... )
0789 {
0790 return ( FMessage ) ;
0791 }
0792 }
0793 //---------------------------------------------------------------------------
0794 bool CMicaps::Explore ( int FTools )
0795 //功能:按下图形检索窗口的第FTools个按钮
0796 //参数:
0797 //FTools - 按钮序号 自上而下 由0开始
0798 {
0799 bool FMessage = false ;
0800 TPoint FToolsPoint = OperateTools ( FTools ) ;
0801 try {
0802 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0803 HWND hWndMicaps = FindMicapsWindow () ;
0804 HWND hWndMicapsTools; //检索窗口
0805 if ( hWndMicaps != NULL
0806 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0807 && SetForegroundWindow ( hWndMicaps )
0808 )
0809 {
0810 hWndMicapsTools = FindWindow ( "OperateClass" , "工具" ) ;
0811 FMessage = hWndMicapsTools != NULL
0812 && PostMessage ( hWndMicapsTools, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG ( FToolsPoint.x,FToolsPoint.y ) )
0813 && PostMessage ( hWndMicapsTools, WM_LBUTTONUP, MK_LBUTTON, MAKELONG ( FToolsPoint.x,FToolsPoint.y ) ) ;
0814 }
0815 return ( FMessage ) ;
0816 }
0817 catch ( ... )
0818 {
0819 return ( FMessage ) ;
0820 }
0821 }
0822 //---------------------------------------------------------------------------
0823 bool CMicaps::ZoomStatus ( void )
0824 //功能:设置Micaps窗口为缩放状态
0825 {
0826 return ( Explore ( 11 ) ) ;
0827 }
0828 //---------------------------------------------------------------------------
0829 bool CMicaps::Zoom ( bool FZoom )
0830 //功能:缩放
0831 //参数:
0832 //FZoom - 缩放标志 {true(放大), false(缩小)}
0833 {
0834 RECT lpRect;
0835 HWND hWndMicaps = FindMicapsWindow () ;
0836 int x, y;
0837 if ( GetWindowRect ( hWndMicaps, &lpRect ) )
0838 {
0839 x = ( lpRect.left + lpRect.right ) / 2 ;
0840 y = ( lpRect.top + lpRect.bottom ) / 2 ;
0841 }
0842 return ( Zoom ( FZoom,Point ( x,y ))) ;
0843 }
0844 //---------------------------------------------------------------------------
0845 bool CMicaps::Zoom ( bool FZoom, TPoint FPlace )
0846 //功能:缩放
0847 //参数:
0848 //FZoom - 缩放标志 {true(放大), false(缩小)}
0849 //FPoint - 窗口位置
0850 {
0851 bool FMessage = false ;
0852 try {
0853 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0854 HWND hWndMicaps = FindMicapsWindow () ;
0855 if ( hWndMicaps != NULL
0856 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0857 && SetForegroundWindow ( hWndMicaps )
0858 )
0859 {
0860 if ( FZoom ) ZoomStatus () ; //放大时需要将Micaps的缩放按钮设为按下状态
0861 if ( FZoom )
0862 FMessage = PostMessage ( hWndMicaps, WM_LBUTTONDBLCLK, MK_LBUTTON, MAKELONG ( FPlace.x,FPlace.y ) ) ;
0863 else
0864 FMessage = PostMessage ( hWndMicaps, WM_RBUTTONDBLCLK, MK_RBUTTON, MAKELONG ( FPlace.x,FPlace.y ) ) ;
0865 }
0866 return ( FMessage ) ;
0867 }
0868 catch ( ... )
0869 {
0870 return ( FMessage ) ;
0871 }
0872 }
0873 //---------------------------------------------------------------------------
0874 bool CMicaps::Revert ( void )
0875 //功能:还原
0876 {
0877 return ( Explore ( 1 ) ) ;
0878 }
0879 //---------------------------------------------------------------------------
0880 bool CMicaps::LongitudeLatitude ( void )
0881 //功能:经纬度隐现
0882 {
0883 return ( Explore ( 0 ) ) ;
0884 }
0885 //---------------------------------------------------------------------------
0886 bool CMicaps::Print ( void )
0887 //功能:打印Micaps主窗口
0888 {
0889 return ( Explore ( 2 ) ) ;
0890 }
0891 //---------------------------------------------------------------------------
0892 bool CMicaps::Background ( int FBackgroundType )
0893 //功能:设置Micaps背景图类型
0894 //参数:
0895 //FBackgroundType - 类型 {
0896 // MICAPS_BACKGROUNG_TYPE_BBQ,
0897 // MICAPS_BACKGROUNG_TYPE_LAMBERT,
0898 // MICAPS_BACKGROUNG_TYPE_MECATOR,
0899 // MICAPS_BACKGROUNG_TYPE_LINEAR}
0900 {
0901 AnsiString FBackFileName = FMicapsDirectory;
0902 switch ( FBackgroundType )
0903 {
0904 case MICAPS_BACKGROUNG_TYPE_BBQ:
0905 FBackFileName = FMicapsDirectory + "Code//BBQMAPXY.dat" ;
0906 break ;
0907 case MICAPS_BACKGROUNG_TYPE_LAMBERT:
0908 FBackFileName = FMicapsDirectory + "Code//LAMBERTM.dat" ;
0909 break ;
0910 case MICAPS_BACKGROUNG_TYPE_MECATOR:
0911 FBackFileName = FMicapsDirectory + "Code//MECATORM.dat" ;
0912 break ;
0913 case MICAPS_BACKGROUNG_TYPE_LINEAR:
0914 FBackFileName = FMicapsDirectory + "Code//LINEARMA.dat" ;
0915 break ;
0916 default :
0917 FBackFileName = FMicapsDirectory + "Code//BBQMAPXY.dat" ;
0918 break ;
0919 }
0920 return ( FileExists ( FBackFileName ) && OpenFile ( FBackFileName ) ) ;
0921 }
0922 //---------------------------------------------------------------------------
0923 bool CMicaps::Palette ( int FPaletteIndex )
0924 //功能:调置Micaps调色板
0925 //参数:
0926 //FPaletteIndex - 调色板索引值 0~16 缺省为 0
0927 {
0928 bool FMessage = IsMicapsRunning () ;
0929 if ( !FMessage ) return ( FMessage ) ;
0930 AnsiString FPaletteFile;
0931 FPaletteFile = FMicapsDirectory + "ColorMap//ColorMap." + FormatFloat ( "000" ,FPaletteIndex ) ;
0932 return ( FileExists ( FPaletteFile ) && OpenFile ( FPaletteFile ) ) ;
0933 }
0934 //---------------------------------------------------------------------------
0935 bool CMicaps::PrevTime ( void )
0936 //功能:前翻
0937 {
0938 return ( MenuFromId ( MICAPS_MENU_PREVTIME )) ;
0939 }
0940 //---------------------------------------------------------------------------
0941 bool CMicaps::NextTime ( void )
0942 //功能:后翻
0943 {
0944 return ( MenuFromId ( MICAPS_MENU_NEXTTIME )) ;
0945 }
0946 //---------------------------------------------------------------------------
0947 bool CMicaps::Animate ( void )
0948 //功能:动画
0949 {
0950 return ( MenuFromId ( MICAPS_MENU_ANIMATE )) ;
0951 }
0952 //---------------------------------------------------------------------------
0953 bool CMicaps::Tools ( int FColIndex, int FRowIndex )
0954 //功能:针对图形检索窗口的操作
0955 //参数:
0956 //FColIndex - 列数
0957 //FRowIndex - 行数
0958 {
0959 return ( Tools ( EditTools ( FColIndex,FRowIndex ))) ;
0960 }
0961 //---------------------------------------------------------------------------
0962 bool CMicaps::Tools ( TPoint FEditPoint )
0963 //功能:针对工具窗口的操作
0964 //参数说明:
0965 //FEditPoint - 位置
0966 {
0967 bool FMessage = false ;
0968 try {
0969 if ( !IsMicapsRunning () ) return ( FMessage ) ; //Micaps未运行
0970 HWND hWndMicaps = FindMicapsWindow () ;
0971 HWND hWndMicapsEditTools = NULL; //工具窗口
0972 if ( hWndMicaps != NULL
0973 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
0974 && SetForegroundWindow ( hWndMicaps )
0975 )
0976 {
0977 MenuFromId ( MICAPS_MENU_EDITTOOL ) ;
0978 hWndMicapsEditTools = FindWindow ( "EditClass" , "工具" ) ;
0979 if ( hWndMicapsEditTools != NULL )
0980 {
0981 FMessage =
0982 PostMessage ( hWndMicapsEditTools, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG ( FEditPoint.x,FEditPoint.y ) )
0983 && PostMessage ( hWndMicapsEditTools, WM_LBUTTONUP, MK_LBUTTON, MAKELONG ( FEditPoint.x,FEditPoint.y ) ) ;
0984 }
0985 }
0986 return ( FMessage ) ;
0987 }
0988 catch ( ... )
0989 {
0990 return ( FMessage ) ;
0991 }
0992 }
0993 //---------------------------------------------------------------------------
0994 bool CMicaps::Transparency ( void )
0995 //功能:清透明板
0996 {
0997 return ( MenuFromId ( MICAPS_MENU_TRANSPARENCY )) ;
0998 }
0999 //---------------------------------------------------------------------------
1000 bool CMicaps::DialogTools ( bool FEditToolsDlg )
1001 //功能:隐现工具对话框
1002 //参数:
1003 //FEditToolsDlg - 隐现标志 (true 为显示,false 为消隐)
1004 {
1005 bool FMessage = false ;
1006 try {
1007 if ( IsMicapsRunning () )
1008 {
1009 if ( FEditToolsDlg )
1010 FMessage = MenuFromId ( MICAPS_MENU_EDITTOOL ) ;
1011 else
1012 {
1013 HWND hWndMicapsEditTools = FindWindow ( "EditClass" , "工具" ) ;
1014 if ( hWndMicapsEditTools != NULL )
1015 FMessage = PostMessage ( hWndMicapsEditTools, WM_CLOSE, 0 , 0 ) ;
1016 }
1017 }
1018 return ( FMessage ) ;
1019 }
1020 catch ( ... )
1021 {
1022 return ( FMessage ) ;
1023 }
1024 }
1025 //---------------------------------------------------------------------------
1026 bool CMicaps::DialogOption ( bool FViewOptionDlg )
1027 //功能:隐现显示设置对话框
1028 //参数:
1029 //FViewOptionDlg - 隐现标志 (true 为显示,false 为消隐)
1030 {
1031 bool FMessage = false ;
1032 try {
1033 if ( IsMicapsRunning () )
1034 {
1035 if ( FViewOptionDlg )
1036 FMessage = MenuFromId ( MICAPS_MENU_VIEWOPTION ) ;
1037 else
1038 {
1039 HWND hWndMicapsViewOption = FindWindow ( "#32770" , "显示设置" ) ;
1040 if ( hWndMicapsViewOption != NULL )
1041 FMessage = PostMessage ( hWndMicapsViewOption, WM_CLOSE, 0 , 0 ) ;
1042 }
1043 }
1044 return ( FMessage ) ;
1045 }
1046 catch ( ... )
1047 {
1048 return ( FMessage ) ;
1049 }
1050 }
1051 //---------------------------------------------------------------------------
1052 bool CMicaps::PointEvent ( POINTEVENT *FPointEvent, int FPointCount )
1053 //功能:在指定的窗口位置按下指定的鼠标键
1054 //参数:
1055 //FPointEvent - 包含鼠标操作信息(窗口)的结构地址 &FPointEvent
1056 //FPointCount - FPointEvent[]的总数
1057 {
1058 bool FMessage = false ;
1059 HWND hWndMicaps = FindMicapsWindow () ;
1060 if ( hWndMicaps == NULL ) return ( false ) ;
1061 try {
1062 for ( int i= 0 ;i<FPointCount;i++ )
1063 {
1064 PostMessage (
1065 hWndMicaps,
1066 FPointEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1067 FPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1068 MAKELONG ( FPointEvent [ i ] .Place.x,FPointEvent [ i ] .Place.y ) ) ;
1069 PostMessage (
1070 hWndMicaps,
1071 FPointEvent [ i ] .Event ? WM_LBUTTONUP : WM_RBUTTONUP,
1072 FPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1073 MAKELONG ( FPointEvent [ i ] .Place.x,FPointEvent [ i ] .Place.y ) ) ;
1074 }
1075 FMessage = true ;
1076 return ( FMessage ) ;
1077 }
1078 catch ( ... )
1079 {
1080 return ( FMessage ) ;
1081 }
1082 }
1083 //---------------------------------------------------------------------------
1084 bool CMicaps::PointEvent ( FLOATPOINTEVENT *FFloatPointEvent, int FFloatPointCount )
1085 //功能:在指定的经纬度按下指定的鼠标键
1086 //参数:
1087 //FPointEvent - 包含鼠标操作信息(经纬度)的结构地址 &FPointEvent
1088 //FPointCount - FPointEvent[]的总数
1089 {
1090 bool FMessage = false ;
1091 HWND hWndMicaps = FindMicapsWindow () ;
1092 if ( hWndMicaps == NULL || !FCoordinateEnabled ) return ( false ) ;
1093 try {
1094 TPoint pp;
1095 // CCoordinate
1096 for ( int i= 0 ;i<FFloatPointCount;i++ )
1097 {
1098 pp = FCoordinate->WindowPlace ( FFloatPointEvent [ i ] .Place ) ;
1099 PostMessage (
1100 hWndMicaps,
1101 FFloatPointEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1102 FFloatPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1103 MAKELONG ( pp.x,pp.y ) ) ;
1104 PostMessage (
1105 hWndMicaps,
1106 FFloatPointEvent [ i ] .Event ? WM_LBUTTONUP : WM_RBUTTONUP,
1107 FFloatPointEvent [ i ] .Event ? MK_LBUTTON : MK_RBUTTON,
1108 MAKELONG ( pp.x,pp.y ) ) ;
1109 }
1110 FMessage = true ;
1111 return ( FMessage ) ;
1112 }
1113 catch ( ... )
1114 {
1115 return ( FMessage ) ;
1116 }
1117 }
1118 //---------------------------------------------------------------------------
1119 bool CMicaps::PointEvent ( OBJECTEVENT *FObjectEvent, int FObjectEventCount )
1120 //功能:在指定的窗口位置按下指定的鼠标键
1121 //功能:
1122 //参数:
1123 //FObjectEvent - 包含鼠标操作信息(键、事件、经、纬度)的结构地址
1124 //FObjectEventCount - FObjectEvent 的数据长度
1125 {
1126 bool FMessage = false ;
1127 UINT FButton, FEvent;
1128 RECT lpRect;
1129 TPoint pp;
1130 HWND hWndMicaps = FindMicapsWindow () ;
1131 if ( hWndMicaps == NULL || !FCoordinateEnabled ) return ( false ) ;
1132 try {
1133 for ( int i= 0 ;i<FObjectEventCount;i++ )
1134 {
1135 pp = FCoordinate->WindowPlace ( FObjectEvent [ i ] .Longitude,FObjectEvent [ i ] .Latitude ) ;
1136 //鼠标键
1137 if ( FObjectEvent [ i ] .Button == 0 )
1138 FButton = MK_LBUTTON;
1139 else
1140 FButton = MK_RBUTTON;
1141 //事件
1142 if ( FObjectEvent [ i ] .Event == 0 )
1143 FEvent = FObjectEvent [ i ] .Button == 0 ? WM_LBUTTONDOWN : WM_RBUTTONDOWN;
1144 else if ( FObjectEvent [ i ] .Event == 1 )
1145 FEvent = FObjectEvent [ i ] .Button == 0 ? WM_LBUTTONUP : WM_RBUTTONUP;
1146 else if ( FObjectEvent [ i ] .Event == 3 )
1147 FEvent = FObjectEvent [ i ] .Button == 0 ? WM_LBUTTONDBLCLK : WM_RBUTTONDBLCLK;
1148 else FEvent = FObjectEvent [ i ] .Event;
1149 switch ( FObjectEvent [ i ] .Event )
1150 {
1151 case MICAPS_CONTROL_CLICK: //单击事件包含按下和弹起两个事件
1152 PostMessage (
1153 hWndMicaps,
1154 FObjectEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1155 FObjectEvent [ i ] .Button ? MK_LBUTTON : MK_RBUTTON,
1156 MAKELONG ( pp.x,pp.y ) ) ;
1157 PostMessage (
1158 hWndMicaps,
1159 FObjectEvent [ i ] .Event ? WM_LBUTTONDOWN : WM_RBUTTONDOWN,
1160 FObjectEvent [ i ] .Button ? MK_LBUTTON : MK_RBUTTON,
1161 MAKELONG ( pp.x,pp.y ) ) ;
1162 break ;
1163 default :
1164 PostMessage (
1165 hWndMicaps,
1166 FEvent,
1167 FButton,
1168 MAKELONG ( pp.x,pp.y ) ) ;
1169 break ;
1170 }
1171 }
1172 FMessage = true ;
1173 return ( FMessage ) ;
1174 }
1175 catch ( ... )
1176 {
1177 return ( FMessage ) ;
1178 }
1179 }
1180 //---------------------------------------------------------------------------
1181 bool CMicaps::MicapsClientRect ( LPRECT lpRect )
1182 //功能:获得Micaps窗口区域
1183 //参数:
1184 //lpRect - 指向Micaps窗口区域的RECT结构的指针
1185 {
1186 HWND hWndMicaps = FindMicapsWindow () ;
1187 bool bMessage = ::GetClientRect ( hWndMicaps, lpRect ) ;
1188 return ( bMessage ) ;
1189 }
1190 //---------------------------------------------------------------------------
1191 bool CMicaps::MicapsWindowRect ( LPRECT lpRect )
1192 //功能:获得Micaps窗口区域
1193 //参数:
1194 //lpRect - 指向Micaps窗口区域的RECT结构的指针
1195 {
1196 HWND hWndMicaps = FindMicapsWindow () ;
1197 bool bMessage = ::GetWindowRect ( hWndMicaps, lpRect ) ;
1198 return ( bMessage ) ;
1199 }
1200 //---------------------------------------------------------------------------
1201 bool CMicaps::OperateFromFile ( AnsiString FOperateFile )
1202 //功能:根据预定义的操作记录文件来执行Micaps操作
1203 //功能:
1204 //参数:
1205 //FOperateFile - 文件名
1206 {
1207 bool FMessage = false ;
1208 if ( !FileExists ( FOperateFile ) ) return ( FMessage ) ;
1209 Sleep ( 1032 ) ;
1210 MICAPSEVENT me;
1211 OBJECTEVENT *oe;
1212 try {
1213 oe = new OBJECTEVENT [ 12 ] ;
1214 int iFileHandle = FileOpen ( FOperateFile,fmOpenRead ) ;
1215 int iFileRead = - 1 ;
1216 char Symbol [ 33 ] ;
1217 if ( iFileHandle != - 1 )
1218 {
1219 iFileRead = FileRead ( iFileHandle, ( LPSTR ) Symbol, 32 ) ; //First
1220 Symbol [ 32 ] = '/0' ;
1221 }
1222 if ( iFileHandle != - 1 && AnsiString ( Symbol ) == "MicapsControl-LiuZeJun-CBuilder5" )
1223 {
1224 iFileRead = FileRead ( iFileHandle, ( LPSTR ) &me,sizeof ( MICAPSEVENT )) ; //First
1225 while ( iFileRead == sizeof ( MICAPSEVENT )
1226 && me.Object != MICAPS_OBJECT_NULL
1227 && me.Count > 0 )
1228 {
1229 oe = new OBJECTEVENT [ me.Count ] ;
1230 for ( int i= 0 ;i<me.Count;i++ )
1231 iFileRead = FileRead ( iFileHandle, ( LPSTR ) &oe [ i ] , sizeof ( OBJECTEVENT )) ;
1232
1233 FMessage = Operate ( me, oe ) ;
1234 iFileRead = FileRead ( iFileHandle, ( LPSTR ) &me,sizeof ( MICAPSEVENT )) ; //Next
1235 }
1236 FileClose ( iFileHandle ) ;
1237 iFileHandle = - 1 ;
1238 delete oe;
1239 }
1240 if ( iFileHandle != - 1 )
1241 FileClose ( iFileHandle ) ;
1242 return ( FMessage ) ;
1243 }
1244 catch ( ... )
1245 {
1246 return ( FMessage ) ;
1247 }
1248 }
1249 //---------------------------------------------------------------------------
1250 bool CMicaps::Operate ( MICAPSEVENT FMicapsEvent, OBJECTEVENT *FObjectEvent )
1251 //功能:执行Micaps操作
1252 //参数:
1253 //FMicapsEvent - 包含要操纵的Micaps对象及次数的数据结构
1254 //FObjectEvent - 包含鼠标操作信息(键、事件、经、纬度)的结构地址
1255 {
1256 bool FMessage = false ;
1257 switch ( FMicapsEvent.Object )
1258 {
1259 case MICAPS_OBJECT_NULL:
1260 break ;
1261 case MICAPS_OBJECT_MICAPS: //Micaps主窗口
1262 Revert () ; //还原
1263 FMessage = PointEvent ( FObjectEvent,FMicapsEvent.Count ) ;
1264 break ;
1265 case MICAPS_OBJECT_MENU: //Micaps主菜单
1266 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1267 FMessage = MenuFromId ( FObjectEvent [ i ] .Event ) ;
1268 break ;
1269 case MICAPS_OBJECT_TOOLS: //Micaps工具窗口
1270 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1271 {
1272 if ( FObjectEvent [ i ] .Longitude == - 1 || FObjectEvent [ i ] .Latitude == - 1 )
1273 FMessage = DialogTools ( false ) ;
1274 else if ( FObjectEvent [ i ] .Longitude == - 2 || FObjectEvent [ i ] .Latitude == - 2 )
1275 FMessage = DialogTools ( true ) ;
1276 else
1277 FMessage = Tools (
1278 FObjectEvent [ i ] .Longitude,
1279 FObjectEvent [ i ] .Latitude ) ;
1280 }
1281 break ;
1282 case MICAPS_OBJECT_EXPLORE: //Micaps检索窗口
1283 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1284 FMessage = Explore ( FObjectEvent [ i ] .Latitude ) ;
1285 break ;
1286 case MICAPS_OBJECT_OPTION: //Micaps显示设置窗口
1287 for ( int i= 0 ;i<FMicapsEvent.Count;i++ )
1288 {
1289 if ( FObjectEvent [ i ] .Longitude == - 3 || FObjectEvent [ i ] .Latitude == - 3 )
1290 FMessage = DialogOption ( false ) ;
1291 else if ( FObjectEvent [ i ] .Longitude == - 4 || FObjectEvent [ i ] .Latitude == - 4 )
1292 FMessage = DialogOption ( true ) ;
1293 else
1294 FMessage = Status (
1295 FObjectEvent [ i ] .Longitude, //First Item Index
1296 FObjectEvent [ i ] .Latitude, //Last Item Index
1297 FObjectEvent [ i ] .Event ) ;
1298 }
1299 break ;
1300 default :
1301 break ;
1302 }
1303 return ( FMessage ) ;
1304 }
1305 //---------------------------------------------------------------------------
1306 AnsiString CMicaps::GetOpenFileName ( void )
1307 //功能:返回当前Micaps打开的文件名
1308 {
1309 return ( FCurrentOpenFileName ) ;
1310 }
1311 //---------------------------------------------------------------------------
1312 bool CMicaps::SetParentWindow ( HWND hNewParentWindow )
1313 {
1314 if ( hNewParentWindow != NULL )
1315 return ( SetParent ( FindMicapsWindow () , hNewParentWindow ) != NULL ) ;
1316 else
1317 return ( false ) ;
1318 }
1319 //---------------------------------------------------------------------------
1320 bool CMicaps::SetChildWindow ( HWND hNewChildWindow )
1321 {
1322 if ( hNewChildWindow != NULL )
1323 return ( SetParent ( hNewChildWindow, FindMicapsWindow () ) != NULL ) ;
1324 else
1325 return ( false ) ;
1326 }
1327 //---------------------------------------------------------------------------
1328 bool CMicaps::Show ( void )
1329 {
1330 HWND hWndMicaps = FindMicapsWindow () ;
1331 return ( hWndMicaps != NULL
1332 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL )
1333 && SetForegroundWindow ( hWndMicaps ) ) ;
1334 }
1335 //---------------------------------------------------------------------------
1336 bool CMicaps::SaveMicapsImage ( AnsiString ImageFileName )
1337 //功能:以Bitmap位图方式保存Micaps主窗口的图像信息 - 用于气象信息网站建设所需
1338 //
1339 //ImageFileName - 目标文件名
1340 //
1341 {
1342 HWND hWndMicaps = FindMicapsWindow () ;
1343 if ( hWndMicaps == NULL ) return ( false ) ;
1344 HWND hWndMicapsTools = FindWindow ( "OperateClass" , "工具" ) ;
1345 if ( hWndMicapsTools == NULL ) return ( false ) ;
1346 TRect mrect;
1347 bool move =
1348 GetWindowRect ( hWndMicapsTools,&mrect )
1349 && MoveWindow ( hWndMicapsTools,
1350 -mrect.Right- 1 ,mrect.Top,-mrect.Right- 1 +mrect.Width () ,mrect.Height () ,true ) ;
1351 bool ok = false ;
1352
1353 if ( hWndMicaps != NULL //主窗口
1354 && hWndMicapsTools != NULL //数据检索窗口
1355 && GetDC ( hWndMicaps ) != NULL //主窗口设备描述表
1356 && ShowWindow ( hWndMicaps,SW_SHOWNORMAL ) //显示主窗口
1357 && SetForegroundWindow ( hWndMicaps ) //将主窗口设置为前端显示
1358 && DialogTools ( false ) //隐藏工具窗口
1359 && DialogOption ( false ) ) //隐藏显示设置窗口
1360 {
1361 HDC dc = GetDC ( hWndMicaps ) ;
1362 TRect rect;
1363 Graphics::TBitmap *bitmap = new Graphics::TBitmap () ;
1364 MicapsClientRect ( &rect ) ;
1365 bitmap->Width = rect.Width () ;
1366 bitmap->Height = rect.Height () ;
1367 UpdateWindow ( hWndMicaps ) ;
1368 bool ok1 = BitBlt (
1369 ( HDC ) bitmap->Canvas->Handle, // handle to destination device context
1370 0 , // x-coordinate of destination rectangle's upper-left corner
1371 0 , // y-coordinate of destination rectangle's upper-left corner
1372 rect.Width () , // width of destination rectangle
1373 rect.Height () , // height of destination rectangle
1374 dc, // handle to source device context
1375 0 , // x-coordinate of source rectangle's upper-left corner
1376 0 , // y-coordinate of source rectangle's upper-left corner
1377 SRCCOPY // raster operation code
1378 ) ;
1379 if ( ok1 )
1380 {
1381 bitmap->SaveToFile ( ImageFileName ) ;
1382 ok = ok1 && FileExists ( ImageFileName ) ;
1383 }
1384 delete bitmap;
1385 }
1386 if ( move )
1387 MoveWindow ( hWndMicapsTools,mrect.Left,mrect.Top,mrect.Width () ,mrect.Height () ,true ) ;
1388 return ( ok ) ;
1389 }
1390 //---------------------------------------------------------------------------