|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997-2002.
//
// File: Util.cpp
//
// Contents:
//
//----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////
// Util.cpp
//
// Utility routines.
//
// HISTORY
// 4-Aug-97 t-danm Creation.
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "debug.h"
#include "util.h"
#include "resource.h"
/////////////////////////////////////////////////////////////////////
// ListView_FindString()
//
// Searches the listview items and return the index of the item
// matching the string. Return -1 if no matches.
//
// INTERFACE NOTES
// Although not documented, the search is performed without case.
//
int ListView_FindString( HWND hwndListview, PCWSTR pszTextSearch) { Assert(IsWindow(hwndListview)); Assert(pszTextSearch != NULL);
LV_FINDINFO lvFindInfo; ::ZeroMemory (&lvFindInfo, sizeof(lvFindInfo)); lvFindInfo.flags = LVFI_STRING; lvFindInfo.psz = pszTextSearch; return ListView_FindItem(hwndListview, -1, &lvFindInfo); } // ListView_FindString()
/////////////////////////////////////////////////////////////////////
// ListView_GetSelectedItem()
//
// Return the index of the selected item.
// If no items are selected, return -1.
//
int ListView_GetSelectedItem(HWND hwndListview) { Assert(IsWindow(hwndListview)); return ListView_GetNextItem(hwndListview, -1, LVNI_SELECTED); }
/////////////////////////////////////////////////////////////////////
// ListView_SelectItem()
//
// Set the selection of a specific listview item.
//
void ListView_SelectItem( HWND hwndListview, int iItem) { Assert(IsWindow(hwndListview)); Assert(iItem >= 0); ListView_SetItemState(hwndListview, iItem, LVIS_SELECTED, LVIS_SELECTED); } // ListView_SelectItem()
/////////////////////////////////////////////////////////////////////
// ListView_UnselectItem()
//
// Clear the selection of a specific listview item.
//
void ListView_UnselectItem( HWND hwndListview, int iItem) { Assert(IsWindow(hwndListview)); Assert(iItem >= 0); ListView_SetItemState(hwndListview, iItem, 0, LVIS_SELECTED); } // ListView_UnselectItem()
/////////////////////////////////////////////////////////////////////
// ListView_UnselectAllItems()
//
// Remove the selection of any selected item.
//
void ListView_UnselectAllItems(HWND hwndListview) { Assert(IsWindow(hwndListview)); int iItem = -1; while (TRUE) { // Search the listview for any selected items
iItem = ListView_GetNextItem(hwndListview, iItem, LVNI_SELECTED); if (iItem < 0) break; // Clear the selection
ListView_SetItemState(hwndListview, iItem, 0, LVIS_SELECTED); } } // ListView_UnselectAllItems()
/////////////////////////////////////////////////////////////////////
// ListView_SetItemImage()
//
// Change the image of a listview item.
//
void ListView_SetItemImage(HWND hwndListview, int iItem, int iImage) { Assert(IsWindow(hwndListview)); Assert(iItem >= 0);
LV_ITEM lvItem; ::ZeroMemory (OUT &lvItem, sizeof(lvItem)); lvItem.mask = LVIF_IMAGE; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.iImage = iImage; ListView_SetItem(hwndListview, IN &lvItem); } // ListView_SetItemImage()
/////////////////////////////////////////////////////////////////////////////
// FTrimString()
//
// Trim leading and trailing spaces of the string.
// Return TRUE if one or more spaces has been removed, otherwise FALSE.
//
BOOL FTrimString(INOUT WCHAR szString[]) { WCHAR * pchSrc; WCHAR * pchDst;
Assert(szString != NULL); if (szString[0] == 0) return FALSE; pchSrc = szString; if (*pchSrc == ' ') { while (*pchSrc == ' ') pchSrc++; pchDst = szString; do { *pchDst++ = *pchSrc++; } while (*pchSrc != '\0');
while (pchDst > szString && *(pchDst - 1) == ' ') pchDst--; *pchDst = '\0'; return TRUE; } pchDst = szString; while (*pchDst != '\0') pchDst++; Assert(pchDst > szString); if (*(pchDst - 1) != ' ') return FALSE; while (pchDst > szString && *(pchDst - 1) == ' ') pchDst--; *pchDst = '\0'; return TRUE; } // FTrimString()
/////////////////////////////////////////////////////////////////////
INT_PTR DoDialogBox( UINT wIdDialog, HWND hwndParent, DLGPROC dlgproc, LPARAM lParam) { Assert(wIdDialog != 0); Endorse(hwndParent == NULL); Assert(dlgproc != NULL); Endorse(lParam == NULL);
INT_PTR nResult = ::DialogBoxParam( g_hInstance, MAKEINTRESOURCE(wIdDialog), hwndParent, dlgproc, lParam); Report(nResult != -1 && "Failure to display dialog"); return nResult; } // DoDialogBox()
/////////////////////////////////////////////////////////////////////
int DoMessageBox( HWND hwndParent, UINT uStringId, UINT uFlags) { WCHAR szCaption[128]; WCHAR szMessage[512];
CchLoadString(IDS_CAPTION, OUT szCaption, LENGTH(szCaption)); CchLoadString(uStringId, OUT szMessage, LENGTH(szMessage)); return ::MessageBox(hwndParent ? hwndParent : ::GetActiveWindow(), szMessage, szCaption, uFlags); } // DoMessageBox()
#ifdef DEBUG
/////////////////////////////////////////////////////////////////////////////
// CchLoadString()
//
// Same as ::LoadString() but with extra error checking.
// CchLoadString is #defined to ::LoadString in the retail build.
//
int CchLoadString( UINT uIdString, // IN: String Id
WCHAR szBuffer[], // OUT: Buffer to receive the string
int cchBuffer) // IN: Length of the buffer (in characters; not in bytes)
{ int cch;
Assert(szBuffer != NULL); cch = ::LoadString(g_hInstance, uIdString, OUT szBuffer, cchBuffer); Report(cch > 0 && "String not found"); Report(cch < cchBuffer - 2 && "Output buffer too small"); return cch; } // CchLoadString()
#endif // DEBUG
/////////////////////////////////////////////////////////////////////
// RegOpenOrCreateKey()
//
// Open an existing key or create it if does not exists
//
HKEY RegOpenOrCreateKey( HKEY hkeyRoot, // IN: Root of an existing key
const WCHAR szSubkey[]) // IN: Subkey to create
{ Assert(hkeyRoot != NULL); Assert(szSubkey != NULL); HKEY hkey; // Primary Registry key
DWORD dwDisposition; // Disposition (REG_OPENED_EXISTING_KEY or REG_CREATED_NEW_KEY)
LONG lRetCode; // Code returned by the Registry functions
lRetCode = RegCreateKeyEx( hkeyRoot, szSubkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, // required to create keys
NULL, // SecurityAttributes
&hkey, // OUT: Returned registry key handle
&dwDisposition); // OUT: Returned disposition
if (lRetCode != ERROR_SUCCESS) { Assert(hkey == NULL); return NULL; } return hkey; } // RegOpenOrCreateKey()
/////////////////////////////////////////////////////////////////////
// RegWriteString()
//
// Write a tring to the Registry.
//
BOOL RegWriteString( HKEY hkey, // IN: Key to append to
const WCHAR szKey[], // IN: Key to save
const WCHAR szValue[]) // IN: Value of the key
{ Assert(hkey != NULL); // Verify Registry has been opened
Assert(szKey != NULL); Assert(szValue != NULL); LONG lRetCode = RegSetValueEx(hkey, szKey, 0, REG_SZ, (LPBYTE)szValue, (DWORD) (wcslen(szValue) * sizeof(WCHAR))); // There should be no error writing to the Registry
Report((lRetCode == ERROR_SUCCESS) && "RegWriteString() - Error writing to Registry"); return (lRetCode == ERROR_SUCCESS); } // RegWriteString()
/////////////////////////////////////////////////////////////////////
BOOL RegWriteString( HKEY hkey, // IN: Key to append to
const WCHAR szKey[], // IN: Key to save
UINT uStringId) // IN: Value of the key
{ if ( szKey ) { WCHAR szValue[512]; CchLoadString(uStringId, OUT szValue, LENGTH(szValue)); return RegWriteString(hkey, szKey, szValue); } else return FALSE; }
/////////////////////////////////////////////////////////////////////////////
// HrExtractDataAlloc()
//
// Extract data from a source DataObject for a particular clipboard format.
//
// RETURNS
// Return S_OK if data was successfully retrieved and placed into allocated buffer.
//
// INTERFACE NOTES
// The routine will allocate memory, copy the data from the source to
// the allocated buffer and return a pointer to the allocated buffer.
// The caller is responsible to free the allocated memory using GlobalFree()
// when no longer needed.
//
// IMPLEMENTATION NOTES
// The memory block is allocated by pDataObject->GetData() rather
// than by the routine itself.
//
// HISTORY
// 12-Aug-97 t-danm Creation.
//
HRESULT HrExtractDataAlloc( IDataObject * pDataObject, // IN: Data source to extract data from
UINT cfClipboardFormat, // IN: Clipboard format to extract data
PVOID * ppavData, // OUT: Pointer to allocated memory
UINT * pcbData) // OUT: OPTIONAL: Number of bytes stored in memory buffer
{ Assert(pDataObject != NULL); Assert(cfClipboardFormat != NULL); Assert(ppavData != NULL); Assert(*ppavData == NULL && "Memory Leak"); Endorse(pcbData == NULL); // TRUE => Don't care about the size of the allocated buffer
FORMATETC formatetc = { (CLIPFORMAT)cfClipboardFormat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL }; Assert(stgmedium.hGlobal == NULL); HRESULT hr = pDataObject->GetData(IN &formatetc, OUT &stgmedium); if (FAILED(hr)) { Trace1("HrExtractDataAlloc() - Call to pDataObject->GetData() failed. hr=0x%X.\n", hr); return hr; } if (stgmedium.hGlobal == NULL) { // This is because the producer did not set the hGlobal handle
Trace0("HrExtractDataAlloc() - Memory handle hGlobal is NULL.\n"); return S_FALSE; } UINT cbData = (UINT)GlobalSize(stgmedium.hGlobal); if (cbData == 0) { Trace1("HrExtractDataAlloc() - Corrupted hGlobal handle. err=%d.\n", GetLastError()); return E_UNEXPECTED; } *ppavData = stgmedium.hGlobal; if (pcbData != NULL) *pcbData = cbData; return S_OK; } // HrExtractDataAlloc()
|