|
|
//
// PickIcon.C
//
// Copyright (C) Microsoft, 1994,1995 All Rights Reserved.
//
// History:
// ral 6/23/94 - First pass
// 3/20/95 [stevecat] - NT port & real clean up, unicode, etc.
//
//
#include "priv.h"
#include "appwiz.h"
//
// Size?
//
#define MAX_ICONS 75
//
// Adds icons to the list box.
//
void PutIconsInList(HWND hLB, LPWIZDATA lpwd) { HICON rgIcons[MAX_ICONS]; int iTempIcon; int cIcons; HCURSOR hcurOld = SetCursor(LoadCursor(NULL, IDC_WAIT)); RECT rc; int cy;
ListBox_SetColumnWidth(hLB, g_cxIcon+12);
//
// compute the height of the listbox based on icon dimensions
//
GetWindowRect(hLB, &rc);
cy = g_cyIcon + GetSystemMetrics(SM_CYHSCROLL) + GetSystemMetrics(SM_CYEDGE) * 3;
SetWindowPos(hLB, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
ListBox_ResetContent(hLB);
SendMessage(hLB, WM_SETREDRAW, FALSE, 0L);
#ifdef DEBUG
{ //
// This is necessary for Unicode (i.e. NT) builds because the shell32
// library does not support ShellMessageBoxA and W versions.
//
TCHAR szTemp[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, lpwd->PropPrg.achIconFile, -1, szTemp, ARRAYSIZE(szTemp));
TraceMsg(TF_ERROR, "%s", szTemp); } #endif // DEBUG
cIcons = (int)ExtractIconExA(lpwd->PropPrg.achIconFile, 0, rgIcons, NULL, MAX_ICONS);
for (iTempIcon = 0; iTempIcon < cIcons; iTempIcon++) { ListBox_AddString(hLB, rgIcons[iTempIcon]); }
ListBox_SetCurSel(hLB, 0);
SendMessage(hLB, WM_SETREDRAW, TRUE, 0L); InvalidateRect(hLB, NULL, TRUE);
SetCursor(hcurOld); }
//
//
//
void PickIconInitDlg(HWND hDlg, LPARAM lParam) { LPPROPSHEETPAGE lpp = (LPPROPSHEETPAGE)lParam; LPWIZDATA lpwd = InitWizSheet(hDlg, lParam, 0);
PutIconsInList(GetDlgItem(hDlg, IDC_ICONLIST), lpwd); }
//
// Returns TRUE if a vaild icon is selected.
//
BOOL PickIconNextPressed(LPWIZDATA lpwd) { int iIconIndex = ListBox_GetCurSel(GetDlgItem(lpwd->hwnd, IDC_ICONLIST));
lpwd->PropPrg.wIconIndex = (WORD)iIconIndex;
return(iIconIndex != LB_ERR); }
//
//
//
BOOL_PTR CALLBACK PickIconDlgProc(HWND hDlg, UINT message , WPARAM wParam, LPARAM lParam) { NMHDR FAR *lpnm = NULL; LPPROPSHEETPAGE lpp = (LPPROPSHEETPAGE)(GetWindowLongPtr(hDlg, DWLP_USER)); LPWIZDATA lpwd = lpp ? (LPWIZDATA)lpp->lParam : NULL;
switch(message) { case WM_NOTIFY: lpnm = (NMHDR FAR *)lParam; if(lpnm) { switch(lpnm->code) { case PSN_SETACTIVE: if(lpwd) { //
// If PIFMGR has assigned an icon for this app then
// we'll skip it. This condition only happens when
// creating a shortcut to a single MS-DOS session.
//
if (lpwd->dwFlags & WDFLAG_APPKNOWN) { SetDlgMsgResult(hDlg, WM_NOTIFY, -1); } else { lpwd->hwnd = hDlg; PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_FINISH); } } break;
case PSN_WIZNEXT: if(lpwd) { if (!PickIconNextPressed(lpwd)) { SetDlgMsgResult(hDlg, WM_NOTIFY, -1); } } break;
case PSN_WIZFINISH: if(lpwd) { if (!(PickIconNextPressed(lpwd) && CreateLink(lpwd))) { SetDlgMsgResult(hDlg, WM_NOTIFY, -1); } } break;
case PSN_RESET: if(lpwd) { CleanUpWizData(lpwd); } break;
default: return FALSE; } } break;
case WM_INITDIALOG: PickIconInitDlg(hDlg, lParam); break;
case WM_COMMAND: if(lpwd) { if ((GET_WM_COMMAND_ID(wParam, lParam) == IDC_ICONLIST) && ((GET_WM_COMMAND_CMD(wParam, lParam) == LBN_DBLCLK))) { PropSheet_PressButton(GetParent(hDlg), PSBTN_FINISH); } } break;
//
// owner draw messages for icon listbox
//
case WM_DRAWITEM: #define lpdi ((DRAWITEMSTRUCT FAR *)lParam)
if (lpdi->itemState & ODS_SELECTED) SetBkColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT)); else SetBkColor(lpdi->hDC, GetSysColor(COLOR_WINDOW));
//
// repaint the selection state
//
ExtTextOut(lpdi->hDC, 0, 0, ETO_OPAQUE, &lpdi->rcItem, NULL, 0, NULL);
//
// draw the icon
//
if ((int)lpdi->itemID >= 0) DrawIcon(lpdi->hDC, (lpdi->rcItem.left + lpdi->rcItem.right - g_cxIcon) / 2, (lpdi->rcItem.bottom + lpdi->rcItem.top - g_cyIcon) / 2, (HICON)lpdi->itemData);
// InflateRect(&lpdi->rcItem, -1, -1);
//
// if it has the focus, draw the focus
//
if (lpdi->itemState & ODS_FOCUS) DrawFocusRect(lpdi->hDC, &lpdi->rcItem);
#undef lpdi
break;
case WM_MEASUREITEM: #define lpmi ((MEASUREITEMSTRUCT FAR *)lParam)
lpmi->itemWidth = g_cxIcon + 12; lpmi->itemHeight = g_cyIcon + 4;
#undef lpmi
break;
case WM_DELETEITEM: #define lpdi ((DELETEITEMSTRUCT FAR *)lParam)
DestroyIcon((HICON)lpdi->itemData);
#undef lpdi
break;
default: return FALSE;
} return TRUE; }
|