📄 bindview.cpp
字号:
// pathtoken name depending on if the node represents a network component or
// a binding path.
//
if ( GetItemInfo(lpnm->hwndFrom,
hItemSelected,
&lParam,
&dwItemType,
&fEnabled) ) {
if ( dwItemType & ITEM_NET_COMPONENTS ) {
//
// Show the shortcut menu of operations for a network component.
//
ShowComponentMenu( lpnm->hwndFrom,
hItemSelected,
lParam);
}
else {
if ( dwItemType & ITEM_NET_BINDINGS ) {
//
// Show the shortcut menu of operations for a binding path.
//
ShowBindingPathMenu( lpnm->hwndFrom,
hItemSelected,
lParam,
fEnabled );
}
}
}
}
return;
}
//
// Function: ShowComponentMenu
//
// Purpose: Show shortcut menu of options for a network component.
//
// Arguments:
// hwndOwner [in] Owner window.
// hItem [in] Selected item representing a network component.
// lParam [in] PnpID of the network component.
//
// Returns: None.
//
// Notes:
//
VOID ShowComponentMenu (HWND hwndOwner,
HTREEITEM hItem,
LPARAM lParam)
{
ULONG ulSelection;
POINT pt;
GetCursorPos( &pt );
ulSelection = (ULONG)TrackPopupMenu( hComponentSubMenu,
TPM_RIGHTALIGN | TPM_BOTTOMALIGN |
TPM_NONOTIFY | TPM_RETURNCMD |
TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
hwndOwner,
NULL );
if ( ulSelection ) {
//
// Do the selected action.
//
HandleComponentOperation( hwndOwner,
ulSelection,
hItem,
lParam );
}
return;
}
//
// Function: ShowBindingPathMenu
//
// Purpose: Show shortcut menu of options for a network component.
//
// Arguments:
// hwndOwner [in] Owner window.
// hItem [in] Selected item representing a binding path.
// lParam [in] PnpID of the network component.
// fEnabled [in] TRUE when the path is enabled.
//
// Returns: None.
//
// Notes:
//
VOID ShowBindingPathMenu (HWND hwndOwner,
HTREEITEM hItem,
LPARAM lParam,
BOOL fEnabled)
{
MENUITEMINFOW menuItemInfo;
ULONG ulSelection;
POINT pt;
//
// Build the shortcut menu depending on whether path is
// disabled or enabled.
//
ZeroMemory( &menuItemInfo,
sizeof(MENUITEMINFOW) );
menuItemInfo.cbSize = sizeof( MENUITEMINFOW );
menuItemInfo.fMask = MIIM_TYPE | MIIM_ID;
menuItemInfo.fType = MFT_STRING;
menuItemInfo.fState = MFS_ENABLED;
if ( fEnabled ) {
menuItemInfo.dwTypeData = MENUITEM_DISABLE;
menuItemInfo.wID = IDI_DISABLE;
}
else {
menuItemInfo.dwTypeData = MENUITEM_ENABLE;
menuItemInfo.wID = IDI_ENABLE;
}
SetMenuItemInfoW( hBindingPathSubMenu,
0,
TRUE,
&menuItemInfo );
GetCursorPos( &pt );
ulSelection = (ULONG)TrackPopupMenu( hBindingPathSubMenu,
TPM_RIGHTALIGN | TPM_BOTTOMALIGN |
TPM_NONOTIFY | TPM_RETURNCMD |
TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
hwndOwner,
NULL );
if ( ulSelection ) {
//
// Do the selected action.
//
HandleBindingPathOperation( hwndOwner,
ulSelection,
hItem,
lParam );
}
return;
}
//
// Function: GetItemInfo
//
// Purpose: Returns information about an item.
//
// Arguments:
// hwndTree [in] Window handle of the tree.
// hItem [in] Item handle.
// lParam [out] lParam
// lpdwItemType [out] Type, binding path or network component.
// fEnabled [out] TRUE if the binding path or component is enabled.
//
// Returns: TRUE on sucess.
//
// Notes:
//
BOOL GetItemInfo (HWND hwndTree,
HTREEITEM hItem,
LPARAM *lParam,
LPDWORD lpdwItemType,
BOOL *fEnabled)
{
TVITEMW tvItem;
int iImage;
BOOL fSuccess;
fSuccess = FALSE;
//
// Get item's information.
//
ZeroMemory( &tvItem,
sizeof(TVITEMW) );
tvItem.hItem = hItem;
tvItem.mask = TVIF_PARAM | TVIF_IMAGE | TVIF_STATE;
tvItem.stateMask = TVIS_OVERLAYMASK ;
if ( TreeView_GetItem(hwndTree,
&tvItem) ) {
*lParam = tvItem.lParam;
if ( SetupDiGetClassImageIndex(&ClassImageListData,
&GUID_DEVCLASS_SYSTEM,
&iImage) ) {
//
// Is it a binding path?
//
if ( tvItem.iImage == iImage ) {
*lpdwItemType = ITEM_NET_BINDINGS;
*fEnabled = !(TVIS_OVERLAYMASK & tvItem.state);
fSuccess = TRUE;
}
else {
//
// Item is a network component.
//
if ( SetupDiGetClassImageIndex(&ClassImageListData,
&GUID_DEVCLASS_NET,
&iImage) ) {
if ( tvItem.iImage == iImage ) {
*lpdwItemType = ITEM_NET_ADAPTERS;
}
else {
*lpdwItemType = ITEM_NET_COMPONENTS;
}
*fEnabled = !(TVIS_OVERLAYMASK & tvItem.state);
fSuccess = TRUE;
}
else {
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Couldn't load the images of network adapters." );
}
}
}
else {
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Couldn't load the images of system devices." );
}
}
return fSuccess;
}
//
// Function: AddBindNameToTree
//
// Purpose: Adds an item representing the binding path.
//
// Arguments:
// pncbp [in] Binding path to add.
// hwndTree [in] Tree handle.
// hParent [in] Parent item.
// ulIndex [in] Index of the binding path.
//
// Returns: Handle of the item added on success, otherwise NULL.
//
// Notes:
//
HTREEITEM AddBindNameToTree (INetCfgBindingPath *pncbp,
HWND hwndTree,
HTREEITEM hParent,
ULONG ulIndex)
{
WCHAR lpszBindName[40];
LPWSTR lpszPathToken;
HTREEITEM hTreeItem;
TV_INSERTSTRUCTW tvInsertStruc;
HRESULT hr;
hTreeItem = NULL;
//
// Store the path token as lParam.
//
hr = pncbp->GetPathToken( &lpszPathToken );
if ( hr == S_OK ) {
swprintf( lpszBindName, L"Binding Path %d", ulIndex );
ZeroMemory(
&tvInsertStruc,
sizeof(TV_INSERTSTRUCTW) );
tvInsertStruc.hParent = hParent;
tvInsertStruc.hInsertAfter = TVI_LAST;
tvInsertStruc.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE |
TVIF_SELECTEDIMAGE | TVIF_STATE;
tvInsertStruc.item.pszText = lpszBindName;
SetupDiGetClassImageIndex( &ClassImageListData,
&GUID_DEVCLASS_SYSTEM,
&tvInsertStruc.item.iImage );
tvInsertStruc.item.iSelectedImage = tvInsertStruc.item.iImage;
tvInsertStruc.item.stateMask = TVIS_OVERLAYMASK;
if ( pncbp->IsEnabled() == S_FALSE ) {
tvInsertStruc.item.state = INDEXTOOVERLAYMASK(
IDI_DISABLED_OVL - IDI_CLASSICON_OVERLAYFIRST + 1);
}
tvInsertStruc.item.lParam = (LPARAM)lpszPathToken;
hTreeItem = TreeView_InsertItem( hwndTree,
&tvInsertStruc );
if ( !hTreeItem ) {
ErrMsg( hr,
L"Couldn't add the binding path %d to the list."
L" The binding path will not be shown.", ulIndex );
CoTaskMemFree( lpszPathToken );
}
}
else {
ErrMsg( hr,
L"Couldn't get the PathToken of the binding path %d."
L" The binding path will not be shown.", ulIndex );
}
return hTreeItem;
}
//
// Function: AddToTree
//
// Purpose: Adds an item representing the network component.
//
// Arguments:
// hwndTree [in] Tree handle.
// hParent [in] Parent item.
// pncc [in] Network component.
//
// Returns: Handle of the item added on success, otherwise NULL.
//
// Notes:
//
HTREEITEM AddToTree (HWND hwndTree,
HTREEITEM hParent,
INetCfgComponent *pncc)
{
LPWSTR lpszItemName;
LPWSTR lpszId;
GUID guidClass;
BOOL fEnabled;
ULONG ulStatus;
HTREEITEM hTreeItem;
TV_INSERTSTRUCTW tvInsertStruc;
HRESULT hr;
hTreeItem = NULL;
hr = pncc->GetDisplayName( &lpszItemName );
if ( hr == S_OK ) {
//
// Get the inf id of the network component. We store it at lParam
// and use it later to retrieve its interface pointer.
//
hr = pncc->GetId( &lpszId );
if ( hr == S_OK ) {
//
// If it is a network adapter then, find out if it enabled/disabled.
//
hr = pncc->GetClassGuid( &guidClass );
if ( hr == S_OK ) {
if ( IsEqualGUID(guidClass, GUID_DEVCLASS_NET) ) {
hr = pncc->GetDeviceStatus( &ulStatus );
fEnabled = ulStatus == 0;
}
else {
fEnabled = TRUE;
}
}
else {
//
// We can't get the status, so assume that it is disabled.
//
fEnabled = FALSE;
}
ZeroMemory(
&tvInsertStruc,
sizeof(TV_INSERTSTRUCTW) );
tvInsertStruc.hParent = hParent;
tvInsertStruc.hInsertAfter = TVI_LAST;
tvInsertStruc.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE |
TVIF_SELECTEDIMAGE | TVIF_STATE;
tvInsertStruc.item.pszText = lpszItemName;
SetupDiGetClassImageIndex( &ClassImageListData,
&guidClass,
&tvInsertStruc.item.iImage );
tvInsertStruc.item.iSelectedImage = tvInsertStruc.item.iImage;
tvInsertStruc.item.stateMask = TVIS_OVERLAYMASK;
if ( fEnabled == FALSE ) {
tvInsertStruc.item.state = INDEXTOOVERLAYMASK(
IDI_DISABLED_OVL - IDI_CLASSICON_OVERLAYFIRST + 1);
}
tvInsertStruc.item.lParam = (LPARAM)lpszId;
hTreeItem = TreeView_InsertItem( hwndTree,
&tvInsertStruc );
if ( !hTreeItem ) {
ErrMsg( hr,
L"Failed to add %s to the list.",
lpszItemName );
CoTaskMemFree( lpszId );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -