向处理程序添加代码 
添加处理程序后,即可添加代码来处理对话框。本部分总结了每个处理程序对完整列表执行的操作。 
向 MFC 对话框的处理程序添加代码
- 添加实用程序函数以转换、显示和验证值。使用 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;
}
 
- 添加实用程序函数以循环访问两个符号表,并在两个列表框中显示名称:
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();
}
 
- 将函数和变量的声明添加到头文件中的类定义中
    void DisplayPoint();	
    bool ValidatePoint();
    void DisplayAngle();
    bool ValidateAngle();
    void DisplayBlocks();
    void DisplayRegApps();
    CString m_strAngle;
    CString m_strXPt;
    CString m_strYPt;
    CString m_strZPt;
 
 
- 添加按钮处理程序,以便使用 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();
    }
}
 
- 实现编辑框处理程序。这些函数将值转换为当前单位设置:
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);
}
 
- 实现组合框处理程序以允许用户键入字符串,然后将用户的字符串注册为应用程序名称。这一步虽然没有什么实用价值,但演示了组合框的使用:
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);
}
 
- 在此示例的处理程序中处理数据验证。(当然,它可以在其他地方完成。另请注意,处理程序使用以下函数将数据存储在用户配置文件(注册表)中: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);
}
 
- 最后,该函数负责初始化,包括调整大小和数据持久性要求: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; 
}
 
 
 
    
 |