模拟人工操作Micaps1.0的C++类源代码

通过应用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:[email protected]
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 
0046  #include 
0047  #pragma hdrstop
0048 
0049  #include  "CMicaps.h"
0050  //---------------------------------------------------------------------------
0051  #include 
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 ) ;
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 ==  )
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 <  )
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 ;iCount;i++  )
0393           {
0394           if StringList->Strings [ i ] .Pos ( FOrStr )
0395               {
0396               ExtractString ( StringList->Strings [ i ] ,FOrStr,false,ChildStringList ) ;
0397               for ( int  j= 0 ;jCount;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 ;jCount;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 ;iGetCount () ;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 ;iCount;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 ) ;
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 < - )    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 >  )
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 )
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 <  || FFileLast <  )
0646                   { //仅设置文件状态
0647                   if SendDlgItemMessage (
0648                           hWndMicapsFileStatus,
0649                           MICAPS_DLG_VIEWOPTION_LISTBOXCTRL,
0650                           LB_GETSELCOUNT,
0651                           0 ,
0652                           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 -  )
0675                       FFileFirst = FItemCount -  1 ;
0676                   if FFileLast  > FItemCount -  )
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 ) //已选择有项目
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 )
0762                   if i )
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 ) //已选择有项目
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 ) ;
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 ) ;
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 )
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 )
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 )
1134           {
1135           pp = FCoordinate->WindowPlace ( FObjectEvent [ i ] .Longitude,FObjectEvent [ i ] .Latitude ) ;
1136  //鼠标键
1137           if FObjectEvent [ i ] .Button ==  )
1138               FButton = MK_LBUTTON;
1139           else
1140               FButton = MK_RBUTTON;
1141  //事件
1142           if FObjectEvent [ i ] .Event  ==  )
1143               FEvent  = FObjectEvent [ i ] .Button ==  ? WM_LBUTTONDOWN   : WM_RBUTTONDOWN;
1144           else if FObjectEvent [ i ] .Event  ==  )
1145               FEvent  = FObjectEvent [ i ] .Button ==  ? WM_LBUTTONUP     : WM_RBUTTONUP;
1146           else if FObjectEvent [ i ] .Event  ==  )
1147               FEvent  = FObjectEvent [ i ] .Button ==  ? 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 != - )
1218           {
1219           iFileRead = FileRead ( iFileHandle, ( LPSTR ) Symbol, 32 ) ; //First
1220           Symbol [ 32 '/0' ;
1221           }
1222       if iFileHandle != - && 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 )
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 != - )
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 )
1267                   FMessage = MenuFromId ( FObjectEvent [ i ] .Event ) ;
1268               break ;
1269           case  MICAPS_OBJECT_TOOLS: //Micaps工具窗口
1270               for int  i= 0 ;i )
1271                   {
1272                   if FObjectEvent [ i ] .Longitude == - || FObjectEvent [ i ] .Latitude == - )
1273                       FMessage = DialogTools ( false ) ;
1274                   else if FObjectEvent [ i ] .Longitude == - || FObjectEvent [ i ] .Latitude == - )
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 )
1284                   FMessage = Explore ( FObjectEvent [ i ] .Latitude ) ;
1285               break ;
1286           case  MICAPS_OBJECT_OPTION: //Micaps显示设置窗口
1287               for int  i= 0 ;i )
1288                   {
1289                   if FObjectEvent [ i ] .Longitude == - || FObjectEvent [ i ] .Latitude == - )
1290                       FMessage = DialogOption ( false ) ;
1291                   else if FObjectEvent [ i ] .Longitude == - || FObjectEvent [ i ] .Latitude == - )
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  //---------------------------------------------------------------------------

你可能感兴趣的:(C/C++,Micaps,c++,null,file,工具,menu,object)