// BaseStairDlg.cpp : implementation file // #include "stdafx.h" #include "BaseStairDlg.h" #include "resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBaseStairDlg dialog BOOL CBaseStairDlg::m_bNeed2D = TRUE; BOOL CBaseStairDlg::m_bNeed3D = TRUE; BOOL CBaseStairDlg::m_bNeedRight = FALSE; BOOL CBaseStairDlg::m_bNeedLeft = FALSE; int CBaseStairDlg::m_nPao = 2; CString CBaseStairDlg::m_strElev = _T("0"); CString CBaseStairDlg::m_strStepHeight = _T("150.00");//modified by whl on 03/08/15 CString CBaseStairDlg::m_strStairHeight = _T("3000"); int CBaseStairDlg::m_nStepNum=20; BOOL CBaseStairDlg::m_bAsAscent=FALSE; BOOL CBaseStairDlg::m_bHasSlant=TRUE; BOOL CBaseStairDlg::m_bOnGround = TRUE; IMPLEMENT_DYNAMIC(CBaseStairDlg, CObjPreviewDlg) CBaseStairDlg::CBaseStairDlg(UINT IDD, CWnd* pParent /*=NULL*/) : CObjPreviewDlg(IDD, pParent) { m_lSectionPos=0.4; m_rSectionPos=0.6; m_bCreate=FALSE; } CBaseStairDlg::~CBaseStairDlg() { } BEGIN_MESSAGE_MAP(CBaseStairDlg, CObjPreviewDlg) //{{AFX_MSG_MAP(CBaseStairDlg) ON_WM_TIMER() ON_WM_PAINT () ON_BN_CLICKED(IDC_NO_PAO, UpdateImage) ON_BN_CLICKED(IDC_BOTTOM_PAO, UpdateImage) ON_BN_CLICKED(IDC_DOUBLE_PAO, UpdateImage) ON_BN_CLICKED(IDC_UP_SECT, UpdateImage) ON_BN_CLICKED(IDC_LEFT_BEAM,UpdateImage) ON_BN_CLICKED(IDC_RIGHT_BEAM,UpdateImage) ON_BN_CLICKED(IDC_NEED2D, UpdateSel) ON_BN_CLICKED(IDC_NEED3D, UpdateSel) ON_BN_CLICKED(IDC_HAS_SLANT, UpdateSel) ON_BN_CLICKED(IDC_AS_ASCENT, UpdateSel) ON_EN_CHANGE(IDC_STEP_HEIGHT,OnChangeStepHeight) ON_EN_CHANGE(IDC_STEP_NUM, OnChangeStepNum) ON_EN_CHANGE(IDC_STAIR_HEIGHT,OnChangeStairHeight) ON_EN_KILLFOCUS(IDC_STEP_NUM,OnKFStepNum) ON_EN_KILLFOCUS(IDC_STEP_HEIGHT,OnKFStepHeight) ON_EN_KILLFOCUS(IDC_STAIR_HEIGHT,OnKFStairHeight) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CBaseStairDlg::OnChangeStairHeight() { //UpdateEdit(IDC_STAIR_HEIGHT);//removed by whl on 03/08/15 } void CBaseStairDlg::OnChangeStepNum() { UpdateEdit(IDC_STEP_NUM); } void CBaseStairDlg::OnChangeStepHeight() { UpdateEdit(IDC_STEP_HEIGHT); } void CBaseStairDlg::OnKFStairHeight() { if (GetDlgItem(IDCANCEL)!=GetFocus()) UpdateEdit(IDC_STAIR_HEIGHT,true); } void CBaseStairDlg::OnKFStepHeight() { if (GetDlgItem(IDCANCEL)!=GetFocus()) UpdateEdit(IDC_STEP_HEIGHT,true); } void CBaseStairDlg::OnKFStepNum() { if (GetDlgItem(IDCANCEL)!=GetFocus()) UpdateEdit(IDC_STEP_NUM,true); } void CBaseStairDlg::DoDataExchange(CDataExchange* pDX) { CObjPreviewDlg::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBaseStairDlg) DDX_Text(pDX, IDC_STEP_ELEV, m_strElev); DDX_Check(pDX, IDC_NEED2D, m_bNeed2D); DDX_Check(pDX, IDC_NEED3D, m_bNeed3D); DDX_Check(pDX, IDC_LEFT_BEAM, m_bNeedLeft); DDX_Check(pDX, IDC_RIGHT_BEAM, m_bNeedRight); DDX_Radio(pDX, IDC_NO_PAO, m_nPao); DDX_Check(pDX, IDC_AS_ASCENT, m_bAsAscent); DDX_Check(pDX, IDC_HAS_SLANT, m_bHasSlant); DDX_Check(pDX, IDC_ON_GROUND, m_bOnGround); DDX_Control(pDX, IDC_STEP_NUM_SPIN, stepNumSpin); //}}AFX_DATA_MAP if (!pDX->m_bSaveAndValidate) { DDX_Text(pDX, IDC_STAIR_HEIGHT, m_strStairHeight); DDX_Text(pDX, IDC_STEP_HEIGHT, m_strStepHeight); DDX_Text(pDX, IDC_STEP_NUM, m_nStepNum); } } //数据变化关系: //梯段高度变化会引起踏步数变化,同时微调踏步高度; //踏步高度变化会引起踏步数变化,同时微调踏步高度,梯段高度不变 //踏步数变化会引起踏步高度变化,不影响梯段高度 bool CBaseStairDlg::UpdateEdit(UINT ctrlID,bool bReportError) { CEdit *pEdit=(CEdit*)GetDlgItem(ctrlID); if (pEdit==NULL) return false; static bool bUpdating=false; if (bUpdating) return false; bUpdating=true; bool result=true; CDataExchange dxOut(this,false); CString temp; pEdit->GetWindowText(temp); switch(ctrlID) { case IDC_STAIR_HEIGHT: {//modified on 03/08/15 by whl if (_tstof(temp)>=2*_tstof(m_strStepHeight)-_DIST_SNAP) {//最少当前两踏步高 m_strStairHeight=temp; m_nStepNum=(int)(_tstof(m_strStairHeight)/_tstof(m_strStepHeight)+0.5); m_strStepHeight.Format(_T("%.2f"),(_tstof(m_strStairHeight)/m_nStepNum)); DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight); DDX_Text(&dxOut,IDC_STEP_NUM,m_nStepNum); UpdateImage(); } else if (bReportError) { AfxMessageBox(_T("梯段高度太小!")); DDX_Text(&dxOut,IDC_STAIR_HEIGHT,m_strStairHeight);//还原 pEdit->SetFocus(); pEdit->SetSel(0,-1); } } break; case IDC_STEP_NUM: { if (_ttoi(temp)>1) { m_nStepNum=_ttoi(temp); m_strStepHeight.Format(_T("%.2f"),_tstof(m_strStairHeight)/m_nStepNum);//modified on 03/07/15 by whl DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight); UpdateImage(); } else if (bReportError) { AfxMessageBox(_T("踏步数必需大于1!")); DDX_Text(&dxOut,IDC_STEP_NUM,m_nStepNum);//还原 pEdit->SetFocus(); pEdit->SetSel(0,-1); } } break; case IDC_STEP_HEIGHT: { int num=(int)(_tstof(m_strStairHeight)/_tstof(temp)+0.5); if (_tstof(temp)>0&&num>1) { m_nStepNum=num; m_strStepHeight.Format(_T("%.2f"),_tstof(m_strStairHeight)/m_nStepNum);//modified on 03/07/15 by whl DDX_Text(&dxOut,IDC_STEP_NUM,m_nStepNum); if (bReportError) DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight);//自动调整 UpdateImage(); } else if (bReportError) { if (_tstof(temp)<=0) AfxMessageBox(_T("踏步高度大小!")); else AfxMessageBox(_T("新踏步高度将造成踏步数小于2,请重新输入或先增大梯段高度!")); DDX_Text(&dxOut,IDC_STEP_HEIGHT,m_strStepHeight);//还原 pEdit->SetFocus(); pEdit->SetSel(0,-1); } } break; default: result=false; } bUpdating=false; return result; } //响应用户选定动作 void CBaseStairDlg::UpdateSel() { BOOL bOld2D=m_bNeed2D,bOld3D=m_bNeed3D; UpdateData(); GetDlgItem(IDC_HAS_SLANT)->EnableWindow(m_bAsAscent); GetDlgItem(IDC_ON_GROUND)->EnableWindow(m_bAsAscent); //GetDlgItem(IDC_STEP_HEIGHT)->EnableWindow(!m_bAsAscent); //GetDlgItem(IDC_STEP_NUM)->EnableWindow(!m_bAsAscent); //stepNumSpin.EnableWindow(!m_bAsAscent); if (!m_bNeed3D&&!m_bNeed2D) { AfxMessageBox(_T("三维和二维至少选其一!")); m_bNeed3D=bOld3D; m_bNeed2D=bOld2D; ((CButton*)GetDlgItem(IDC_NEED2D))->SetCheck(m_bNeed2D); ((CButton*)GetDlgItem(IDC_NEED3D))->SetCheck(m_bNeed3D); } //GetDlgItem(IDC_LEFT_BEAM)->EnableWindow(m_bNeed3D); //GetDlgItem(IDC_RIGHT_BEAM)->EnableWindow(m_bNeed3D); GetDlgItem(IDC_NO_PAO)->EnableWindow(m_bNeed2D); GetDlgItem(IDC_BOTTOM_PAO)->EnableWindow(m_bNeed2D); GetDlgItem(IDC_DOUBLE_PAO)->EnableWindow(m_bNeed2D); //nsh 修改于20070910 GetDlgItem(IDC_UP_SECT)->EnableWindow(m_bNeed2D); UpdateImage(); //GetDlgItem(IDC_STEP_HEIGHT)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE); //GetDlgItem(IDC_STEP_NUM)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE); //GetDlgItem(IDC_STEP_HEIGHT_STATIC)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE); //GetDlgItem(IDC_STEP_NUM_STATIC)->ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE); //stepNumSpin.ShowWindow(!m_bAsAscent?SW_NORMAL:SW_HIDE); } BOOL CBaseStairDlg::OnInitDialog() { CObjPreviewDlg::OnInitDialog(); stepNumSpin.SetRange(2,10000); AddTip(IDC_NEED3D); AddTip(IDC_NEED2D); AddTip(IDC_STAIR_HEIGHT_STATIC,_T("楼梯高度始终等于所有踏步的高度总和,改变楼梯高度将使踏步数变化,同时可能微调踏步高度"));//modified by whl on 03/08/15 AddTip(IDC_STEP_NUM_STATIC,_T("改变踏步数将使踏步高度反向变化")); AddTip(IDC_STEP_HEIGHT_STATIC,_T("输入一个大概的近似踏步高度,系统将自动设置正确值;改变踏步高度将引起踏步数反向变化")); UpdateSel(); UpdateImage(); if (m_bCreate) { CWnd *pWnd=GetDlgItem(IDC_STEP_ELEV); if (pWnd) { pWnd->SetWindowText(_T("")); pWnd->EnableWindow(FALSE); } } return TRUE; } void CBaseStairDlg::Dlg2Obj(AcDbEntity *pObj)//导出 { TDbStair *pStep=TDbStair::cast(pObj); ASSERT(pObj); if (!m_bNeed2D) pStep->Set2DFlag(0); else { pStep->Set2DFlag(m_nPao + 1); pStep->SetSectionPos(0, m_lSectionPos); pStep->SetSectionPos(1, m_rSectionPos); } if (!m_bNeed3D) pStep->Set3DFlag(0); else pStep->Set3DFlag(SF_HAS3D); pStep->SetSideBeam(OFFSET_LEFT, m_bNeedLeft); pStep->SetSideBeam(OFFSET_RIGHT, m_bNeedRight); pStep->SetElevation(_tstof(m_strElev)); pStep->SetOnGround(m_bOnGround); pStep->SetAscent(m_bAsAscent); pStep->SetSlant(m_bHasSlant); pStep->SetStepHeight(_tstof(m_strStepHeight)); pStep->SetStepNum(m_nStepNum); return; } void CBaseStairDlg::Obj2Dlg(const AcDbEntity *pObj)//导入 { TDbStair *pStep=TDbStair::cast(pObj); ASSERT(pObj); int nStairFlag2D = pStep->Get2DFlag(); int nStairFlag3D = pStep->Get3DFlag(); //modify by xlc on 090222 // m_bNeed3D = (nStairFlag3D!=0); m_bNeed3D = pStep->Has3D(); m_bNeedLeft=pStep->GetSideBeam(OFFSET_LEFT)!=0;//modidfied m_bNeedRight=pStep->GetSideBeam(OFFSET_RIGHT)!=0;//modified m_bNeed2D = (nStairFlag2D!=0); if (m_bNeed2D) m_nPao = nStairFlag2D - 1; m_strElev=Dist2Str(pStep->GetElevation()); m_strStairHeight=Dist2Str(pStep->GetStairHeight()); m_lSectionPos=pStep->GetSectionPos(0); m_rSectionPos=pStep->GetSectionPos(1); m_bAsAscent = pStep->IsAscent(); m_bOnGround = pStep->IsOnGround(); m_bHasSlant = pStep->HasSlant(); if (!m_bAsAscent)//坡道使用内部确定值,如导入会忘记楼梯的最近参数 。 { m_nStepNum=pStep->GetStepNum(); m_strStepHeight.Format(_T("%.2f"),pStep->GetStepHeight());//modified on 03/07/15 by whl } } // Zyu modify on 100721 //void CBaseStairDlg::OnTimer(UINT nIDEvent) void CBaseStairDlg::OnTimer(UINT_PTR nIDEvent) { if(nIDEvent==1)//暂用于改善外观 { KillTimer(1); MSG msg; while(::PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE)); GetDlgItem(IDC_AS_ASCENT)->Invalidate(); GetDlgItem(IDC_NEED2D)->Invalidate(); GetDlgItem(IDC_NEED3D)->Invalidate(); } CObjPreviewDlg::OnTimer(nIDEvent); } void CBaseStairDlg::OnPaint() { CObjPreviewDlg::OnPaint(); SetTimer(1,10,NULL); } BOOL CBaseStairDlg::PreTranslateMessage(MSG *pMsg) { if(pMsg->message==WM_KEYDOWN) { // Zyu modify on 100722,支持64位 //int vk=pMsg->wParam; INT_PTR vk=pMsg->wParam; if(vk==VK_RETURN&&GetFocus()==GetDlgItem(IDC_STEP_HEIGHT)) { UpdateEdit(IDC_STEP_HEIGHT,TRUE); //NextDlgCtrl(); return TRUE; } //modify by xlc on 090513 解决回车和ESC退出的问题 else if (pMsg->wParam == VK_RETURN) { CWnd *wnd = GetFocus (); if (wnd != NULL) { TCHAR str[256]; CString ClassName = _T("Button"); GetClassName (wnd->m_hWnd, str, 256); if (ClassName == str) { UINT i = wnd->GetDlgCtrlID (); SendMessage (WM_COMMAND, i, (LPARAM)wnd->m_hWnd); return TRUE; } } CWnd *mwnd = GetDlgItem (IDOK); if (mwnd) { mwnd->SetFocus(); return TRUE; } } else if (pMsg->wParam == VK_ESCAPE) { GetDlgItem(IDCANCEL)->SetFocus(); CModelessDialog::OnCancel (); return FALSE; } } return CObjPreviewDlg::PreTranslateMessage(pMsg); }