mapgis6.7二次开发vc6_demo 之一(主窗体构架)

mapgis6.7二次开发vc6_demo 之一(主窗体构架)

本文根据mapgis6.7 sdk开发包中实例程序和help.chm帮助文件

进行的学习心得总结:

//stdafx.h文件内容如下所示 :

#include  <windows.h>


//#include "demo.h" 文件内容如下所示 :

//#include "demo.h"
#if !defined(AFX_DEMO_H__8E07CFE6_850E_11D4_9287_444553540000__INCLUDED_)

#define AFX_DEMO_H__8E07CFE6_850E_11D4_9287_444553540000__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "resource.h"

#include "string.h"
#include <iostream>
#include <comutil.h>
using namespace std;

//定义函数声明

int DoWMCommand( HWND hWnd, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK  GrpProc(HWND, UINT, WPARAM, LPARAM);

BOOL _InitWindow(int nCmdShow);
BOOL _InitWindowFirst(void);
BOOL _InitWindowEvery(int nCmdShow);

void _EnableWinMenu(void);

short LoadFiles(short type);
short SaveFiles(short type);
short SaveFilesAs(short type);
short CloseFiles(short type);
void DispADotLable(HDC hdc,long i);
void DispAllDotLable(HDC hdc);
void _DispAbout(void);
//
void _ProcLBUTTONDOWN(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam);
void _ProcLBUTTONUP(  HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam);
void _ProcMOUSEMOVE(  HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam);
void _ProcRBUTTONUP(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam);
void _ProcSETCURSOR(HWND hWnd,WPARAM wParam, LPARAM lParam);

//
void ShowMsg(char* msg);
void Vct_Export();
void D2A_test();

//common op  function  公共操作函数
char* i2cp(int n);
char* l2cp(long n);
char* d2cp(double value);
char* short2cp(short value);
char* getdir_lc(char* s,const char* d);
char* getfilename_lc(char* s,const char* d);
//
char* GetDiskSpace_lc(unsigned char dsk);
//
char* GetCurDir(void);
int WriteToLog(char* str);
int WriteToLog(const char* str);
int WriteToLog_f_delete(void);
char* UnionStr(const char* A,const char* B);
char* strcat_lc(const char* A,const char* B);
const char* StrCopy(const char* src);
char* strcpy_lc(const char* src);
bool EqStr(const char* A,const char* B);
bool IsNumber(string str);
//file op function 文件操作函数
//----------------------------
//文件操作方法
void f_SetFilePath(char* pfilepath);
int f_delete(char* pfilepath);
bool f_OpenFile_r(void);
bool f_OpenFile_w(void);
int f_EndFile(void);
char* f_NextLine();
int f_WriteLine(char* line);
int f_FlushFile(void);
int f_CloseFile(void);
//----------------------------
bool OutVctHeadBeginEnd();                        //输出vct文件头
bool OutVctFeatureCodeBeginEnd(short* ptALst);    //输出vct要素代码
bool OutVctTableStructureBeginEnd(short* ptALst); //输出vct表结构 
//输出线坐标 OK 
bool OutVctLineBeginEnd(short ai);
//输出属性值 OK
bool OutVctAttributeBeginEnd(short ai);
//----------------------------

#endif // !defined(AFX_DEMO_H__8E07CFE6_850E_11D4_9287_444553540000__INCLUDED_)


//Resource.h文件内容如下所示 :

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by demo.rc
//
#define IDMN_NULL                       0x0000
#define PAINTING                        0x0004
#define IDD_DIALOG_VCT_EXP              102
#define IDR_MENU1                       132
#define IDC_DEMO                        132
#define IDC_LIST1                       1000
#define IDC_EDIT1                       1001
#define IDC_BTN_SAVEVCTAS               1002
#define IDMN_LOAD_PNT                   32771
#define IDMN_SAVE_PNT                   32772
#define IDMN_SAVE_PNT_AS                32773
#define IDMN_CLOSE_PNT                  32774
#define IDMN_LOAD_LIN                   32775
#define IDMN_SAVE_LIN                   32776
#define IDMN_SAVE_LIN_AS                32777
#define IDMN_CLOSE_LIN                  32778
#define IDMN_LOAD_REG                   32779
#define IDMN_SAVE_REG                   32780
#define IDMN_SAVE_REG_AS                32781
#define IDMN_CLOSE_REG                  32782
#define IDMN_CLOSE_FILE                 32783
#define IDMN_EXIT                       32784
#define IDMN_MOD_ENV                    32791
#define IDMN_DOT_VIEWABLE               32792
#define IDMN_ARC_VIEWABLE               32793
#define IDMN_ORIGNAL_DISP               32794
#define IDMN_ABOUT                      32795
#define IDMN_VCT_EXPORT                 40001
#define IDMN_ENLG_WIN_C                 40002
#define IDMN_REDU_WIN_C                 40003
#define IDMN_MOVE_WIN_C                 40004
#define IDMN_REST_WIN_C                 40005
#define IDMN_UPDT_WIN_C                 40006
#define IDMN_CLEA_WIN_C                 40007
#define IDMN_D2A                        40008

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        103
#define _APS_NEXT_COMMAND_VALUE         40009
#define _APS_NEXT_CONTROL_VALUE         1003
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//demo.rc文件内容如下所示:主窗体的资源文件内容 菜单的定义

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDC_DEMO MENU DISCARDABLE 
BEGIN
    POPUP "&F文件"
    BEGIN
        MENUITEM "&P装入点",                    IDMN_LOAD_PNT
        MENUITEM "存   点",                     IDMN_SAVE_PNT
        MENUITEM "换名存点",                    IDMN_SAVE_PNT_AS
        MENUITEM "关闭点文件",                  IDMN_CLOSE_PNT
        MENUITEM SEPARATOR
        MENUITEM "&L装入线",                    IDMN_LOAD_LIN
        MENUITEM "存   线",                     IDMN_SAVE_LIN
        MENUITEM "换名存线",                    IDMN_SAVE_LIN_AS
        MENUITEM "关闭线文件",                  IDMN_CLOSE_LIN
        MENUITEM SEPARATOR
        MENUITEM "&R装入区",                    IDMN_LOAD_REG
        MENUITEM "存   区",                     IDMN_SAVE_REG
        MENUITEM "换名存区",                    IDMN_SAVE_REG_AS
        MENUITEM "关闭区文件",                  IDMN_CLOSE_REG
        MENUITEM SEPARATOR
        MENUITEM "关闭文件",                    IDMN_CLOSE_FILE, GRAYED
        MENUITEM "&X退  出",                    IDMN_EXIT
    END
    POPUP "&W窗口"
    BEGIN
        MENUITEM "&L放大窗口",                  IDMN_ENLG_WIN_C, GRAYED
        MENUITEM "&S缩小窗口",                  IDMN_REDU_WIN_C, GRAYED
        MENUITEM "&M移动窗口",                  IDMN_MOVE_WIN_C, GRAYED
        MENUITEM "&R复位窗口",                  IDMN_REST_WIN_C, GRAYED
        MENUITEM "&U更新窗口",                  IDMN_UPDT_WIN_C, GRAYED
        MENUITEM "&C清窗口",                    IDMN_CLEA_WIN_C, GRAYED
    END
    POPUP "&O选择"
    BEGIN
        MENUITEM "&V修改环境",                  IDMN_MOD_ENV
        MENUITEM SEPARATOR
        MENUITEM "&S坐标点可见?",               IDMN_DOT_VIEWABLE
        MENUITEM "&A弧段可见?",                 IDMN_ARC_VIEWABLE
        MENUITEM "&O还原显示?",                 IDMN_ORIGNAL_DISP
    END
    POPUP "&H帮助"
    BEGIN
        MENUITEM "关于系统",                    IDMN_ABOUT
    END
    POPUP "&T常用工具"
    BEGIN
        MENUITEM "输出VCT top0",                IDMN_VCT_EXPORT
        MENUITEM "doubleToString一个实例",      IDMN_D2A
    END
END


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG_VCT_EXP DIALOG DISCARDABLE  0, 0, 216, 166
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "VCT导出功能"
FONT 10, "System"
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,78,145,50,14
    PUSHBUTTON      "关闭",IDCANCEL,159,145,50,14
    GROUPBOX        "请选择要输出的图层:",IDC_STATIC,7,7,202,99
    CONTROL         "List1",IDC_LIST1,"SysListView32",LVS_REPORT | 
                    LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_AUTOARRANGE | 
                    WS_BORDER | WS_GROUP | WS_TABSTOP,13,18,190,84
    LTEXT           "输出vct文件路径:",IDC_STATIC,13,110,94,10
    EDITTEXT        IDC_EDIT1,14,122,192,10,ES_AUTOHSCROLL
    PUSHBUTTON      "...",IDC_BTN_SAVEVCTAS,176,110,29,12
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    IDD_DIALOG_VCT_EXP, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 209
        TOPMARGIN, 7
        BOTTOMMARGIN, 159
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // Chinese (中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

//MainFrm.cpp文件内容如下所示:

#include "stdafx.h"
#include "resource.h"
#include <stdio.h>
//引用mapgis库头文件
#include "win_area.h"
#include "win_oper.h"
#include "map_out.h"
//
#include "demo.h"
//应用程序标题
char* AppTitle="mapgis6.7二次开发vc6_demo";
//
HINSTANCE     HInst;                       //实例句柄
HWND          MainWnd=NULL;                //主窗口句柄
HWND          GrpWnd=NULL;                 //图形窗口句柄
HCURSOR       DefHCursor=NULL;             //绘图窗口缺省光标
HCURSOR       LargeHCursor=NULL;           //绘图窗口放大光标
HCURSOR       ReduceHCursor=NULL;          //绘图窗口缩小光标
HCURSOR       CrossHCursor=NULL;           //绘图窗口十字光标
int           ComState=0;                  //菜单命令状态
int           CurState=0;                  //当前操作状态
AREA_HINST    AHInst;

//==============   启动入口   ================//
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpszCmdLine, int nCmdShow )
{
     MSG        msg;
     HACCEL hlpAccel=NULL;                  //加速键表
     if(hPrevInstance)        return(FALSE);
	 //初始化工作区
    AHInst=_InitWorkArea(hInstance);
    HInst = hInstance;
	//初始化窗体
    if(!_InitWindow(nCmdShow))  return(FALSE);
	//装载快捷键
    hlpAccel=LoadAccelerators(HInst,(LPCTSTR)IDC_DEMO);
	//消息循环
    while(GetMessage(&msg,NULL,0,0)){         
         if(!TranslateAccelerator(MainWnd,hlpAccel,&msg)){             
             TranslateMessage(&msg);
             DispatchMessage(&msg);
         }
    }
    return(msg.wParam);
}

BOOL _InitWindow(int nCmdShow){
    if(!_InitWindowFirst())   return(FALSE);
    if(!_InitWindowEvery(nCmdShow))  return(FALSE);
    return(TRUE);
}

//创建窗体
//初始化窗体第一次
BOOL _InitWindowFirst(){
         WNDCLASS    wc;
    DefHCursor=LoadCursor(NULL,IDC_ARROW);               //绘图窗口缺省光标
    wc.style        =CS_HREDRAW | CS_VREDRAW ;
    wc.lpfnWndProc  =(WNDPROC)WndProc;             //设置回调函数WndProc
    wc.cbClsExtra   =0;
    wc.cbWndExtra   =0;
    wc.hInstance    =HInst;
    wc.hIcon        =NULL;                   //LoadIcon(hInstance,"MAP_EDIT");
    wc.hCursor      =DefHCursor;     //LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName =(LPCSTR)IDC_DEMO;    //指定菜单栏
    wc.lpszClassName="ClipMainClass";
    RegisterClass(&wc);

    wc.lpfnWndProc  =(WNDPROC)GrpProc;            //设置回调函数GrpProc
    wc.cbClsExtra   =sizeof(WORD);
    wc.hIcon        =NULL;
    wc.lpszMenuName =NULL;
    wc.hCursor      =DefHCursor;     //LoadCursor(hInstance,"EditCurPen");
    wc.lpszClassName="ClipGrpClass";	
    RegisterClass(&wc);
    return(1);
}

//初始化窗体Every
BOOL _InitWindowEvery(int nCmdShow){
         HMENU    hmn;
         char    wndName[32];
    _ShowMapGisBmp();
    hmn=LoadMenu(HInst,(LPCSTR)IDC_DEMO);  //加载菜单栏
    LoadString(HInst,4,wndName,32);    //wndName	
    MainWnd=CreateWindow("ClipMainClass",(LPCSTR)AppTitle,
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,               // Default horizontal position.
                           CW_USEDEFAULT,              // Default vertical position.
                           CW_USEDEFAULT,                    // Default width.
                           CW_USEDEFAULT,               // Default height.
                           NULL,                           // Overlapped windows have no parent.
                           hmn,                              // Use the window class menu.
                           HInst,                    // This instance owns this window.
                           NULL);
    ShowWindow(MainWnd,nCmdShow);
    UpdateWindow(MainWnd);
    _CloseMapGisBmp();
    if(MainWnd==NULL)
         return(FALSE);
    return(TRUE);
}
//装载我的光标函数(从BAS60.DLL组件中)
short LoadMyCursor(void){
    HINSTANCE   hinst;
    hinst=GetModuleHandle("BAS60.DLL");
    LargeHCursor=LoadCursor(hinst,"LargeCursor");       //绘图窗口放大光标
    ReduceHCursor=LoadCursor(hinst,"ReduceCursor");     //绘图窗口缩小光标
    CrossHCursor=LoadCursor(hinst,"CrossCursor");        //绘图窗口十字光标
    return(1);
}
//释放我的光标函数
short DestroyMyCursor(void){
    DestroyCursor(LargeHCursor);
    DestroyCursor(ReduceHCursor);
    DestroyCursor(CrossHCursor);
    return(1);
}
//创建Grp窗体 函数
int CreateGrpWindow(HWND hWnd){  //AppTitle
     GrpWnd=CreateWindow(
                         (LPCSTR)"ClipGrpClass",
                         (LPCSTR)AppTitle,
                         WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         hWnd,
                         NULL,
                         HInst,
                         NULL
                        );
     if(GrpWnd==NULL){          
          PostQuitMessage(0);
          return(0);
     }
     return(1);
}

//修改Grp窗体尺寸函数
void ModifyGrpWndSize(LPARAM lParam){
    MoveWindow(GrpWnd, 0, 0,LOWORD(lParam),HIWORD(lParam),TRUE);
    return;
}
//窗体事件回调函数
LRESULT CALLBACK  WndProc (HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam){
    switch(msg){
         case WM_CREATE:
                  CreateGrpWindow(hWnd);
                  LoadMyCursor();
                  break;
         case WM_COMMAND:
                  return(DoWMCommand(hWnd,wParam,lParam));
         case WM_SIZE:
                  ModifyGrpWndSize(lParam);
                  break;
         case WM_CLOSE:   //关闭窗体
                  if(_CloseAllArea(AHInst)==IDCANCEL)
                       break;
                  DestroyWindow(hWnd);
                  break;
         case WM_DESTROY:
                  DestroyWindow(GrpWnd);
                  DestroyMyCursor();
                  PostQuitMessage(0);
                  break;
         case WM_SYSCOMMAND:
                  _ProcSYSCOMMAND(GrpWnd,msg,wParam,lParam);
                  return(DefWindowProc(hWnd,msg,wParam,lParam));
                  break;
         case WM_ACTIVATE:
                  _ProcACTIVATE(GrpWnd,msg,wParam,lParam);
                  return(DefWindowProc(hWnd,msg,wParam,lParam));
         default:
                  return(DefWindowProc(hWnd,msg,wParam,lParam));
    }
    return(0);
}
//Grp回调函数
LRESULT CALLBACK  GrpProc(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam){
    LRESULT rtn=0;
    switch(msg){         
         case WM_CREATE:
                  _SetPaintFunction(hWnd,_OwnerDraw);
                  _LockScrollRange(hWnd);
                  break;
         case WM_COMMAND:   //命令处理函数
                  return(DoWMCommand(hWnd,wParam,lParam));
         case WM_PAINT:
                  _ProcPAINT(hWnd,msg,wParam,lParam);
                  break;  
         case WM_LBUTTONDOWN:   //左键按下mouse事件
                  _ProcLBUTTONDOWN(hWnd,msg,wParam,lParam);
                  break;
         case WM_LBUTTONUP:     //左键按上mouse事件
                  _ProcLBUTTONUP(hWnd,msg,wParam,lParam);
                  _EnableWinMenu();
                  break;
         case WM_MOUSEMOVE:     //移动mouse事件
                  _ProcMOUSEMOVE(hWnd,msg,wParam,lParam);
                  break;
         case WM_RBUTTONUP:     //右键按上mouse事件
                  _ProcRBUTTONUP(hWnd,msg,wParam,lParam);
                  _EnableWinMenu();
                  break;
         case WM_VSCROLL:       //水平scroll
                  _PopupWinImage(hWnd);
                  _VscrollMap(hWnd,msg,wParam,lParam);
                  break;
         case WM_HSCROLL:       //垂直scroll
                  _PopupWinImage(hWnd);
                  _HscrollMap(hWnd,msg,wParam,lParam);
                  break;
         case WM_DESTROY:
                  _DelWinParam(hWnd);
                  break;
         default:
             switch(msg) {                 
                  case WM_SYSCOMMAND:
                          _ProcSYSCOMMAND(hWnd,msg,wParam,lParam);
                          break;
                  case WM_ACTIVATE:
                          _ProcACTIVATE(hWnd,msg,wParam,lParam);
                          break;
                  case WM_SETCURSOR:
                          _ProcSETCURSOR(hWnd,wParam,lParam);
                          break;
             }
             rtn=DefWindowProc(hWnd,msg,wParam,lParam);
             break;
    }
    return(rtn);
}

void SetDotViewableFlag(HWND hwnd){
  //修改坐标点可见标志
    HMENU    hmn;
    BOOL fOwnerDraw;
    hmn=GetMenu(MainWnd);
    fOwnerDraw=GetMenuState(hmn, IDMN_DOT_VIEWABLE,  MF_BYCOMMAND)&MF_CHECKED;
    CheckMenuItem(hmn, IDMN_DOT_VIEWABLE,  MF_BYCOMMAND | (fOwnerDraw ? MF_UNCHECKED : MF_CHECKED));
    DrawMenuBar(MainWnd);
    return;
}


void SetArcViewableFlag(HWND hwnd)
  {//弧段可见标志
         HMENU    hmn;
         BOOL fOwnerDraw;
    hmn=GetMenu(MainWnd);
    fOwnerDraw=GetMenuState(hmn, IDMN_ARC_VIEWABLE,  MF_BYCOMMAND)&MF_CHECKED;
    CheckMenuItem(hmn, IDMN_ARC_VIEWABLE,  MF_BYCOMMAND | (fOwnerDraw ? MF_UNCHECKED : MF_CHECKED));
    DrawMenuBar(MainWnd);
    return;
}

void SetOrignalDispFlag(HWND hwnd)
  {//还原显示标志
         HMENU    hmn;
         BOOL fOwnerDraw;
    hmn=GetMenu(MainWnd);
    fOwnerDraw=GetMenuState(hmn, IDMN_ORIGNAL_DISP,  MF_BYCOMMAND)&MF_CHECKED;
    CheckMenuItem(hmn, IDMN_ORIGNAL_DISP,  MF_BYCOMMAND | (fOwnerDraw ? MF_UNCHECKED : MF_CHECKED));
    DrawMenuBar(MainWnd);
    InvalidateRect(hwnd,NULL,TRUE);
    UpdateWindow(hwnd);
    return;
}


int DoWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{   //执行window message命令
    if(GetMenuState(GetMenu(MainWnd),LOWORD(wParam),MF_BYCOMMAND)==MF_GRAYED)
	{    //获取菜单状态
         return(0);
	}
    ComState=LOWORD(wParam);
    CurState=0;
    switch(LOWORD(wParam)){
         case IDMN_EXIT: SendMessage(hWnd,WM_CLOSE,0,0);  break;
         case IDMN_NULL: break;
         case IDMN_LOAD_PNT: LoadFiles(PNT); break;
         case IDMN_LOAD_LIN: LoadFiles(LIN); break;
         case IDMN_LOAD_REG: LoadFiles(REG); break;
         case IDMN_SAVE_PNT: SaveFiles(PNT); break;
         case IDMN_SAVE_LIN: SaveFiles(LIN); break;
         case IDMN_SAVE_REG: SaveFiles(REG); break;
         case IDMN_SAVE_PNT_AS: SaveFilesAs(PNT);break;
         case IDMN_SAVE_LIN_AS: SaveFilesAs(LIN);break;
         case IDMN_SAVE_REG_AS: SaveFilesAs(REG);break;
         case IDMN_CLOSE_PNT: CloseFiles(PNT);break;
         case IDMN_CLOSE_LIN: CloseFiles(LIN);break;
         case IDMN_CLOSE_REG: CloseFiles(REG);break;
         case IDMN_CLOSE_FILE:CloseFiles(-1);break;
		 //
         case IDMN_MOVE_WIN_C:
                  _PopupWinImage(GrpWnd);
                  break;
         case IDMN_UPDT_WIN_C:
                  _PopupWinImage(GrpWnd);
                  InvalidateRect(GrpWnd,NULL,TRUE);
                  break;
         case IDMN_ENLG_WIN_C:    //放大窗体			      
				  DefHCursor=LargeHCursor;  //设置光标样式
			      break;
         case IDMN_REDU_WIN_C:    //缩小窗体 
			      DefHCursor=ReduceHCursor;  //设置光标样式
			      break;
         case IDMN_PREV_WIN:    //"上级窗口"
                  _PrevWindow(GrpWnd);
                  break;
         case IDMN_REST_WIN_C:
                  _PopupWinImage(GrpWnd);
                  _RestoreWindow(GrpWnd,NULL,RW_SEL_AREA,AHInst);
                  break;
         case IDMN_CLEA_WIN_C:
                  _PopupWinImage(GrpWnd);
                  InvalidateRect(GrpWnd,NULL,TRUE);
                  break;
         case IDMN_MOD_ENV:                 //环境设置
                  _ModEnv(hWnd);
                  break;
         case IDMN_DOT_VIEWABLE:            /*坐标点可见*/
                  SetDotViewableFlag(hWnd);
                  break;
         case IDMN_ARC_VIEWABLE:            /*弧段可见*/
                  SetArcViewableFlag(hWnd);
                  break;
         case IDMN_ORIGNAL_DISP:              /*还原显示*/
                  SetOrignalDispFlag(GrpWnd);
                  break;
         case IDMN_ABOUT:                   //关于系统
                  _DispAbout();
                  break;
		 case IDMN_VCT_EXPORT:              //VCT导出 topo 0
			 {
				 Vct_Export();				 
			 }
			 break;
		 case IDMN_D2A:  //double转string 一个实例
             {
				 D2A_test();
			 }
			 break;
         default:
                  if((LOWORD(wParam)>=IDMN_NUM_ENLG_1)&&
                     (LOWORD(wParam)<=IDMN_NUM_ENLG_16))
                      {//固定放大,重新设置窗口显示比例
                      _ResetWinDispRate(GrpWnd,LOWORD(wParam)-IDMN_NUM_ENLG_1+1.0);
                      _PopupWinImage(GrpWnd);
                      InvalidateRect(GrpWnd,NULL,TRUE);
                  }
                  if((LOWORD(wParam)>=IDMN_NUM_REDU_1)&&
                     (LOWORD(wParam)<=IDMN_NUM_REDU_16))
                      {//固定缩小,重新设置窗口显示比例
                      _ResetWinDispRate(GrpWnd,1.0/(LOWORD(wParam)-IDMN_NUM_REDU_1+1.0));
                      _PopupWinImage(GrpWnd);
                      InvalidateRect(GrpWnd,NULL,TRUE);
                  }
                  break;
    }
    _EnableWinMenu();
    return(0);
}

//判断 菜单栏的可用性函数
void _EnableWinMenu(void)
  {
         HMENU    hmn;
         UINT    flag;
         short  i,n;
    n=_GetAreaNumber(AHInst);       //取打开的工作区数
    flag=(n)?MF_ENABLED:MF_GRAYED;  //n>0表示可用,n<=0表示不可用
    hmn=GetMenu(MainWnd);
    //文件
    EnableMenuItem(hmn, IDMN_CLOSE_FILE        ,MF_BYCOMMAND|flag);
    //窗口
    EnableMenuItem(hmn, IDMN_ENLG_WIN_C   ,MF_BYCOMMAND|flag);
    EnableMenuItem(hmn, IDMN_REDU_WIN_C   ,MF_BYCOMMAND|flag);
    EnableMenuItem(hmn, IDMN_MOVE_WIN_C   ,MF_BYCOMMAND|flag);
    EnableMenuItem(hmn, IDMN_REST_WIN_C   ,MF_BYCOMMAND|flag);
    EnableMenuItem(hmn, IDMN_UPDT_WIN_C   ,MF_BYCOMMAND|flag);
    EnableMenuItem(hmn, IDMN_CLEA_WIN_C   ,MF_BYCOMMAND|flag);
    EnableMenuItem(hmn, IDMN_PREV_WIN     ,MF_BYCOMMAND|flag);
    for(i=0;i<16;i++)
    {
         EnableMenuItem(hmn, IDMN_NUM_ENLG_1+i,MF_BYCOMMAND|flag);
         EnableMenuItem(hmn, IDMN_NUM_REDU_1+i,MF_BYCOMMAND|flag);
    }
    DrawMenuBar(MainWnd);
    if(GetMenuState(GetMenu(MainWnd),ComState,MF_BYCOMMAND)==MF_GRAYED)
         ComState=0;
    switch(ComState)
    {
         case IDMN_ENLG_WIN:
                  SetClassLong(GrpWnd,GCL_HCURSOR,(LONG)LargeHCursor);
                  break;
         case IDMN_REDU_WIN:
                  SetClassLong(GrpWnd,GCL_HCURSOR,(LONG)ReduceHCursor);
                  break;
         case IDMN_MOVE_WIN:
         case IDMN_UPDT_WIN:
         case IDMN_REST_WIN:
         case IDMN_CLEA_WIN:
         case IDMN_PREV_WIN:
         default:
                  SetClassLong(GrpWnd, GCL_HCURSOR,(LONG)DefHCursor);
                  break; 
    }
    return;
}

//======================================================//
///{文件处理
short LoadFiles(short ftype)
  {
         short   ai;
    ai=_OpenArea(AHInst,ftype);
    if(ai<=0)
         return(0);
    if(!_LoadFile(ai))
         {
         _CloseArea(ai);
         return(0);
    }
    _PopupWinImage(GrpWnd);
    _RestoreWindow(GrpWnd,NULL,RW_ALL_AREA,AHInst);
    return(ai);
}

short CloseFiles(short type)
  {
         short *ptArea=NULL;
         char  nmStr[32];
         short i;
    LoadString(HInst,3,nmStr,32);
    ptArea=_SelectAreaList(AHInst,MainWnd,type,nmStr);
    if(ptArea==NULL)
         return(0);
    for(i=1;i<=ptArea[0];i++)
         _CloseArea(ptArea[i]);
    _PopupWinImage(GrpWnd);
    _RestoreWindow(GrpWnd,NULL,RW_ALL_AREA,AHInst);
    return(1);
}
 

short SaveFiles(short type)
{
    short *areaLst;
    short i;
    areaLst=_SelectAreaList(AHInst,MainWnd,type,"选择保存文件");
    if(areaLst==NULL)      return(0);
    for(i=1;i<=areaLst[0];i++)
             _SaveFile(areaLst[i]);
    return(1);
}
 

short SaveFilesAs(short type)
{
    short *areaLst;
    short i;
    areaLst=_SelectAreaList(AHInst,MainWnd,type,"选择另存文件");
    if(areaLst==NULL)
       return(0);
    for(i=1;i<=areaLst[0];i++)
       _SaveFileAs(areaLst[i]);
    return(1);
}

 

//------------------------------------------------//
//{显示 线点 函数
short DispLinDot(HDC hdc,WIN_ORG *wxy,short ai)
{
         long  i,j,ln;
         D_DOT *lxy;
         long  len;
         int   x,y;
         HANDLE hdpen;
	//选择pen对象
    hdpen=SelectObject(hdc, CreatePen(PS_SOLID,1,RGB(255,0,0)));
    _GetLinNum(ai,&i,&ln);
    for(i=1;i<ln;i++)
         {
         if(_GetLin(ai,i,&lxy,&len,NULL)<=0)
             continue;
         for(j=0;j<len;j++,lxy++)
             {
             x=(int)((lxy->x-wxy->x0)*wxy->r);
             y=(int)((lxy->y-wxy->y0)*wxy->r);
             MoveToEx(hdc,x-2,y,NULL);
             LineTo(hdc,x+2,y);
             MoveToEx(hdc,x,y-2,NULL);
             LineTo(hdc,x,y+2);
         }
    }
    //删除pen对象
	DeleteObject(SelectObject(hdc,hdpen));
    return(1);
}
//..........................PAINTSTRUCT *ps
//重新显示图形
void _ReDispGraph(HWND hWnd,MyDC myDC,short *dsp)
  {
         short ti,i,type;
         D_RECT frc;
         RECT   rc,wrc;
         short  rt;
         WIN_ORG         wxy;
         PAINTSTRUCT *ps;
         HMENU    hmn;
         BOOL    arcView;
         BOOL       dotView;
    if(ComState==IDMN_CLEA_WIN){         
         ComState=IDMN_NULL;
         return;
    }
    if(dsp==NULL)  return;
    //
    hmn=GetMenu(MainWnd);
    if(MF_CHECKED & GetMenuState(hmn, IDMN_ORIGNAL_DISP,  MF_BYCOMMAND))
	{
         _SetOriginalDisp(myDC,1);
	}
    arcView=GetMenuState(hmn, IDMN_ARC_VIEWABLE,  MF_BYCOMMAND)&MF_CHECKED;
    dotView=GetMenuState(hmn, IDMN_DOT_VIEWABLE,  MF_BYCOMMAND)&MF_CHECKED;
    ps=_GetPaintStruct(myDC);
    rc=ps->rcPaint;
    _StartWait();
    GetClientRect(hWnd,&wrc);
    if(!_GetWinDispParam(hWnd,&wxy))
         return;
    frc.xmin=rc.left/wxy.r +wxy.x0-1;
    frc.xmax=rc.right/wxy.r+wxy.x0+1;
    frc.ymin=(wrc.bottom-rc.bottom)/wxy.r+wxy.y0-1;
    frc.ymax=(wrc.bottom-rc.top)/wxy.r   +wxy.y0+1;
    _SetMyDCMode(myDC);
    _SetMyDCPalette(myDC);
    _SetDispRect(myDC,&frc);    //设置显示范围
    _SetDispParam(myDC,wxy.x0,wxy.y0,wxy.r);
    for(ti=0;ti<4;ti++)   //循环3次,依次显示 区,线,点,网
    {
         switch(ti)
             {
             case 0: type=REG; break;
             case 1: type=NET; break;
             case 2: type=LIN; break;
             case 3: type=PNT; break;
         }
         for(i=1;i<=dsp[0];i++)
             {
             if(type!=_GetAreaType(dsp[i]))
                  continue;
             switch(type)
                  {
                  case PNT: rt=_DispPntArea(myDC,dsp[i]); break;
                  case LIN: rt=_DispLinArea(myDC,dsp[i]);
                            if(dotView)
                                DispLinDot(ps->hdc,&wxy,dsp[i]);
                            break;
                  case REG: rt=_DispRegArea(myDC,dsp[i]);
                            if(arcView)
                                _DispLinArea(myDC,dsp[i]);
                            if(dotView)
                                DispLinDot(ps->hdc,&wxy,dsp[i]);
                            break;
                  case NET: rt=_DispLinArea(myDC,dsp[i]);
                            if(dotView)
                                DispLinDot(ps->hdc,&wxy,dsp[i]);
                            break;
                  default:  break;
             }
             if(rt==0)
                  goto redispEND;
         }
    }
redispEND:
    _EndWait();
    return;
}

 

//.....................................................................PAINTSTRUCT *ps)
//自己绘制函数
void WINAPI _OwnerDraw(HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam,MyDC myDC)
{
    int    state;
    short *ptALst=NULL;           //显示工作区表
    state=CurState;
    CurState=PAINTING;
    if((ptALst=_GetDispAreaListAddr(hWnd))!=NULL)
	{
         _ReDispGraph(hWnd,myDC,ptALst);
	}
    CurState=state;
    return;
}


--the---end------

--vp:hsg----

--create date:2012-04-18---

你可能感兴趣的:(mapgis6.7二次开发vc6_demo 之一(主窗体构架))