EnumCapValue Example for C++ 5.0 and later

// This function will fill a combo box with the values of a certain
// capability either by converting the value to a string or have 
// the string value from a previously defined array
// The function will have the ICapability pointer, a handle to the 
// combo box, pointer to an array to get strings from, and a variant
// to have the current value

int TwainFillComboBox (ICapability * pCapability, HWND hItem, char szArray[][32], ILEADRasterVariant * *pltRasVar)
{
   HRESULT hr; 
   short iConType; 
   ValueType vType; 

   pCapability->get_
ConType (&iConType); 
   
   switch (iConType) 
   {
   case L_TWON_ONEVALUE: 
      {
         ICapabilityOneValue * pCapOV = NULL; 

         hr = pCapability->QueryInterface (IID_ICapabilityOneValue, (void **)&pCapOV); 
         if (FAILED (hr) || !pCapOV) 
            return 1; 

         pCapOV->get_
OneValCapValue (pltRasVar); 
         vType = (*pltRasVar)->Type; 
         switch (vType) 
         {
         case VALUE_CHAR: 
         case VALUE_SHORT: 
         case VALUE_BYTE: 
            if (szArray) 
            {
               short index = (*pltRasVar)->ShortValue; 
               ComboBox_InsertString(hItem, 0, szArray[index]); 
            }
            else
            {
               char sztext[32]; 
               sprintf(sztext, "%d", (*pltRasVar)->ShortValue); 
               ComboBox_InsertString(hItem, 0, sztext); 
            }
            ComboBox_SetItemData(hItem, 0, (*pltRasVar)->ShortValue); 
            break; 
         case VALUE_LONG: 
         case VALUE_USHORT: 
            if (szArray) 
            {
               long index = (*pltRasVar)->LongValue; 
               ComboBox_InsertString(hItem, 0, szArray[index]); 
            }
            else
            {
               char sztext[32]; 
               sprintf(sztext, "%d", (*pltRasVar)->LongValue); 
               ComboBox_InsertString (hItem, 0, sztext); 
            }
            ComboBox_SetItemData (hItem, 0, (*pltRasVar)->LongValue); 
            break; 

         case VALUE_ULONG: 
            if (szArray) 
            {
               ULONG index = (ULONG)(*pltRasVar)->DoubleValue; 
               ComboBox_InsertString (hItem, 0, szArray[index]); 
            }
            else
            {
               char sztext[32]; 
               sprintf (sztext, "%d", (*pltRasVar)->DoubleValue); 
               ComboBox_InsertString (hItem, 0, sztext); 
            }
            ComboBox_SetItemData (hItem, 0, (*pltRasVar)->DoubleValue); 
            break; 
         case VALUE_BOOLEAN: 
            if ((*pltRasVar)->GetBooleanValue())
               ComboBox_InsertString (hItem, 0, "TRUE");
            else
               ComboBox_InsertString (hItem, 0, "FALSE");

            ComboBox_SetItemData (hItem, 0, (*pltRasVar)->GetBooleanValue());
            break; 
         case VALUE_FLOAT: 
            {
               char sztext[32]; 
               sprintf (sztext, "%f", (*pltRasVar)->FloatValue); 
               ComboBox_InsertString (hItem, 0, sztext); 
            }
            break; 
         default: 
            pCapOV->Release ();
            return 1; 
         }
         ComboBox_SetCurSel (hItem, 0); 
         pCapOV->Release ();
      }
      break; 
   case L_TWON_ENUMERATION: 
      {
         long nCount = 0, nIndex = 0, nCurIndex = 0, nDefIndex = 0; 
         short iItemType = 0; 
         ICapabilityEnumeration * pCapEnum = NULL; 

         hr = pCapability->QueryInterface (IID_ICapabilityEnumeration, (void **)&pCapEnum); 
         if (FAILED (hr) || !pCapEnum) 
            return 1; 
         
         pCapEnum->get_
EnumNumOfItems (&nCount); 
         pCapEnum->get_
EnumItemType (&iItemType); 
         pCapEnum->get_
EnumCurrentIndex (&nCurIndex); 
         pCapEnum->get_
EnumDefaultIndex (&nDefIndex); 
         for (nIndex = 0 ; nIndex < nCount ; nIndex ++)
         {
            pCapEnum->get_
EnumCapValue (nIndex, &(*pltRasVar)); 
            vType = (*pltRasVar)->Type; 
            switch (vType) 
            {
            case VALUE_CHAR: 
            case VALUE_SHORT: 
            case VALUE_BYTE: 
               if (szArray) 
               {
                  short index = (*pltRasVar)->ShortValue; 
                  ComboBox_InsertString(hItem, 0, szArray[index]); 
               }
               else
               {
                  char sztext[32]; 
                  sprintf(sztext, "%d", (*pltRasVar)->ShortValue); 
                  ComboBox_InsertString(hItem, 0, sztext); 
               }
               ComboBox_SetItemData(hItem, 0, (*pltRasVar)->ShortValue); 
               break; 
            case VALUE_LONG: 
            case VALUE_USHORT: 
               if (szArray) 
               {
                  long index = (*pltRasVar)->LongValue; 
                  ComboBox_InsertString(hItem, 0, szArray[index]); 
               }
               else
               {
                  char sztext[32]; 
                  sprintf(sztext, "%d", (*pltRasVar)->LongValue); 
                  ComboBox_InsertString (hItem, 0, sztext); 
               }
               ComboBox_SetItemData (hItem, 0, (*pltRasVar)->LongValue); 
               break; 

            case VALUE_ULONG: 
               if (szArray) 
               {
                  ULONG index = (ULONG)(*pltRasVar)->DoubleValue; 
                  ComboBox_InsertString (hItem, 0, szArray[index]); 
               }
               else
               {
                  char sztext[32]; 
                  sprintf (sztext, "%d", (*pltRasVar)->DoubleValue); 
                  ComboBox_InsertString (hItem, 0, sztext); 
               }
               ComboBox_SetItemData (hItem, 0, (*pltRasVar)->DoubleValue); 
               break; 
            case VALUE_BOOLEAN: 
               if ((*pltRasVar)->GetBooleanValue())
                  ComboBox_InsertString (hItem, 0, "TRUE");
               else
                  ComboBox_InsertString (hItem, 0, "FALSE");

               ComboBox_SetItemData (hItem, 0, (*pltRasVar)->GetBooleanValue());
               break; 
            case VALUE_FLOAT: 
               {
                  char sztext[32]; 
                  sprintf (sztext, "%f", (*pltRasVar)->FloatValue); 
                  ComboBox_InsertString (hItem, 0, sztext); 
               }
               break; 
            case VALUE_STRING: 
               {
                  BSTR bstrVal = (*pltRasVar)->GetStringValue();
                  CString * pstrText = new CString(bstrVal); 
                  if (pstrText) 
                  {
                     ComboBox_InsertString (hItem, nIndex, pstrText->GetBuffer(0)); 
                     pstrText->ReleaseBuffer();
                     delete pstrText; 
                  }
               }
               break; 
            }
         }

         ComboBox_SetCurSel (hItem, nCurIndex); 
         pCapEnum->Release ();
      }
      break; 
   case L_TWON_ARRAY: 
      {
         long nCount = 0, nIndex = 0; 
         short iItemType = 0; 
         ICapabilityArray * pCapArray = NULL; 

         hr = pCapability->QueryInterface (IID_ICapabilityArray, (void **)&pCapArray); 
         if (FAILED (hr) || !pCapArray) 
            return 1; 

         pCapArray->get_
ArrayNumOfItems (&nCount); 
         pCapArray->get_
ArrayItemType (&iItemType);         
         for (nIndex = 0 ; nIndex < nCount ; nIndex ++)
         {
            pCapArray->get_
ArrayCapValue (nIndex, &(*pltRasVar)); 
            vType = (*pltRasVar)->Type; 
            switch (vType) 
            {
            case VALUE_CHAR: 
            case VALUE_SHORT: 
            case VALUE_BYTE: 
               if (szArray) 
               {
                  short index = (*pltRasVar)->ShortValue; 
                  ComboBox_InsertString(hItem, 0, szArray[index]); 
               }
               else
               {
                  char sztext[32]; 
                  sprintf(sztext, "%d", (*pltRasVar)->ShortValue); 
                  ComboBox_InsertString(hItem, 0, sztext); 
               }
               ComboBox_SetItemData(hItem, 0, (*pltRasVar)->ShortValue); 
               break; 
            case VALUE_LONG: 
            case VALUE_USHORT: 
               if (szArray) 
               {
                  long index = (*pltRasVar)->LongValue; 
                  ComboBox_InsertString(hItem, 0, szArray[index]); 
               }
               else
               {
                  char sztext[32]; 
                  sprintf(sztext, "%d", (*pltRasVar)->LongValue); 
                  ComboBox_InsertString (hItem, 0, sztext); 
               }
               ComboBox_SetItemData (hItem, 0, (*pltRasVar)->LongValue); 
               break; 

            case VALUE_ULONG: 
               if (szArray) 
               {
                  ULONG index = (ULONG)(*pltRasVar)->DoubleValue; 
                  ComboBox_InsertString (hItem, 0, szArray[index]); 
               }
               else
               {
                  char sztext[32]; 
                  sprintf (sztext, "%d", (*pltRasVar)->DoubleValue); 
                  ComboBox_InsertString (hItem, 0, sztext); 
               }
               ComboBox_SetItemData (hItem, 0, (*pltRasVar)->DoubleValue); 
               break; 
            case VALUE_BOOLEAN: 
               if ((*pltRasVar)->GetBooleanValue())
                  ComboBox_InsertString (hItem, 0, "TRUE");
               else
                  ComboBox_InsertString (hItem, 0, "FALSE");

               ComboBox_SetItemData (hItem, 0, (*pltRasVar)->GetBooleanValue());
               break; 
            case VALUE_FLOAT: 
               {
                  char sztext[32]; 
                  sprintf (sztext, "%f", (*pltRasVar)->FloatValue); 
                  ComboBox_InsertString (hItem, 0, sztext); 
               }
               break; 
            case VALUE_STRING: 
               {
                  BSTR bstrVal = (*pltRasVar)->GetStringValue();
                  CString * pstrText = new CString(bstrVal); 
                  if (pstrText) 
                  {
                     ComboBox_InsertString (hItem, nIndex, pstrText->GetBuffer(0)); 
                     pstrText->ReleaseBuffer();
                     delete pstrText; 
                  }
               }
               break; 
            }
         }

         ComboBox_SetCurSel (hItem, 0); 
         pCapArray->Release ();
      }
      break; 
   case L_TWON_RANGE: 
      {
         char sztext[32]; 
         short iItemType; 
         bool bIncrement = true; 
         ILEADRasterVariant * pltRasMinVal = NULL; 
         ILEADRasterVariant * pltRasMaxVal = NULL; 
         ILEADRasterVariant * pltRasStepVal = NULL; 
         ILEADRasterVariant * pltRasDefVal = NULL; 

         long nMinVal, nMaxVal, nStep, nDefVal, nCurVal, nValue, nIndex = 0, nCurIdx = 0; 
         ICapabilityRange * pCapRange = NULL; 

         hr = pCapability->QueryInterface (IID_ICapabilityRange, (void **)&pCapRange); 
         if (FAILED (hr) || !pCapRange) 
            return 1; 

         pCapRange->get_
RangeItemType (&iItemType); 
         pCapRange->get_
RangeMinimumValue(&pltRasMinVal); 
         pCapRange->get_
RangeMaximumValue(&pltRasMaxVal); 
         pCapRange->get_
RangeStepSize(&pltRasStepVal); 
         pCapRange->get_
RangeDefaultValue(&pltRasDefVal); 
         pCapRange->get_
RangeCurrentValue(pltRasVar); 
         pCapRange->Release ();

         if (pltRasMinVal->Type == VALUE_FLOAT) nMinVal = GetLongValue(pltRasMinVal->FloatValue); 
         if (pltRasMaxVal->Type == VALUE_FLOAT) nMaxVal = GetLongValue(pltRasMaxVal->FloatValue); 
         if (pltRasStepVal->Type== VALUE_FLOAT) nStep =   GetLongValue(pltRasStepVal->FloatValue); 
         if (pltRasDefVal->Type == VALUE_FLOAT) nDefVal = GetLongValue(pltRasDefVal->FloatValue); 
         if ((*pltRasVar)->Type == VALUE_FLOAT) nCurVal = GetLongValue((*pltRasVar)->FloatValue); 

         for (nValue = nMinVal ; nValue <= nMaxVal ; nValue += nStep) 
         {
            if (nValue == nCurVal) 
               bIncrement = false; 

            if (bIncrement) 
               nCurIdx ++;
            sprintf (sztext, "%d", nValue); 
            ComboBox_InsertString (hItem, nIndex, sztext); 
            nIndex ++;

            if (nMinVal == nMaxVal) 
               break; 
         }
         ComboBox_SetCurSel (hItem, nCurIdx); 

         pltRasMinVal->Release();
         pltRasMaxVal->Release();
         pltRasStepVal->Release();
         pltRasDefVal->Release();
      }
      break; 
   default: 
      return 1; 
      break; 
   }
   return 0; 
}

long GetLongValue (float fVal) 
{
   long lResult; 

   lResult = (long)fVal; 
   if (fVal < 0) 
   {
      fVal *= -1; 
      lResult = (long)fVal; 
      lResult *= -1; 
   }

   return lResult; 
}