CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2019 开发者帮助

向处理程序添加代码

2024-5-18 17:56| 发布者: admin| 查看: 89| 评论: 0|原作者: admin|来自: AutoCAD

向处理程序添加代码

添加处理程序后,即可添加代码来处理对话框。本部分总结了每个处理程序对完整列表执行的操作。

向 MFC 对话框的处理程序添加代码

  1. 添加实用程序函数以转换、显示和验证值。使用 and 控件执行此操作:CAcUiNumericCAcUiAngleEdit
    // Utility functions
    void AsdkAcUiDialogSample::DisplayPoint() 
    {
        m_ctrlXPtEdit.SetWindowText(m_strXPt);
        m_ctrlXPtEdit.Convert();
        m_ctrlYPtEdit.SetWindowText(m_strYPt);
        m_ctrlYPtEdit.Convert();
        m_ctrlZPtEdit.SetWindowText(m_strZPt);
        m_ctrlZPtEdit.Convert();
    }
    bool AsdkAcUiDialogSample::ValidatePoint() 
    {
        if (!m_ctrlXPtEdit.Validate())
            return false;
        if (!m_ctrlYPtEdit.Validate())
            return false;
        if (!m_ctrlZPtEdit.Validate())
            return false;
        return true;
    }
    void AsdkAcUiDialogSample::DisplayAngle() 
    {
        m_ctrlAngleEdit.SetWindowText(m_strAngle);
        m_ctrlAngleEdit.Convert();
    }
    bool AsdkAcUiDialogSample::ValidateAngle() 
    {
        if (!m_ctrlAngleEdit.Validate())
            return false;
        return true;
    }
    
  2. 添加实用程序函数以循环访问两个符号表,并在两个列表框中显示名称:
    void AsdkAcUiDialogSample::DisplayBlocks() 
    {
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()
            ->getSymbolTable(pBlockTable, AcDb::kForRead);
        // Iterate through the block table and display 
        // the names in the list box.
        //
        const char *pName;
        AcDbBlockTableIterator *pBTItr;
        if (pBlockTable->newIterator(pBTItr) == Acad::eOk) {
            while (!pBTItr->done()) {
                AcDbBlockTableRecord *pRecord;
                if (pBTItr->getRecord(pRecord, AcDb::kForRead)
                    == Acad::eOk) {
                    pRecord->getName(pName);
                    m_ctrlBlockListBox.InsertString(-1, pName);
                    pRecord->close();
                }	
                pBTItr->step();
            }
        }
        pBlockTable->close();
    }
    void AsdkAcUiDialogSample::DisplayRegApps() 
    {
        AcDbRegAppTable *pRegAppTable;
        acdbHostApplicationServices()->workingDatabase()
            ->getSymbolTable(pRegAppTable, AcDb::kForRead);
        // Iterate through the reg app table and display the 
        // names in the list box.
        //
        const char *pName;
        AcDbRegAppTableIterator *pItr;
        if (pRegAppTable->newIterator(pItr) == Acad::eOk) {
            while (!pItr->done()) {
                AcDbRegAppTableRecord *pRecord;
                if (pItr->getRecord(pRecord, AcDb::kForRead) 
                    == Acad::eOk) {
                    pRecord->getName(pName);
                    m_ctrlRegAppComboBox.InsertString(-1, pName);
                    pRecord->close();
                }
                pItr->step();
            }
        }
        pRegAppTable->close();
    }
    
  3. 将函数和变量的声明添加到头文件中的类定义中
        void DisplayPoint();	
        bool ValidatePoint();
        void DisplayAngle();
        bool ValidateAngle();
        void DisplayBlocks();
        void DisplayRegApps();
        CString m_strAngle;
        CString m_strXPt;
        CString m_strYPt;
        CString m_strZPt;
    
  4. 添加按钮处理程序,以便使用 AutoCAD 编辑器拾取点和角度。、 和 函数用于隐藏对话框,允许调用 和 ,最后,根据用户选择的方式取消或重新显示对话框:BeginEditorCommand()CompleteEditorCommand()CancelEditorCommand()acedGetPointacedGetAngle
    // AsdkAcUiDialogSample message handlers
    void AsdkAcUiDialogSample::OnButtonPoint() 
    {
        // Hide the dialog and give control to the editor
        //
        BeginEditorCommand();
        ads_point pt;
        // Get a point
        //
        if (acedGetPoint(NULL, "\nPick a point: ", pt) == RTNORM) {
            // If the point is good, continue
            //
            CompleteEditorCommand();
            m_strXPt.Format("%g", pt[X]);
            m_strYPt.Format("%g", pt[Y]);
            m_strZPt.Format("%g", pt[Z]);
            DisplayPoint();
        } else {
            // otherwise cancel the command (including the dialog)
            CancelEditorCommand();
        }
    }
    void AsdkAcUiDialogSample::OnButtonAngle() 
    {
        // Hide the dialog and give control to the editor
        //
        BeginEditorCommand();
        // Set up the default point for picking an angle
        // based on the m_strXPt, m_strYPt, and m_strZPt values
        //
        ads_point pt; 
        acdbDisToF(m_strXPt, -1, &pt[X]);
        acdbDisToF(m_strYPt, -1, &pt[Y]);
        acdbDisToF(m_strZPt, -1, &pt[Z]);
        double angle;
        // Get a point from the user
        //
        if (acedGetAngle
            (pt, "\nPick an angle: ", &angle) == RTNORM) {
            // If we got an angle, go back to the dialog
            //
            CompleteEditorCommand();
            // Convert the acquired radian value to degrees since 
            // the AcUi control can convert that to the other 
            // formats.
            //
            m_strAngle.Format("%g", angle*(180.0/PI));
            DisplayAngle();
        } else {
        // otherwise cancel the command (including the dialog)
        //
            CancelEditorCommand();
        }
    }
    
  5. 实现编辑框处理程序。这些函数将值转换为当前单位设置:
    void AsdkAcUiDialogSample::OnKillfocusEditAngle() 
    {
        // Get and update text the user typed in.
        //
        m_ctrlAngleEdit.Convert();
        m_ctrlAngleEdit.GetWindowText(m_strAngle);
    }
    void AsdkAcUiDialogSample::OnKillfocusEditXpt() 
    {
        // Get and update text the user typed in.
        //
        m_ctrlXPtEdit.Convert();
        m_ctrlXPtEdit.GetWindowText(m_strXPt);
    }
    void AsdkAcUiDialogSample::OnKillfocusEditYpt() 
    {
        // Get and update text the user typed in.
        //
        m_ctrlYPtEdit.Convert();
        m_ctrlYPtEdit.GetWindowText(m_strYPt);
    }
    void AsdkAcUiDialogSample::OnKillfocusEditZpt() 
    {
        // Get and update text the user typed in.
        //
        m_ctrlZPtEdit.Convert();
        m_ctrlZPtEdit.GetWindowText(m_strZPt);
    }
    
  6. 实现组合框处理程序以允许用户键入字符串,然后将用户的字符串注册为应用程序名称。这一步虽然没有什么实用价值,但演示了组合框的使用:
    void AsdkAcUiDialogSample::OnKillfocusComboRegapps() 
    {
        CString strFromEdit;
        m_ctrlRegAppComboBox.GetWindowText(strFromEdit);
        if (m_ctrlRegAppComboBox.FindString(-1, strFromEdit) == CB_ERR)
            if (acdbRegApp(strFromEdit) == RTNORM)
                m_ctrlRegAppComboBox.AddString(strFromEdit);
    }
    
  7. 在此示例的处理程序中处理数据验证。(当然,它可以在其他地方完成。另请注意,处理程序使用以下函数将数据存储在用户配置文件(注册表)中:OnOk()OnOk()SetDialogData()
    void AsdkAcUiDialogSample::OnOK() 
    {
        if (!ValidatePoint()) {
            AfxMessageBox("Sorry, Point out of desired range.");
            m_ctrlXPtEdit.SetFocus();
            return;
        } 
        if (!ValidateAngle()) {
            AfxMessageBox("Sorry, Angle out of desired range.”);
            m_ctrlAngleEdit.SetFocus();
            return;
        }
        CAcUiDialog::OnOK();
        // Store the data into the registry
        //
        SetDialogData("ANGLE", m_strAngle);
        SetDialogData("POINTX", m_strXPt);
        SetDialogData("POINTY", m_strYPt);
        SetDialogData("POINTZ", m_strZPt);
    }
    
  8. 最后,该函数负责初始化,包括调整大小和数据持久性要求:OnInitDialog()

    BOOL AsdkAcUiDialogSample::OnInitDialog() 
    {
        // Set the dialog name for registry lookup and storage
        //
        SetDialogName("AsdkAcUiSample:AsdkAcUiDialog");
        CAcUiDialog::OnInitDialog();
        DLGCTLINFO	dlgSizeInfo[]= {
            { IDC_STATIC_GROUP1, ELASTICX, 20 },
            { IDC_STATIC_GROUP1, ELASTICY, 100 },
            { IDC_EDIT_XPT, ELASTICX, 20 },
            { IDC_EDIT_YPT, ELASTICX, 20 },
            { IDC_EDIT_ZPT, ELASTICX, 20 },
            { IDC_EDIT_ANGLE, ELASTICX, 20 },
            { IDC_STATIC_GROUP2, MOVEX, 20 },
            { IDC_STATIC_GROUP2, ELASTICY, 100 },
            { IDC_STATIC_GROUP2, ELASTICX, 80 },
            { IDC_LIST_BLOCKS, MOVEX, 20 },
            { IDC_LIST_BLOCKS, ELASTICY, 100 },
            { IDC_STATIC_TEXT2, MOVEX, 20 },
            { IDC_STATIC_TEXT2, MOVEY, 100 },
            { IDC_LIST_BLOCKS, ELASTICX, 80 },
            { IDC_STATIC_TEXT2, ELASTICX, 80 },
            { IDC_STATIC_GROUP3, MOVEY, 100 },
            { IDC_STATIC_GROUP3, ELASTICX, 20 },
            { IDC_COMBO_REGAPPS, MOVEY, 100 },
            { IDC_COMBO_REGAPPS, ELASTICX, 20 },
            { IDC_STATIC_TEXT3, MOVEY, 100 },
            { IDC_STATIC_TEXT3, ELASTICX, 20 },
            { IDOK,MOVEX, 100 },
            { IDCANCEL, MOVEX, 100 },
        };
        const DWORD numberofentries = 
            sizeof dlgSizeInfo / sizeof DLGCTLINFO;
        SetControlProperty(dlgSizeInfo, numberofentries);
        // Must be within a 100-unit cube centered about 0,0,0.
        // 
        m_ctrlXPtEdit.SetRange(-50.0, 50.0);
        m_ctrlYPtEdit.SetRange(-50.0, 50.0);
        m_ctrlZPtEdit.SetRange(-50.0, 50.0);
        // Must be between 0 and 90 degrees.
        //
        m_ctrlAngleEdit.SetRange(0.0, 90.0 /*(PI/2.0)*/);
        // Assign a title for the dialog.
        //
        SetWindowText("AcUiDialog Sample");
        // Load the default bitmaps.
        //
        m_ctrlPickButton.AutoLoad();
        m_ctrlAngleButton.AutoLoad();
        // Get and display the preserved data from the registry.
        //
        if (!GetDialogData("ANGLE", m_strAngle))
            m_strAngle = "0.0";
        if (!GetDialogData("POINTX", m_strXPt))
            m_strXPt = "0.0";
        if (!GetDialogData("POINTY", m_strYPt))
            m_strYPt = "0.0";
        if (!GetDialogData("POINTZ", m_strZPt))
            m_strZPt = "0.0";
        DisplayPoint();
        DisplayAngle();
        DisplayBlocks();
        DisplayRegApps();
        // return TRUE unless you set the focus to a control
        return TRUE; 
    }
    

父主题:

  1. 使用 AdUi 和 AcUi

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2024-12-15 22:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部