CSDN博客

img yako

arx程序说明(三)

发表于2004/10/12 20:16:00  4087人阅读

分类: Research

第三章  非几何属性用户输入界面

非几何属性用户输入界面都采用非模态对话框的形式同用户交互,其中大部分是下拉框的形式让用户选择墙体、门窗套间等属性的设定,少数采用文本框的形式让用户输入数据。AutoCAD中的对话框在用户输入之后都试图返回绘图编辑状态,用非模态对话框都要自定义一个消息函数afx_msg LONG onAcadKeepFocus(UINT, LONG),程序中这个消息函数简单的返回true,就能让对话框仍然保持输入焦点,由于每一个界面的类都有这个函数,这里提前对他进行了介绍,后面只列出他的消息响应形式,不再进行说明。由于描述各个对话框的类都是从MFC类库中的对话框类Cdialog类继承而来下面分别对各个用户进行介绍。

1、总输入控制界面

他的界面如图1所示,这个界面中用户通过各种功能按钮进入响应的输入界面,各种功能按钮分别为全局参数设置、门窗表的录入、房间墙体属性设置、房间分配、房间控制以及界面返回。在界面中用户按下一个功能按钮之后进入响应的界面,同时总控制界面消失。当其它界面输入完成之后,又返回到总的控制界面。

用于描述控制界面的MFC类为globeSet

class LineDisplayer : public CDialog

{

// Construction

public:

       LineDisplayer(CWnd* pParent = NULL);   // 标准构造函数

// Dialog Data

       //{{AFX_DATA(LineDisplayer)

       enum { IDD = IDD_DISPLAYER };//对话框资源,用户界面资源的编号

       //}}AFX_DATA

private:

       WinRegister *pWinTable;//进入门窗表录入界面的对象指针

       globeSet *pGlobe; //进入全局设定界面的对象指针

       winAsign *pwinAsign; //进入门洞设置界面的对象指针

       roomAsign *proomAsign; //进入房间分配界面的对象指针

       WallConstruction *pWallStruction; //进入墙体结构设置界面的对象指针

       ApartControl *pApartControl; //进入房间控制界面的对象指针

       int room_index;//get the selroom index

       void ListRoom(Room *pR);已废弃

       void fill_combox();//已废弃

       CODBCDynamic *winExplore;//已废弃

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(LineDisplayer)

       protected:

       virtual void DoDataExchange(CDataExchange* pDX);    数据和消息交互声名

       //}}AFX_VIRTUAL

// Implementation

protected:

       // Generated message map functions

       //{{AFX_MSG(LineDisplayer)

       afx_msg void OnSelRoomChange();已废弃

       afx_msg void OnRoomStruct();响应墙体结构设置功能按钮

       afx_msg void OnWinTable();响应门窗表录入功能按钮

       virtual BOOL OnInitDialog();初始化对话框

       afx_msg void OnGlobe();响应全局设置功能按钮

       afx_msg void OnWinStruct();响应门窗结构设置功能按钮

       afx_msg void OnRoomAsign();响应房间分配功能按钮

       afx_msg void OnControl();响应套间控制功能按钮

       afx_msg void OnDone();最后完成消息

       DECLARE_EVENTSINK_MAP()

       //}}AFX_MSG

       afx_msg LONG onAcadKeepFocus(UINT, LONG);

       DECLARE_MESSAGE_MAP()

};

2、全局设置界面

在这个类中进行建筑属性的全局设置,这些全局设置包括默认的建筑内外墙体结构、建筑地板和天花板的材料结构、建筑层数、每一层中的套间数和建筑层高等特性的全局设置。下面是从对话框类继承来的全局MFC类的描述。

class globeSet : public CDialog

{

public:

       globeSet(CWnd* pParent = NULL);   // standard constructor

       friend class LineDisplayer;//声名和总输入界面的类是友类

// Dialog Data

       //{{AFX_DATA(globeSet)

       enum { IDD = IDD_GLOBE };资源标识

       CComboBox   m_com_floor;地板下拉框对象

       CComboBox   m_com_top;天花板下拉框对象

       CComboBox   m_com_out;外墙下拉框对象

       CComboBox   m_com_in;内墙下拉框对象

       int           m_apart_amount;用于记录套间数量的变量

       int           m_floor_amount;用于记录层数的变量

       int           m_floor_height;用于记录层高的遍历

       //}}AFX_DATA

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(globeSet)

       protected:

       virtual BOOL Create(LineDisplayer* pParentWnd, UINT nID);非模态对话框的创建函数

       virtual void DoDataExchange(CDataExchange* pDX);    // 数据交换

       //}}AFX_VIRTUAL

       private:

       CODBCDynamic *winExplore;//数据库钩子

       LineDisplayer *pPlayer;总功能对话框指针,用于返回到总功能界面

// Implementation

protected:

       // Generated message map functions

       //{{AFX_MSG(globeSet)

       virtual BOOL OnInitDialog();初始化,在初始化中应用数据库钩子连接上材料结构数据库,对各种结构选择下拉框进行填充,以便用户选择输入

       afx_msg void OnSelchangeFloor();响应地板结构选择输入

       afx_msg void OnSelchangeInWall();响应内墙结构选择输入

       afx_msg void OnSelchangeOuterWall();响应外墙结构选择输入

       afx_msg void OnSelchangeTop();响应天花板结构选择输入

       afx_msg void OnChangeApartAmount();响应套间数量文本输入

       afx_msg void OnChangeFloorAmount();响应层数文本输入

       afx_msg void OnChangeFloorHeight();响应层高文本输入

       afx_msg void OnOk();输入完毕

       //}}AFX_MSG

       afx_msg LONG onAcadKeepFocus(UINT, LONG);

       DECLARE_MESSAGE_MAP()保持焦点

};

全局设置输入完毕之后,响应的全局设置保存在下面的全局变量中:

winOrDoor winTable; 门窗表,这个全局变量用于下面门窗表录入记录门窗表

int Floor_Amount;层数

int Floor_Height;层高

int Apartment_Amount;套间数

CString in_construction;内墙结构

CString out_construction;外墙结构

CString floor_construction;地板结构

CString top_construction; 天花板结构

3、门窗表录入

该界面用于录入门窗表,建筑设中门窗规格都是用门窗表的形式进行管理,这个界面中对门窗表进行录入,用于后面对门窗进行设置。下面是MFC的门窗录入类的定义:

class WinRegister : public CDialog

{

// Construction

public:

       friend class LineDisplayer;声名友类

       WinRegister(CWnd* pParent = NULL);   // standard constructor

// Dialog Data

       //{{AFX_DATA(WinRegister)

       enum { IDD = IDD_REGISTER };资源标识

       CButton   m_winOrDoorCtr;复选按钮对象,用于标识是对门输入还是对窗输入

       CListCtrl m_winTable;表格对象,用于显示已输入的数据

       CComboBox   m_glass_type;窗户的玻璃类型下拉框对象,显示玻璃让用户选择

       CComboBox   m_door_construct;门结构下拉对象,显示门材料

       int           m_base_high;窗户的台高记录

       int           m_high;门洞高度

       CString   m_index;门窗编号

       CString   m_glassType;玻璃类型

       CString   m_doorConstruct;门的材料

       int           m_width;,门洞宽度

       int           m_frameWidth;框架厚度

       BOOL     m_winOrDoor;布尔变量,用于区别是门还是窗户

       //}}AFX_DATA

private:

       CODBCDynamic *winExplore;//the datebase explore

       LineDisplayer *pPlayer;,总界面指针

       CString typeName;类型名称

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(WinRegister)

       public:

       virtual BOOL Create(LineDisplayer* pParentWnd, UINT nID);创建函数

       protected:

       virtual void DoDataExchange(CDataExchange* pDX);  数据交互

       //}}AFX_VIRTUAL

// Implementation

protected:

       // Generated message map functions

       //{{AFX_MSG(WinRegister)

       afx_msg void OnDelete();响应界面删除已输入门窗数据

       afx_msg void OnAdd();响应门窗数据添加按钮

       virtual BOOL OnInitDialog();初始化

       afx_msg void OnSelchangeWinType();响应玻璃类型选择

              afx_msg void OnSelchangeDoorConstruct();响应门结构选择

       virtual void OnOK();完成

       afx_msg void OnChangeIndex();响应编号文本输入

       afx_msg void OnSelWin();输入窗户数据

       afx_msg void OnSetfocusWinType();窗户类型获得焦点

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

       afx_msg LONG onAcadKeepFocus(UINT, LONG);对话框保持焦点

};

4、墙体结构设置界面

该界面中用户对建筑平面中的每一面墙体结构进行设置,由于在进行全局设置之后,各种内外墙体的材料结构都已经设置成了默认的值,如果用户还要单独对某个墙体材料结构进行设置,在界面中首先选择该墙体所在的房间,选中的房间的各个墙体在AutoCAD中高亮显示,他的各个墙体以及他们的墙体在表格中列出,当用户在表格中选中某个墙体的时候,该墙体高亮显示,同时在表格的该行中出现一个下拉框,让用户进行该墙体材料结构的设置。在这个界面中还对房间的功能性质如是厨房还是卧室进行设置。

下面是墙体结构设置MFC类的定义:

class WallConstruction : public CDialog

{

// Construction

public:

       friend class LineDisplayer;声名友类

       WallConstruction(CWnd* pParent = NULL);   // standard constructor

       LineDisplayer *pPlayer;总功能界面指针

// Dialog Data

       //{{AFX_DATA(WallConstruction)

       enum { IDD = IDD_WALL_CONSTRUCTION };资源标识

       CComboBox   m_roomtype;房间功能

       CComboBox   m_com_wall;墙体结构下拉框对象

       CComboBox   m_com_room;房间选择下拉框对象

       CListCtrl m_wall_list;墙体列表对象

       //}}AFX_DATA

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(WallConstruction)

       protected:

       virtual BOOL Create(LineDisplayer* pParentWnd, UINT nID);创建函数

       virtual void DoDataExchange(CDataExchange* pDX);  数据交互t

       //}}AFX_VIRTUAL

// Implementation

protected:

       // Generated message map functions

       //{{AFX_MSG(WallConstruction)

       virtual BOOL OnInitDialog();初始化,主要是对各种对象进行初始化

       afx_msg void OnOk();完成

       afx_msg void OnSelchangeWallStruct();响应墙体材料选择

       afx_msg void OnSelchangeRoom();响应房间选择

       afx_msg void OnClickWallList(NMHDR* pNMHDR, LRESULT* pResult);响应列表中墙体选择

       afx_msg void OnSelchangeConRoomtype();响应房间功能设置

       //}}AFX_MSG

       afx_msg LONG onAcadKeepFocus(UINT, LONG);保持焦点

       DECLARE_MESSAGE_MAP()

private:

       CODBCDynamic *winExplore;//the datebase explore数据库钩子

       Room *curRoom;//the current sel room当前被选择的房间

       Wall *curWall;当前选择的墙体

       int selIndex;保留选择房间的编号

       void fillList(Room *pR,int &amount);房间链表中的第amount个房间填充墙体列表

       int walls,roomNo;//已废弃

};

5、门窗结构设置界面

该界面中用户对每一个门洞进行设置,如果窗户有遮阳板,还要对遮阳板系数进行输入。在这个界面中,首先用户对房间进行选择,如果该房间的墙体上有门洞,门洞在下面的列表中列出,当用户在列表中选择一个门洞的时候,他在AutoCAD中高亮显示,同时在列表相应的第二列中出现门窗表的下拉框,在用户输入的门窗表的编号都在下拉框中列出,让用户进行选择设置。在表中同时还注明该门洞是否有遮阳板,有遮阳板在下面的系数文本框中都显示相应的数据。用户还可以对遮阳板进行设置和输入。

下面是相应的MFC类定义:

class winAsign : public CDialog

{

// Construction

public:

       friend class LineDisplayer;声名友类

       winAsign(CWnd* pParent = NULL); 

 

// Dialog Data

       //{{AFX_DATA(winAsign)

       enum { IDD = IDD_WIN_ASIGN };资源标识

       CEdit      m_w_edit;遮阳板系数w输入对象

       CEdit      m_d_edit; 遮阳板系数d输入对象

       CEdit      m_b_edit; 遮阳板系数b输入对象

       CEdit      m_a_edit; 遮阳板系数a输入对象

       CListCtrl m_win_list;门洞列表对象输入对象

       CButton   m_haveOverhang;是否有遮阳板复选对象

       CComboBox   m_com_index;门窗表编号下拉框对象

       CComboBox   m_com_room;房间下拉框对象

       float m_hang_a; 遮阳板系数a

       float m_hang_b; 遮阳板系数b

       float m_hang_d; 遮阳板系数d

       float m_hang_w; 遮阳板系数w

       BOOL     m_checkoverhang;布尔变量,识别是否有遮阳板

       //}}AFX_DATA

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(winAsign)

       protected:

       virtual BOOL Create(LineDisplayer* pParentWnd, UINT nID);创建函数

       virtual void DoDataExchange(CDataExchange* pDX);   数据交互

       //}}AFX_VIRTUAL

// Implementation

protected:

       // Generated message map functions

       //{{AFX_MSG(winAsign)

       virtual BOOL OnInitDialog();初始化

       afx_msg void OnOk();完成

       afx_msg void OnSelchangeComRoomwin();已废弃

       afx_msg void OnSelendcancelComWinindex();响应门窗编号选择

       afx_msg void OnClickWinListwin(NMHDR* pNMHDR, LRESULT* pResult);响应门洞表中对门洞的选择

       afx_msg void OnChangeHangA();响应遮阳板系数A的输入

       afx_msg void OnChangeHangB();响应遮阳板系数B的输入

       afx_msg void OnChangeHangD();响应遮阳板系数D的输入

       afx_msg void OnChangeHangW();响应遮阳板系数W的输入

       afx_msg void OnHaveOverhang();响应是否有遮阳板的设置

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

       afx_msg LONG onAcadKeepFocus(UINT, LONG);保留输入焦点

private:

       void fillList(int index,Room *pR,int &amount);对门洞表进行填充,把填充的行数保存在amount

       LineDisplayer *pPlayer;总功能界面指针

       Room *selRoom;保存选中的房间变量

       int winAmount;当前房间的总门洞数

       int selIndex;被选择的门洞编号

       winOrDoor *curWin;当前选择的门洞

};

6、房间分配界面

房间分配界面用于分配房间到套间中,在该界面中对每一个房间进行分配,在全局设置中已经设置了建筑设计中的每一层中的套间数量,这个界面用于指定每一个房间属于那个套间。在界面中列出了所有房间,当用户进行选择的时候,在相应行出现套间编号的下拉框,用户简单的在下拉列表中进行选择就能完成房间的分配。最后用户还对房间的zone类型进行设置。在介绍zone类型的时候已经交代了,zone类型是应钟琴的要求进行添加的类,他也是用下拉框的形式让用户进行选择,下拉框的内容从数据库获得。下面是相应的MFC类定义:

class roomAsign : public CDialog

{

// Construction

public:

       friend class LineDisplayer;声名友类

       roomAsign(CWnd* pParent = NULL);   // standard constructor

// Dialog Data

       //{{AFX_DATA(roomAsign)

       enum { IDD = IDD_ROOM_ASIGN };资源标识

       CComboBox   m_com_apart;套间编号下拉框对象

       CListCtrl m_room_list;房间列表对象

       //}}AFX_DATA

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(roomAsign)

       protected:

       virtual BOOL Create(LineDisplayer* pParentWnd, UINT nID);创建函数

       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

       //}}AFX_VIRTUAL

// Implementation

protected:

       // Generated message map functions

       //{{AFX_MSG(roomAsign)

       virtual BOOL OnInitDialog();初始化

       afx_msg void OnClickList1(NMHDR* pNMHDR, LRESULT* pResult);响应房间选择

       afx_msg void OnOk();完成

       afx_msg void OnSelchangeComApartment();响应套间选择

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

       afx_msg LONG onAcadKeepFocus(UINT, LONG);保持焦点

private:

       LineDisplayer *pPlayer;总功能界面指针

       int selIndex;选择的房间编号

       Room *selRoom;选择的房间指针

       int selApartment;选择的套间编号

};

 

关于套间控制的类由钟琴编写,本人只提供一个功能按钮

总界面最后是完成按钮,按下这个按钮的时候,程序完成。

阅读全文
0 0

相关文章推荐

img
取 消
img