windows-nt/Source/XPSP1/NT/printscan/wia/test/wiatest2/wiacapdlg.cpp

313 lines
10 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// WiacapDlg.cpp : implementation file
//
#include "stdafx.h"
#include "wiatest.h"
#include "WiacapDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CWiacapDlg dialog
CWiacapDlg::CWiacapDlg(CWnd* pParent /*=NULL*/)
: CDialog(CWiacapDlg::IDD, pParent)
{
m_pIWiaItem = NULL;
m_NumCaps = 0;
m_bCommandSent = FALSE;
//{{AFX_DATA_INIT(CWiacapDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CWiacapDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWiacapDlg)
DDX_Control(pDX, IDC_SEND_COMMAND_BUTTON, m_SendCommandButton);
DDX_Control(pDX, IDC_CAPABILITIES_LISTCTRL, m_CapablitiesListCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWiacapDlg, CDialog)
//{{AFX_MSG_MAP(CWiacapDlg)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_SEND_COMMAND_BUTTON, OnSendCommandButton)
ON_NOTIFY(NM_CLICK, IDC_CAPABILITIES_LISTCTRL, OnClickCapabilitiesListctrl)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_CAPABILITIES_LISTCTRL, OnItemchangedCapabilitiesListctrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWiacapDlg message handlers
BOOL CWiacapDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetupColumnHeaders();
AddCapabilitiesToListBox(WIA_DEVICE_EVENTS);
AddCapabilitiesToListBox(WIA_DEVICE_COMMANDS);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CWiacapDlg::SetupColumnHeaders()
{
LVCOLUMN lv;
TCHAR szColumnName[MAX_PATH];
memset(szColumnName,0,sizeof(szColumnName));
HINSTANCE hInstance = NULL;
hInstance = AfxGetInstanceHandle();
if(hInstance){
int i = 0;
// initialize item property list control column headers
// Capability name
LoadString(hInstance,IDS_WIATESTCOLUMN_CAPABILITYNAME,szColumnName,MAX_PATH);
lv.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lv.fmt = LVCFMT_LEFT ;
lv.cx = 100;
lv.pszText = szColumnName;
lv.cchTextMax = 0;
lv.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYNAME;
lv.iImage = 0;
lv.iOrder = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYNAME;
i = m_CapablitiesListCtrl.InsertColumn(ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYNAME,&lv);
// Capability description
LoadString(hInstance,IDS_WIATESTCOLUMN_CAPABILITYDESCRIPTION,szColumnName,MAX_PATH);
lv.cx = 125;
lv.iOrder = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYDESCRIPTION;
lv.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYDESCRIPTION;
lv.pszText = szColumnName;
i = m_CapablitiesListCtrl.InsertColumn(ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYDESCRIPTION,&lv);
// Capability Value
LoadString(hInstance,IDS_WIATESTCOLUMN_CAPABILITYVALUE,szColumnName,MAX_PATH);
lv.cx = 125;
lv.iOrder = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYVALUE;
lv.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYVALUE;
lv.pszText = szColumnName;
i = m_CapablitiesListCtrl.InsertColumn(ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYVALUE,&lv);
// Capability type (event or command)
LoadString(hInstance,IDS_WIATESTCOLUMN_CAPABILITYTYPE,szColumnName,MAX_PATH);
lv.cx = 85;
lv.iOrder = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYTYPE;
lv.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYTYPE;
lv.pszText = szColumnName;
i = m_CapablitiesListCtrl.InsertColumn(ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYTYPE,&lv);
}
}
void CWiacapDlg::AddCapabilitiesToListBox(LONG lType)
{
WIA_DEV_CAP DevCap;
IEnumWIA_DEV_CAPS* pIEnumWiaDevCaps = NULL;
HRESULT hr = S_OK;
INT ItemNumber = m_NumCaps;
hr = m_pIWiaItem->EnumDeviceCapabilities(lType,&pIEnumWiaDevCaps);
if(S_OK == hr){
do {
memset(&DevCap,0,sizeof(DevCap));
hr = pIEnumWiaDevCaps->Next(1,&DevCap,NULL);
if (S_OK == hr){
// DevCap.ulFlags;
// DevCap.bstrIcon;
// DevCap.bstrCommanline;
//DevCap.guid;
TCHAR szText[MAX_PATH];
memset(szText,0,sizeof(szText));
LV_ITEM lvitem;
lvitem.mask = LVIF_TEXT;
lvitem.iItem = ItemNumber;
lvitem.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYNAME;
lvitem.pszText = szText;
lvitem.iImage = NULL;
// Write capability name to list control
#ifndef UNICODE
WideCharToMultiByte(CP_ACP,0,DevCap.bstrName,-1,szText,MAX_PATH,NULL,NULL);
#else
lstrcpy(szText,DevCap.bstrName);
#endif
m_CapablitiesListCtrl.InsertItem(&lvitem);
// Write capability description to list control
memset(szText,0,sizeof(szText));
lvitem.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYDESCRIPTION;
#ifndef UNICODE
WideCharToMultiByte(CP_ACP,0,DevCap.bstrDescription,-1,szText,MAX_PATH,NULL,NULL);
#else
lstrcpy(szText,DevCap.bstrDescription);
#endif
m_CapablitiesListCtrl.SetItem(&lvitem);
// Write capability value
memset(szText,0,sizeof(szText));
lvitem.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYVALUE;
UCHAR *pwszUUID = NULL;
UuidToString(&DevCap.guid,&pwszUUID);
TSPRINTF(szText,"%s",pwszUUID);
// free allocated string
RpcStringFree(&pwszUUID);
m_CapablitiesListCtrl.SetItem(&lvitem);
// Write capability type
memset(szText,0,sizeof(szText));
lvitem.iSubItem = ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYTYPE;
if(lType == WIA_DEVICE_COMMANDS){
RC2TSTR(IDS_WIATESTCOMMAND,szText, sizeof(szText));
} else {
RC2TSTR(IDS_WIATESTEVENT,szText, sizeof(szText));
}
m_CapablitiesListCtrl.SetItem(&lvitem);
// increment Row counter
ItemNumber++;
// free allocated strings
if(DevCap.bstrName){
SysFreeString(DevCap.bstrName);
}
if(DevCap.bstrDescription){
SysFreeString(DevCap.bstrDescription);
}
}
}while(hr == S_OK);
pIEnumWiaDevCaps->Release();
pIEnumWiaDevCaps = NULL;
}
// auto resize columns
for (int Col = 0; Col <4;Col++){
m_CapablitiesListCtrl.SetColumnWidth(Col, LVSCW_AUTOSIZE);
}
m_NumCaps = ItemNumber;
}
void CWiacapDlg::SetIWiaItem(IWiaItem *pIWiaItem)
{
pIWiaItem->AddRef();
m_pIWiaItem = pIWiaItem;
}
void CWiacapDlg::OnClose()
{
if(m_pIWiaItem){
m_pIWiaItem->Release();
m_pIWiaItem = NULL;
}
CDialog::OnClose();
}
void CWiacapDlg::OnSendCommandButton()
{
HRESULT hr = S_OK;
GUID guidCommand;
memset(&guidCommand,0,sizeof(GUID));
IWiaItem *pIWiaItem = NULL;
GetCommandGUID(GetSelectedCapability(),&guidCommand);
if(guidCommand != GUID_NULL){
hr = m_pIWiaItem->DeviceCommand(0,&guidCommand,&pIWiaItem);
if(FAILED(hr)){
ErrorMessageBox(IDS_WIATESTERROR_DEVICECOMMAND,hr);
} else {
//m_bCommandSent = TRUE;
if(pIWiaItem){
pIWiaItem->Release();
pIWiaItem = NULL;
}
TCHAR szCommandSuccess[MAX_PATH];
memset(szCommandSuccess,0,sizeof(szCommandSuccess));
RC2TSTR(IDS_WIATESTSUCCESS_COMMAND,szCommandSuccess,sizeof(szCommandSuccess));
MessageBox(szCommandSuccess);
}
} else {
ErrorMessageBox(IDS_WIATESTERROR_NOCOMMANDGUID);
}
}
void CWiacapDlg::OnClickCapabilitiesListctrl(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY* phdn = (HD_NOTIFY *) pNMHDR;
if(IsCommand(phdn->iItem)){
m_SendCommandButton.EnableWindow(TRUE);
} else {
m_SendCommandButton.EnableWindow(FALSE);
}
*pResult = 0;
}
BOOL CWiacapDlg::IsCommand(INT iItem)
{
// is an item selected?
if (iItem < ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYNAME)
return FALSE;
TCHAR pszCapabilityType[MAX_PATH];
TCHAR szCapTypeText[MAX_PATH];
memset(pszCapabilityType,0,sizeof(pszCapabilityType));
memset(szCapTypeText,0,sizeof(szCapTypeText));
// load "Command" text label
RC2TSTR(IDS_WIATESTCOMMAND,szCapTypeText,sizeof(szCapTypeText));
m_CapablitiesListCtrl.GetItemText(iItem, ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYTYPE,
pszCapabilityType, sizeof(pszCapabilityType));
return (lstrcmpi(pszCapabilityType,szCapTypeText) == 0);
}
void CWiacapDlg::GetCommandGUID(INT iItem, GUID *pguid)
{
memset(pguid,0,sizeof(GUID));
TCHAR szGUID[MAX_PATH];
memset(szGUID,0,sizeof(szGUID));
m_CapablitiesListCtrl.GetItemText(iItem, ITEMPROPERTYLISTCTRL_COLUMN_CAPABILITYVALUE,
szGUID, sizeof(szGUID));
#ifndef UNICODE
UuidFromString((UCHAR*)szGUID,pguid);
#else
WideCharToMultiByte(CP_ACP, 0,szGUID,-1,szbuffer,MAX_PATH,NULL,NULL);
UuidFromString((UCHAR*)szbuffer,pguid);
#endif
}
void CWiacapDlg::OnItemchangedCapabilitiesListctrl(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(IsCommand(GetSelectedCapability())){
m_SendCommandButton.EnableWindow(TRUE);
} else {
m_SendCommandButton.EnableWindow(FALSE);
}
*pResult = 0;
}
INT CWiacapDlg::GetSelectedCapability()
{
INT iItem = 0;
POSITION pos = NULL;
pos = m_CapablitiesListCtrl.GetFirstSelectedItemPosition();
if (NULL != pos){
iItem = m_CapablitiesListCtrl.GetNextSelectedItem(pos);
}
return iItem;
}