📄 bindview.cpp
字号:
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001.
//
// File: B I N D V I E W . C P P
//
// Contents:
//
// Notes:
//
// Author: Alok Sinha 15-Amy-01
//
//----------------------------------------------------------------------------
#include "BindView.h"
//----------------------------------------------------------------------------
// Globals
//
//
// Image list for devices of various setup class.
//
SP_CLASSIMAGELIST_DATA ClassImageListData;
HINSTANCE hInstance;
HMENU hMainMenu;
HMENU hComponentSubMenu;
HMENU hBindingPathSubMenu;
//
// Network components whose bindings are enumerated.
//
LPWSTR lpszNetClass[] = {
L"All Clients",
L"All Services",
L"All Protocols"
};
//
// GUIDs of network components.
//
const GUID *pguidNetClass [] = {
&GUID_DEVCLASS_NETCLIENT,
&GUID_DEVCLASS_NETSERVICE,
&GUID_DEVCLASS_NETTRANS,
&GUID_DEVCLASS_NET
};
//
// Program entry point.
//
int APIENTRY WinMain (HINSTANCE hInst,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
//
// Make sure common control DLL is loaded.
//
hInstance = hInst;
InitCommonControls();
if ( DialogBoxW(hInst,
MAKEINTRESOURCEW(IDD_MAIN),
NULL,
MainDlgProc) == -1 ) {
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Failed to create the main dialog box, exiting..." );
}
return 0;
}
//
// WndProc for the main dialog box.
//
INT_PTR CALLBACK MainDlgProc (HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
HWND hwndBindingTree;
HICON hIcon;
switch (uMsg) {
case WM_INITDIALOG:
hIcon = LoadIcon( hInstance,
MAKEINTRESOURCE(IDI_BINDVIEW) );
if ( !hIcon ) {
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Couldn't load the program icon, exiting..." );
return FALSE;
}
SetClassLongPtr( hwndDlg,
GCLP_HICON,
(LONG_PTR)hIcon );
hMainMenu = LoadMenu( hInstance,
MAKEINTRESOURCE(IDM_OPTIONS) );
if ( !hMainMenu ) {
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Couldn't load the program menu, exiting..." );
return FALSE;
}
hComponentSubMenu = GetSubMenu( hMainMenu,
0 );
hBindingPathSubMenu = GetSubMenu( hMainMenu,
1 );
if ( !hComponentSubMenu || !hBindingPathSubMenu ) {
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Couldn't load the program menu, exiting..." );
DestroyMenu( hMainMenu );
return FALSE;
}
//
// Add the network components types whose bindings are shown.
//
UpdateComponentTypeList( GetDlgItem(hwndDlg,
IDL_COMPONENT_TYPES) );
//
// Load and associate the image list of all device classes with
// tree.
//
hwndBindingTree = GetDlgItem( hwndDlg,
IDT_BINDINGS );
ZeroMemory( &ClassImageListData, sizeof(SP_CLASSIMAGELIST_DATA) );
ClassImageListData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
if ( SetupDiGetClassImageList(&ClassImageListData) == TRUE ) {
TreeView_SetImageList( hwndBindingTree,
ClassImageListData.ImageList,
LVSIL_NORMAL );
}
else {
//
// In case, we failed to load the image list, abort.
//
ErrMsg( HRESULT_FROM_WIN32(GetLastError()),
L"Couldn't load the image list of "
L"device classes, exiting..." );
DestroyMenu( hMainMenu );
return FALSE;
}
//
// Enumerate the bindings of the network component selected by default.
//
EnumNetBindings( hwndBindingTree,
DEFAULT_COMPONENT_SELECTED );
return TRUE; // Tell Windows to continue creating the dialog box.
case WM_COMMAND:
switch( LOWORD(wParam) ) {
case IDL_COMPONENT_TYPES:
if ( HIWORD(wParam) == CBN_SELCHANGE ) {
//
// User has selected a new network component type.
//
RefreshAll( hwndDlg );
}
break;
case IDB_EXPAND_ALL:
case IDB_COLLAPSE_ALL:
if ( HIWORD(wParam) == BN_CLICKED ) {
HTREEITEM hItem;
//
// Expand/Collapse the entire tree.
//
hwndBindingTree = GetDlgItem( hwndDlg,
IDT_BINDINGS );
hItem = TreeView_GetSelection( hwndBindingTree );
ExpandCollapseAll( hwndBindingTree,
TVI_ROOT,
(LOWORD(wParam) == IDB_EXPAND_ALL) ?
TVE_EXPAND : TVE_COLLAPSE );
TreeView_SelectSetFirstVisible( hwndBindingTree,
hItem );
}
break;
case IDB_SAVE:
if ( HIWORD(wParam) == BN_CLICKED ) {
//
// Save the binding information to a file.
//
WCHAR lpszFile[MAX_PATH+1];
if ( GetFileName(hwndDlg,
L"Text files (*.txt)\0*.txt\0",
L"Select a file name",
OFN_DONTADDTORECENT | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT,
lpszFile,
L"txt",
TRUE) ) {
DumpBindings( lpszFile );
}
}
break;
case IDB_INSTALL:
if ( HIWORD(wParam) == BN_CLICKED ) {
//
// Install a network component.
//
if ( (BOOL)DialogBoxW(hInstance,
MAKEINTRESOURCEW(IDD_INSTALL),
hwndDlg,
InstallDlg) == TRUE ) {
RefreshAll( hwndDlg );
}
}
break;
case IDB_UNINSTALL:
if ( HIWORD(wParam) == BN_CLICKED ) {
//
// Uninstall a network component.
//
if ( (BOOL)DialogBoxW(hInstance,
MAKEINTRESOURCEW(IDD_UNINSTALL),
hwndDlg,
UninstallDlg) == TRUE ) {
RefreshAll( hwndDlg );
}
}
}
break;
case WM_NOTIFY:
{
LPNMHDR lpnm;
lpnm = (LPNMHDR)lParam;
if ( (lpnm->idFrom == IDT_BINDINGS) &&
(lpnm->code == NM_RCLICK) ) {
//
// A network component or a binding path is selected
// with a righ-click.
//
ProcessRightClick( lpnm );
//
// Tell Windows that the righ-click has been handled
// us.
//
return TRUE;
}
}
break;
case WM_SYSCOMMAND:
if ( (0xFFF0 & wParam) == SC_CLOSE ) {
//
// Before exiting, make sure to delete the image list
// and the buffers associated with each item in the tree.
//
SetupDiDestroyClassImageList( &ClassImageListData );
ReleaseMemory( GetDlgItem(hwndDlg, IDT_BINDINGS),
TVI_ROOT );
DestroyMenu( hMainMenu );
EndDialog( hwndDlg, 0 );
}
}
return FALSE;
}
//
// WndProc of the dialog box for binding/unbinding compoents.
//
INT_PTR CALLBACK BindComponentDlg (HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
LPBIND_UNBIND_INFO lpBindUnbind;
switch (uMsg) {
case WM_INITDIALOG:
{
DWORD dwCount;
//
// Save the lParam which is an index to the selected network
// component.
//
SetWindowLongPtr( hwndDlg,
DWLP_USER,
(LONG_PTR)lParam );
lpBindUnbind = (LPBIND_UNBIND_INFO)lParam;
//
// fBindTo is TRUE when the user wants to bind the selected
// component to other components. So, we list the components
// that are not bound and can bind.
//
//
// fBindTo is FALSE when the user wants to unbind the selected
// component from other components. So, we list the components
// that are bound to it.
//
//
// ListCompToBindUnbind returns number of components added to
// the list. Keep track of it. If it zero then, we don't want to
// show this dialog box.
//
dwCount = ListCompToBindUnbind(
lpBindUnbind->lpszInfId,
ADAPTERS_SELECTED,
GetDlgItem(hwndDlg, IDT_COMPONENT_LIST),
lpBindUnbind->fBindTo == FALSE );
dwCount += ListCompToBindUnbind(
lpBindUnbind->lpszInfId,
CLIENTS_SELECTED,
GetDlgItem(hwndDlg, IDT_COMPONENT_LIST),
lpBindUnbind->fBindTo == FALSE );
dwCount += ListCompToBindUnbind(
lpBindUnbind->lpszInfId,
SERVICES_SELECTED,
GetDlgItem(hwndDlg, IDT_COMPONENT_LIST),
lpBindUnbind->fBindTo == FALSE );
dwCount += ListCompToBindUnbind(
lpBindUnbind->lpszInfId,
PROTOCOLS_SELECTED,
GetDlgItem(hwndDlg, IDT_COMPONENT_LIST),
lpBindUnbind->fBindTo == FALSE );
if ( dwCount > 0 ) {
//
// Since the same dialog box is used for unbind opration,
// we need to update the text on the button to reflect that
// it is a bind operation.
//
if ( lpBindUnbind->fBindTo == FALSE ) {
SetWindowTextW( hwndDlg,
L"Unbind From Network Components" );
SetWindowTextW( GetDlgItem(hwndDlg, IDB_BIND_UNBIND),
L"Unbind" );
SetWindowTextW( GetDlgItem(hwndDlg, IDG_COMPONENT_LIST),
L"Select components to unbind from" );
}
}
else {
if ( lpBindUnbind->fBindTo == TRUE ) {
ErrMsg( 0,
L"There no network components that can "
L"bind to the selected component." );
}
else {
ErrMsg( 0,
L"There no network components that are "
L"bound to the selected component." );
}
PostMessage( hwndDlg, WM_NO_COMPONENTS, 0, 0 );
}
return TRUE;
}
case WM_NO_COMPONENTS:
EndDialog( hwndDlg, 0 );
break;
case WM_COMMAND:
if ( (LOWORD(wParam) == IDB_CLOSE) &&
(HIWORD(wParam) == BN_CLICKED) ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -