⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idcombo.cpp

📁 浏览所有的PCI设备
💻 CPP
字号:
// IDCombo.cpp : implementation file
//

#include "stdafx.h"
#include "IDCombo.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CIDCombo

CIDCombo::CIDCombo()
{
 maxlen = 0;  // no limit
}

CIDCombo::~CIDCombo()
{
}


BEGIN_MESSAGE_MAP(CIDCombo, CComboBox)
        //{{AFX_MSG_MAP(CIDCombo)
        ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIDCombo message handlers

/****************************************************************************
*                              CIDCombo::Select
* Inputs:
*       DWORD itemval: ItemData value
* Result: int
*       The index of the selected value, or CB_ERR if no selection possible
* Effect: 
*       If the value exists in the list, selects it, otherwise selects -1
****************************************************************************/

int CIDCombo::Select(DWORD itemval)
    {
     for(int i = 0; i < GetCount(); i++)
        { /* select */
         DWORD data = GetItemData(i);
         if(itemval == data)
            { /* found it */
             SetCurSel(i);
             return i;
            } /* found it */
        } /* select */

     SetCurSel(-1);
     return CB_ERR;
    }

/****************************************************************************
*                             CIDCombo::AddString
* Inputs:
*       IDData * data: Data to add
* Result: int
*       Index of insertion, or CB_ERR
* Effect: 
*       Adds the string designated by the ID to the combo box, and adds its
*       value to the itemdata
****************************************************************************/

int CIDCombo::AddString(IDData * data)
    {
     CString s;
     if(s.LoadString(data->id) == 0)
        return CB_ERR;

     int i = CComboBox::AddString(s);
     if(i == CB_ERR)
        return CB_ERR;
     CComboBox::SetItemData(i, data->val);
     return i;
    }

/****************************************************************************
*                            CIDCombo::AddStrings
* Inputs:
*       IDData * data: Pointer to data table
*       int def: ID of default control, or 0 if no default control is to be
*                selected.  
* Result: int
*       index of object selected by 'def'
*       CB_ERR if 'def' object not in list, or error loading, or def == 0
* Effect: 
*       Adds the strings in the table to the combo box.  The table is 
*       terminated by an entry whose id field is 0
* Notes:
*       To select value by itemdata, use the explicit Select operation
****************************************************************************/

int CIDCombo::AddStrings(IDData * data, int def)
    {
     BOOL found = FALSE;
     CString s;

     for(int i = 0; data[i].id != 0; i++)
        { /* add it */
         int index = AddString(&data[i]);
         if(index == CB_ERR)
           return CB_ERR;
         if(def != 0 && data[i].id == def)
            { /* has selection */
             GetLBText(index, s);
             found = TRUE;
            } /* has selection */
        } /* add it */
     if(found)
        { /* locate selection */
         int index = FindStringExact(-1, s);
         if(index == CB_ERR)
            return CB_ERR;
         return index;
        } /* locate selection */

     return CB_ERR; // no selection matched
    }

/****************************************************************************
*                            CIDCombo::OnDropdown
* Result: void
*       
* Effect: 
*       Sizes the combo to a minimum size required to show everything
* Notes:
*       maxlen determines the maximum length of the combo dropdown
*               0 - no limit, sized so there is no scrollbar
*              >0 - limit to maxlen items, but at least 2
*              -1 - implicitly limit to screen size (NYI)
****************************************************************************/

void CIDCombo::OnDropdown() 
{
 int n = GetCount();
 n = max(n, 2);

 int ht = GetItemHeight(0);
 CRect r;
 GetWindowRect(&r);

 if(maxlen > 0)
    n = max(maxlen, 2);

 CSize sz;
 sz.cx = r.Width();
 sz.cy = ht * (n + 2);

 if(maxlen < 0)
    { /* screen limit */
     if(r.top - sz.cy < 0 || r.bottom + sz.cy > ::GetSystemMetrics(SM_CYSCREEN))
        { /* invoke limit */
         // Compute the largest distance the dropdown can appear, 
         // relative to the screen (not the window!)

         int k = max( (r.top / ht), 
                      (::GetSystemMetrics(SM_CYSCREEN) - r.bottom) / ht);

         // compute new space. Note that we don't really fill the screen.
         // We only have to use this size if it is smaller than the max size
         // actually required
         int ht2 = ht * k;
         sz.cy = min(ht2, sz.cy);
        } /* invoke limit */
    } /* screen limit */

 SetWindowPos(NULL, 0, 0, sz.cx, sz.cy, SWP_NOMOVE | SWP_NOZORDER);
}

/****************************************************************************
*                            CIDCombo::GetCurItem
* Result: DWORD
*       The itemdata of the current selection, or 0 if there is no selection
****************************************************************************/

DWORD CIDCombo::GetCurItem()
    {
     int i = GetCurSel();
     if(i == CB_ERR)
        return 0;
     return GetItemData(i);
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -