第三章 非几何属性用户输入界面
非几何属性用户输入界面都采用非模态对话框的形式同用户交互,其中大部分是下拉框的形式让用户选择墙体、门窗套间等属性的设定,少数采用文本框的形式让用户输入数据。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;选择的套间编号
};
关于套间控制的类由钟琴编写,本人只提供一个功能按钮
总界面最后是完成按钮,按下这个按钮的时候,程序完成。