用鼠标,对于多个重叠的物体进行选取,照书上的说法,应该使用Z值来判断哪个物体在可视空间中最靠近用户,而进行确定选取。
      可是现在还是不大理解,书上没有相应的例子加以说明。请问谁能够提供相应的例子出来学习吗?谢谢了!!

解决方案 »

  1.   

    // ´¦ÀíÑ¡ÔñģʽËù²úÉúµÄ½á¹û¡£ ËÕÓñÑï 2002.2.25.
    GLuint WINAPI ProcessSelection(CMyDoc* m_pDoc, GLuint hits, GLuint buffer[], bool bCutTree)
    {
    unsigned int i;
    CString str, strCommand, strDisplay;
    GLuint names, *ptr, id, idd;
    int z1, z2, zmin;
    RECT ChildRect;

    ChildRect.left = 100;
    ChildRect.right = 400;
    ChildRect.top = 100;
    ChildRect.bottom = 300;
    zmin = -1;
    ptr = (GLuint*)buffer;
    for(i=0;i<hits;i++)
    {
    names = *ptr;
    ptr++;
    z1 = *ptr;
    ptr++;
    z2 = *ptr;
    ptr++;
    id = *ptr;
    ptr++;
    if(id==0)continue;
    if(zmin==-1)
    {
    zmin = z2;
    idd = id;
    }
    else if(z2<zmin)
    {
    zmin = z2;
    idd = id;
    }
    }
    if(bCutTree)return idd;
    if(idd<10)
    str.Format("0%u", idd);
    else
    str.Format("%u", idd);

    CString strPath;
    LPTSTR pszPath;
    CString strCommandLine;
    LPTSTR pszCommandLine;
      
    STARTUPINFO startup;
    PROCESS_INFORMATION process;
    BOOL tSuccess;   
       
    strPath += _T( "hpvfp6vr.exe" );   
    memset( &startup, 0, sizeof( startup ) );
    startup.cb = sizeof( startup );
    startup.dwFlags = STARTF_USESHOWWINDOW|STARTF_USEPOSITION;
    startup.wShowWindow = SW_HIDE;
    startup.dwX = 400;
    startup.dwY = 100;
    memset( &process, 0, sizeof( process ) ); strCommandLine.Format( "\"%s\" %s %s", LPCTSTR( strPath ), "2", str);
    pszCommandLine = strCommandLine.GetBuffer( 0 );
    tSuccess = CreateProcess( NULL, pszCommandLine, NULL, NULL, false,
    0, NULL, NULL, &startup, &process );
    strCommandLine.ReleaseBuffer();
    if( tSuccess )
    {
    // Close the handles that CreateProcess returned so we don't leak
    // kernel resources.
    ASSERT( process.hProcess != NULL );
    CloseHandle( process.hProcess );
    ASSERT( process.hThread != NULL );
    CloseHandle( process.hThread );
    }
    else
    {
    strDisplay = "hpvfp6vr.exe &Ocirc;&Euml;&ETH;&ETH;&Icirc;&Auml;&frac14;&thorn;&Atilde;&raquo;&Oacute;&ETH;·&cent;&Iuml;&Ouml;&pound;&not;&Ccedil;&euml;&frac14;ì&sup2;é&Acirc;·&frac34;&para;&Ecirc;&Ccedil;·&ntilde;&Otilde;&yacute;&Egrave;·&pound;&not;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;&Ecirc;&Ccedil;·&ntilde;&Oacute;&ETH;&ETH;§&pound;&iexcl;";
    ::MessageBox(NULL, strDisplay, "&acute;í&Icirc;ó&pound;&ordm;", MB_OK|MB_ICONQUESTION|MB_SETFOREGROUND);
    }/* strCommand.Format("hpvfp6vr %s %s", "2", str);
    if(::WinExec(strCommand, SW_HIDE)<=31)
    {
    strDisplay = "hpvfp6vr.exe &Ocirc;&Euml;&ETH;&ETH;&Icirc;&Auml;&frac14;&thorn;&Atilde;&raquo;&Oacute;&ETH;·&cent;&Iuml;&Ouml;&pound;&not;&Ccedil;&euml;&frac14;ì&sup2;é&Acirc;·&frac34;&para;&Ecirc;&Ccedil;·&ntilde;&Otilde;&yacute;&Egrave;·&pound;&not;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;&Ecirc;&Ccedil;·&ntilde;&Oacute;&ETH;&ETH;§&pound;&iexcl;";
    ::MessageBox(NULL, strDisplay, "&acute;í&Icirc;ó&pound;&ordm;", MB_OK|MB_ICONQUESTION|MB_SETFOREGROUND);
    } */
    return idd;
    // str.Format("&Acirc;&yen;·&iquest;&micro;&Auml;&Oacute;&Atilde;&raquo;§&ordm;&Aring;&pound;&ordm;%ld", idd);
    // ::MessageBox(NULL, str, "Info", MB_OK | MB_ICONEXCLAMATION);
    CBuildingAttriSet BuildingAttriSet(&m_pDoc->m_pCWh->m_database);  // db passed via constructor BuildingAttriSet.m_strFilter.Format("id = '%u'", idd); BuildingAttriSet.m_strFilter="id=?";
    str.Format("%u", idd);
    BuildingAttriSet.m_idParam = str;
    CAttriOperateDlg AttriOperateDlg;

    // AttriRecView.OnInitialUpdate();
    // AttriRecView.Create(NULL, "&Ecirc;&ocirc;&ETH;&Ocirc;&sup2;&Ugrave;×÷", WS_VISIBLE|WS_POPUP|WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN, ChildRect, NULL, 0, NULL);
    // BuildingAttriSet.m_bUpdatable = true;
    BuildingAttriSet.Open();
    if(!BuildingAttriSet.IsEOF()) {
    AttriOperateDlg.m_iUserID = atol(BuildingAttriSet.m_id);
    AttriOperateDlg.m_strZIP = BuildingAttriSet.m_att01;
    AttriOperateDlg.m_strProvince = BuildingAttriSet.m_att02;
    AttriOperateDlg.m_strCounty = BuildingAttriSet.m_att03;
    AttriOperateDlg.m_strStreet = BuildingAttriSet.m_att04;
    AttriOperateDlg.m_strCourtyard = BuildingAttriSet.m_att05;
    AttriOperateDlg.m_strHouseNo = BuildingAttriSet.m_att06;
    AttriOperateDlg.m_iFloor = atol(BuildingAttriSet.m_att07);
    AttriOperateDlg.m_strDoorPlate = BuildingAttriSet.m_att08;
    AttriOperateDlg.m_strTelephone = BuildingAttriSet.m_att09;
    AttriOperateDlg.m_strUser = BuildingAttriSet.m_att10;
    AttriOperateDlg.m_strOwner = BuildingAttriSet.m_att11;
    AttriOperateDlg.m_strOtherAuthority = BuildingAttriSet.m_att12;
    AttriOperateDlg.m_dLandArea = BuildingAttriSet.m_att13;
    AttriOperateDlg.m_dUserArea = atof(BuildingAttriSet.m_att14);
    AttriOperateDlg.m_dBuildingArea = atof(BuildingAttriSet.m_att15);
    AttriOperateDlg.m_strBuildingType = BuildingAttriSet.m_att16;
    AttriOperateDlg.m_dBuildingZ = atof(BuildingAttriSet.m_att17);
    AttriOperateDlg.m_dSellLandValue = atof(BuildingAttriSet.m_att18);
    AttriOperateDlg.m_dTenancyLandValue = atof(BuildingAttriSet.m_att19);
    AttriOperateDlg.m_dCenterX = atof(BuildingAttriSet.m_att20);
    AttriOperateDlg.m_dCenterY = atof(BuildingAttriSet.m_att21);
    AttriOperateDlg.m_dZ = atof(BuildingAttriSet.m_att22);
    AttriOperateDlg.m_strClassCode = BuildingAttriSet.m_att23;
    AttriOperateDlg.m_strName = BuildingAttriSet.m_att24;

    // BuildingAttriSet.MoveNext();
    }
    else
    return 0;
    if(AttriOperateDlg.DoModal()==IDOK)
    {
    // BuildingAttriSet.MoveNext() BuildingAttriSet.Edit();
    str.Format("%u", AttriOperateDlg.m_iUserID);
    BuildingAttriSet.m_id = str;
    BuildingAttriSet.m_att01 = AttriOperateDlg.m_strZIP;
    BuildingAttriSet.m_att02 = AttriOperateDlg.m_strProvince;
    BuildingAttriSet.m_att03 = AttriOperateDlg.m_strCounty;
    BuildingAttriSet.m_att04 = AttriOperateDlg.m_strStreet;
    BuildingAttriSet.m_att05 = AttriOperateDlg.m_strCourtyard;
    BuildingAttriSet.m_att06 = AttriOperateDlg.m_strHouseNo;
    str.Format("%u", AttriOperateDlg.m_iFloor);
    BuildingAttriSet.m_att07 = str;
    BuildingAttriSet.m_att08 = AttriOperateDlg.m_strDoorPlate;
    BuildingAttriSet.m_att09 = AttriOperateDlg.m_strTelephone;
    BuildingAttriSet.m_att10 = AttriOperateDlg.m_strUser;
    BuildingAttriSet.m_att11 = AttriOperateDlg.m_strOwner;
    BuildingAttriSet.m_att12 = AttriOperateDlg.m_strOtherAuthority;
    str.Format("%lf", AttriOperateDlg.m_dLandArea);
    BuildingAttriSet.m_att13 = str;
    str.Format("%lf", AttriOperateDlg.m_dUserArea);
    BuildingAttriSet.m_att14 = str;
    str.Format("%lf", AttriOperateDlg.m_dBuildingArea);
    BuildingAttriSet.m_att15 = str;
    AttriOperateDlg.m_strBuildingType = BuildingAttriSet.m_att16;
    str.Format("%lf", AttriOperateDlg.m_dBuildingZ);
    BuildingAttriSet.m_att17 = str;
    str.Format("%lf", AttriOperateDlg.m_dSellLandValue);
    BuildingAttriSet.m_att18 = str;
    str.Format("%lf", AttriOperateDlg.m_dTenancyLandValue);
    BuildingAttriSet.m_att19 = str;
    str.Format("%lf", AttriOperateDlg.m_dCenterX);
    BuildingAttriSet.m_att20 = str;
    str.Format("%lf", AttriOperateDlg.m_dCenterY);
    BuildingAttriSet.m_att21 = str;
    str.Format("%lf", AttriOperateDlg.m_dZ);
    BuildingAttriSet.m_att22 = str;
    BuildingAttriSet.m_att23 = AttriOperateDlg.m_strClassCode;
    BuildingAttriSet.m_att24 = AttriOperateDlg.m_strName;

    if(BuildingAttriSet.CanUpdate())BuildingAttriSet.Update();
    // AttriOperateDlg.UpdateData(true);
    }
    if(BuildingAttriSet.IsOpen())
    {
    BuildingAttriSet.Close();
    }
    return idd;
    }