Annotation of mstools/ole20/samples/ole2ui/icon.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * ICON.C
        !             3:  *
        !             4:  * Implements the OleUIChangeIcon function which invokes the complete
        !             5:  * Change Icon dialog.
        !             6:  *
        !             7:  * Copyright (c)1992 Microsoft Corporation, All Right Reserved
        !             8:  */
        !             9: 
        !            10: #define STRICT  1
        !            11: #include "ole2ui.h"
        !            12: #include "common.h"
        !            13: #include "utility.h"
        !            14: #include "icon.h"
        !            15: #include "geticon.h"
        !            16: 
        !            17: /*
        !            18:  * OleUIChangeIcon
        !            19:  *
        !            20:  * Purpose:
        !            21:  *  Invokes the standard OLE Change Icon dialog box allowing the user
        !            22:  *  to select an icon from an icon file, executable, or DLL.
        !            23:  *
        !            24:  * Parameters:
        !            25:  *  lpCI            LPOLEUIChangeIcon pointing to the in-out structure
        !            26:  *                  for this dialog.
        !            27:  *
        !            28:  * Return Value:
        !            29:  *  UINT            OLEUI_SUCCESS or OLEUI_OK if all is well, otherwise
        !            30:  *                  an error value.
        !            31:  */
        !            32: 
        !            33: STDAPI_(UINT) OleUIChangeIcon(LPOLEUICHANGEICON lpCI)
        !            34:     {
        !            35:     UINT        uRet;
        !            36:     HGLOBAL     hMemDlg=NULL;
        !            37: 
        !            38:     uRet=UStandardValidation((LPOLEUISTANDARD)lpCI, sizeof(OLEUICHANGEICON)
        !            39:                              , &hMemDlg);
        !            40: 
        !            41:     if (OLEUI_SUCCESS!=uRet)
        !            42:         return uRet;
        !            43: 
        !            44:     if (NULL==lpCI->hMetaPict)
        !            45:         uRet=OLEUI_CIERR_MUSTHAVECURRENTMETAFILE;
        !            46: 
        !            47:     if (lpCI->dwFlags & CIF_USEICONEXE)
        !            48:     { 
        !            49:       if (   (NULL == lpCI->szIconExe) 
        !            50:           || (IsBadReadPtr(lpCI->szIconExe, lpCI->cchIconExe))
        !            51:           || (IsBadWritePtr(lpCI->szIconExe, lpCI->cchIconExe)) )
        !            52:          uRet = OLEUI_CIERR_SZICONEXEINVALID;
        !            53:       
        !            54:     }
        !            55: 
        !            56:  // REVIEW: how do we validate the CLSID?   
        !            57: /*
        !            58:     if ('\0'==*((LPSTR)&lpCI->clsid))
        !            59:         uRet=OLEUI_CIERR_MUSTHAVECLSID;
        !            60: */
        !            61:     if (OLEUI_ERR_STANDARDMIN <= uRet)
        !            62:         {
        !            63:         if (NULL!=hMemDlg)
        !            64:             FreeResource(hMemDlg);
        !            65: 
        !            66:         return uRet;
        !            67:         }
        !            68: 
        !            69:     //Now that we've validated everything, we can invoke the dialog.
        !            70:     return UStandardInvocation(ChangeIconDialogProc, (LPOLEUISTANDARD)lpCI
        !            71:                                , hMemDlg, MAKEINTRESOURCE(IDD_CHANGEICON));
        !            72:     }
        !            73: 
        !            74: 
        !            75: 
        !            76: 
        !            77: 
        !            78: /*
        !            79:  * ChangeIconDialogProc
        !            80:  *
        !            81:  * Purpose:
        !            82:  *  Implements the OLE Change Icon dialog as invoked through the
        !            83:  *  OleUIChangeIcon function.
        !            84:  *
        !            85:  * Parameters:
        !            86:  *  Standard
        !            87:  *
        !            88:  * Return Value:
        !            89:  *  Standard
        !            90:  */
        !            91: 
        !            92: BOOL CALLBACK EXPORT ChangeIconDialogProc(HWND hDlg, UINT iMsg
        !            93:                                      , WPARAM wParam, LPARAM lParam)
        !            94:     {
        !            95:     LPCHANGEICON            lpCI;
        !            96:     HICON                   hIcon;
        !            97:     HGLOBAL                 hMetaPict;
        !            98:     BOOL                    fOK=FALSE;
        !            99:     UINT                    uRet=0;
        !           100:     LPSTR                   psz;
        !           101:     char                    szTemp[OLEUI_CCHPATHMAX];
        !           102: 
        !           103:     //Declare Win16/Win32 compatible WM_COMMAND parameters.
        !           104:     COMMANDPARAMS(wID, wCode, hWndMsg);
        !           105: 
        !           106:     lpCI=(LPCHANGEICON)LpvStandardEntry(hDlg, iMsg, wParam, lParam, &uRet);
        !           107: 
        !           108:     //If the hook processed the message, we're done.
        !           109:     if (0!=uRet)
        !           110:         return uRet;
        !           111: 
        !           112:     //Process the temination message
        !           113:     if (iMsg==uMsgEndDialog)
        !           114:         {
        !           115:         //Insure that icons are properly destroyed.
        !           116:         SendDlgItemMessage(hDlg, ID_ICONLIST, LB_RESETCONTENT, 0, 0L);
        !           117: 
        !           118:         StandardCleanup(lpCI, hDlg);
        !           119:         EndDialog(hDlg, wParam);
        !           120:         return TRUE;
        !           121:         }
        !           122: 
        !           123:     switch (iMsg)
        !           124:         {
        !           125:         case WM_INITDIALOG:
        !           126:             FChangeIconInit(hDlg, wParam, lParam);
        !           127:             return TRUE;
        !           128: 
        !           129: 
        !           130:         case WM_MEASUREITEM:
        !           131:             {
        !           132:             LPMEASUREITEMSTRUCT     lpMI=(LPMEASUREITEMSTRUCT)lParam;
        !           133: 
        !           134:             //All icons are system metric+padding in width and height
        !           135:             lpMI->itemWidth =GetSystemMetrics(SM_CXICON)+CXICONPAD;
        !           136:             lpMI->itemHeight=GetSystemMetrics(SM_CYICON)+CYICONPAD;
        !           137:             }
        !           138:             break;
        !           139: 
        !           140: 
        !           141:         case WM_DRAWITEM:
        !           142:             return FDrawListIcon((LPDRAWITEMSTRUCT)lParam);
        !           143: 
        !           144: 
        !           145:         case WM_DELETEITEM:
        !           146:             //Free the GDI object for the item
        !           147:             DestroyIcon((HICON)LOWORD(((LPDELETEITEMSTRUCT)lParam)->itemData));
        !           148:             break;
        !           149: 
        !           150: 
        !           151:         case WM_COMMAND:
        !           152:             switch (wID)
        !           153:                 {
        !           154:                 case ID_CURRENT:
        !           155:                 case ID_DEFAULT:
        !           156:                 case ID_FROMFILE:
        !           157:                     UpdateResultIcon(lpCI, hDlg, wID);
        !           158:                     break;
        !           159: 
        !           160:                 case ID_LABELEDIT:
        !           161:                     //When the edit loses focus, update the result display
        !           162:                     if (EN_KILLFOCUS==wCode)
        !           163:                         {
        !           164:                         GetDlgItemText(hDlg, ID_LABELEDIT, szTemp, sizeof(szTemp));
        !           165:                         SetDlgItemText(hDlg, ID_RESULTLABEL, szTemp);
        !           166:                         }
        !           167:                     break;
        !           168: 
        !           169:                 case ID_FROMFILEEDIT:
        !           170:                     //If the text changed, remove any selection in the list.
        !           171:                     GetDlgItemText(hDlg, ID_FROMFILEEDIT, szTemp, sizeof(szTemp));
        !           172: 
        !           173:                     if (lstrcmpi(szTemp, lpCI->szFile))
        !           174:                         {
        !           175:                         SendDlgItemMessage(hDlg, ID_ICONLIST, LB_SETCURSEL
        !           176:                                            , (WPARAM)-1, 0);
        !           177: 
        !           178:                         //Also force selection of ID_FROMFILE
        !           179:                         CheckRadioButton(hDlg, ID_CURRENT, ID_FROMFILE, ID_FROMFILE);
        !           180:                         }
        !           181:                     break;
        !           182: 
        !           183: 
        !           184:                 case ID_ICONLIST:
        !           185:                     switch (wCode)
        !           186:                         {
        !           187:                         case LBN_SETFOCUS:
        !           188:                             //If we got the focus, see about updating.
        !           189:                             GetDlgItemText(hDlg, ID_FROMFILEEDIT, szTemp
        !           190:                                            , sizeof(szTemp));
        !           191: 
        !           192:                             //Check if file changed and update the list if so
        !           193:                             if (0!=lstrcmpi(szTemp, lpCI->szFile))
        !           194:                                 {
        !           195:                                 lstrcpy(lpCI->szFile, szTemp);
        !           196:                                 UFillIconList(hDlg, ID_ICONLIST, lpCI->szFile);
        !           197:                                 UpdateResultIcon(lpCI, hDlg, ID_FROMFILE);
        !           198:                                 }
        !           199:                             break;
        !           200: 
        !           201:                         case LBN_SELCHANGE:
        !           202:                             UpdateResultIcon(lpCI, hDlg, ID_FROMFILE);
        !           203:                             break;
        !           204: 
        !           205:                         case LBN_DBLCLK:
        !           206:                             //Same as pressing OK.
        !           207:                             SendCommand(hDlg, IDOK, BN_CLICKED, hWndMsg);
        !           208:                             break;
        !           209:                         }
        !           210:                     break;
        !           211: 
        !           212: 
        !           213:                 case ID_BROWSE:
        !           214:                 {
        !           215:                     DWORD dwOfnFlags;
        !           216: 
        !           217:                     /*
        !           218:                      * To allow the hook to customize the browse dialog, we
        !           219:                      * send OLEUI_MSG_BROWSE.  If the hook returns FALSE
        !           220:                      * we use the default, otherwise we trust that it retrieved
        !           221:                      * a filename for us.  This mechanism prevents hooks from
        !           222:                      * trapping ID_BROWSE to customize the dialog and from
        !           223:                      * trying to figure out what we do after we have the name.
        !           224:                      */
        !           225: 
        !           226:                     lstrcpy(szTemp, lpCI->szFile);   //Copy for reference
        !           227: 
        !           228:                     uRet=UStandardHook(lpCI, hDlg, uMsgBrowse, OLEUI_CCHPATHMAX
        !           229:                                        , (LONG)(LPSTR)lpCI->szFile);
        !           230: 
        !           231:                     dwOfnFlags = OFN_FILEMUSTEXIST;
        !           232: // dont show the help button: easiest fix for #4567 since there is no hook proc
        !           233: //                    if (lpCI->lpOCI->dwFlags & CIF_SHOWHELP)
        !           234: //                       dwOfnFlags |= OFN_SHOWHELP;
        !           235: 
        !           236:                     if (0==uRet)
        !           237:                         uRet=(BOOL)Browse(hDlg, lpCI->szFile, NULL, OLEUI_CCHPATHMAX, IDS_ICONFILTERS, dwOfnFlags);
        !           238: 
        !           239:                     /*
        !           240:                      * Only reinitialize if the file changed, so if we got
        !           241:                      * TRUE from the hook but the user hit Cancel, we don't
        !           242:                      * spend time unecessarily refilling the list.
        !           243:                      */
        !           244:                     if (0!=uRet && 0!=lstrcmpi(szTemp, lpCI->szFile))
        !           245:                     {
        !           246:                         CheckRadioButton(hDlg, ID_CURRENT, ID_FROMFILE, ID_FROMFILE);
        !           247:                         SetDlgItemText(hDlg, ID_FROMFILEEDIT, lpCI->szFile);
        !           248:                         UFillIconList(hDlg, ID_ICONLIST, lpCI->szFile);
        !           249:                         UpdateResultIcon(lpCI, hDlg, ID_FROMFILE);
        !           250:                     }
        !           251:                 }
        !           252:                 break;
        !           253: 
        !           254: 
        !           255:                 case IDOK:
        !           256:                     /*
        !           257:                      * If the user pressed enter, compare the current file
        !           258:                      * and the one we have stored.  If they match, then
        !           259:                      * refill the listbox instead of closing down.  This is
        !           260:                      * so the user can press Enter in the edit control as
        !           261:                      * they would expect to be able to do.
        !           262:                      */
        !           263:                     GetDlgItemText(hDlg, ID_FROMFILEEDIT, szTemp, sizeof(szTemp));
        !           264: 
        !           265:                     //Check if the file changed at all.
        !           266:                     if (0!=lstrcmpi(szTemp, lpCI->szFile))
        !           267:                         {
        !           268:                         lstrcpy(lpCI->szFile, szTemp);
        !           269:                         UFillIconList(hDlg, ID_ICONLIST, lpCI->szFile);
        !           270:                         UpdateResultIcon(lpCI, hDlg, ID_FROMFILE);
        !           271: 
        !           272:                         //Eat this message to prevent focus change.
        !           273:                         return TRUE;
        !           274:                         }
        !           275: 
        !           276: 
        !           277:                     if ((HWND)LOWORD(lParam) != GetFocus())
        !           278:                        SetFocus((HWND)LOWORD(lParam));
        !           279: 
        !           280:                     /*
        !           281:                      * On closing, create a new metafilepict with the
        !           282:                      * current icon and label, destroying the old structure.
        !           283:                      *
        !           284:                      * Since we make a copy of the icon by placing it into
        !           285:                      * the metafile, we have to make sure we delete the
        !           286:                      * icon in the current field.  When the listbox is
        !           287:                      * destroyed WM_DELETEITEMs will clean it up appropriately.
        !           288:                      */
        !           289: 
        !           290:                     hIcon=(HICON)SendDlgItemMessage(hDlg, ID_RESULTICON
        !           291:                                                     , STM_GETICON, 0, 0L);
        !           292: 
        !           293:                     /*
        !           294:                      * If default is selected then we get the source
        !           295:                      * information from registrion database for the 
        !           296:                      * current class to put in the metafile.  If current 
        !           297:                      * is selected the we just retrieve the original file 
        !           298:                      * again and recreate the metafile.  If from file is 
        !           299:                      * selected we use the current filename from the 
        !           300:                      * control and the current listbox selection.
        !           301:                      */
        !           302: 
        !           303:                     psz=lpCI->szFile;
        !           304: 
        !           305:                     if (lpCI->dwFlags & CIF_SELECTDEFAULT)
        !           306:                         {
        !           307:                         psz=lpCI->szDefIconFile;
        !           308:                         lpCI->iIcon=lpCI->iDefIcon;
        !           309:                         hIcon=lpCI->hDefIcon;
        !           310:                         }
        !           311: 
        !           312:                     if (lpCI->dwFlags & CIF_SELECTCURRENT)
        !           313:                         {
        !           314:                         //Go get the current icon source back.
        !           315:                         OleUIMetafilePictExtractIconSource(lpCI->lpOCI->hMetaPict
        !           316:                             , psz, &lpCI->iIcon);
        !           317:                         }
        !           318: 
        !           319:                     if (lpCI->dwFlags & CIF_SELECTFROMFILE)
        !           320:                         {
        !           321:                         GetDlgItemText(hDlg, ID_FROMFILEEDIT, psz, OLEUI_CCHPATHMAX);
        !           322: 
        !           323:                         lpCI->iIcon=(UINT)SendDlgItemMessage(hDlg
        !           324:                             , ID_ICONLIST, LB_GETCURSEL, 0, 0L);
        !           325:                         }
        !           326: 
        !           327: 
        !           328:                     //Get the label and go create the metafile
        !           329:                     GetDlgItemText(hDlg, ID_LABELEDIT, szTemp, sizeof(szTemp));
        !           330: 
        !           331:                     //If psz is NULL (default) we get no source comments.
        !           332:                     hMetaPict=OleUIMetafilePictFromIconAndLabel(hIcon
        !           333:                         , szTemp, psz, lpCI->iIcon);
        !           334: 
        !           335:                     //Clean up the current icon that we extracted.
        !           336:                     hIcon=(HICON)SendDlgItemMessage(hDlg, ID_CURRENTICON
        !           337:                                                     , STM_GETICON, 0, 0L);
        !           338:                     DestroyIcon(hIcon);
        !           339: 
        !           340:                     //Clean up the default icon
        !           341:                     DestroyIcon(lpCI->hDefIcon);
        !           342: 
        !           343:                     if (NULL==hMetaPict)
        !           344:                         SendMessage(hDlg, uMsgEndDialog, OLEUI_FALSE, 0L);
        !           345: 
        !           346:                     OleUIMetafilePictIconFree(lpCI->lpOCI->hMetaPict);
        !           347:                     lpCI->lpOCI->hMetaPict=hMetaPict;
        !           348: 
        !           349:                     lpCI->lpOCI->dwFlags = lpCI->dwFlags;
        !           350: 
        !           351:                     SendMessage(hDlg, uMsgEndDialog, OLEUI_OK, 0L);
        !           352:                     break;
        !           353: 
        !           354: 
        !           355:                 case IDCANCEL:
        !           356:                     //Clean up the current icon that we extracted.
        !           357:                     hIcon=(HICON)SendDlgItemMessage(hDlg, ID_CURRENTICON
        !           358:                                                     , STM_GETICON, 0, 0L);
        !           359:                     DestroyIcon(hIcon);
        !           360: 
        !           361:                     //Clean up the default icon
        !           362:                     DestroyIcon(lpCI->hDefIcon);
        !           363: 
        !           364:                     //We leave hMetaPict intact on Cancel; caller's responsibility
        !           365:                     SendMessage(hDlg, uMsgEndDialog, OLEUI_CANCEL, 0L);
        !           366:                     break;
        !           367: 
        !           368: 
        !           369:                 case ID_OLEUIHELP:
        !           370:                     PostMessage(lpCI->lpOCI->hWndOwner, uMsgHelp,
        !           371:                                 (WPARAM)hDlg, MAKELPARAM(IDD_CHANGEICON, 0));
        !           372:                     break;
        !           373:                 }
        !           374:             break;
        !           375:         }
        !           376:     return FALSE;
        !           377:     }
        !           378: 
        !           379: 
        !           380: 
        !           381: 
        !           382: /*
        !           383:  * FChangeIconInit
        !           384:  *
        !           385:  * Purpose:
        !           386:  *  WM_INITIDIALOG handler for the Change Icon dialog box.
        !           387:  *
        !           388:  * Parameters:
        !           389:  *  hDlg            HWND of the dialog
        !           390:  *  wParam          WPARAM of the message
        !           391:  *  lParam          LPARAM of the message
        !           392:  *
        !           393:  * Return Value:
        !           394:  *  BOOL            Value to return for WM_INITDIALOG.
        !           395:  */
        !           396: 
        !           397: BOOL FChangeIconInit(HWND hDlg, WPARAM wParam, LPARAM lParam)
        !           398:     {
        !           399:     LPCHANGEICON            lpCI;
        !           400:     LPOLEUICHANGEICON       lpOCI;
        !           401:     HFONT                   hFont;
        !           402:     HWND                    hList;
        !           403:     UINT                    cyList;
        !           404:     RECT                    rc, rcG;
        !           405:     UINT                    uID;
        !           406: 
        !           407:     //1.  Copy the structure at lParam into our instance memory.
        !           408:     lpCI=(LPCHANGEICON)LpvStandardInit(hDlg, sizeof(CHANGEICON), TRUE, &hFont);
        !           409: 
        !           410:     //PvStandardInit send a termination to us already.
        !           411:     if (NULL==lpCI)
        !           412:         return FALSE;
        !           413: 
        !           414:     //Save the original pointer and copy necessary information.
        !           415:     lpOCI=(LPOLEUICHANGEICON)lParam;
        !           416: 
        !           417:     lpCI->lpOCI  =lpOCI;
        !           418:     lpCI->dwFlags=lpOCI->dwFlags;
        !           419: 
        !           420:     //Go extract the icon source from the metafile.
        !           421:     OleUIMetafilePictExtractIconSource(lpOCI->hMetaPict, lpCI->szFile, &lpCI->iIcon);
        !           422: 
        !           423:     //Go extract the icon and the label from the metafile
        !           424:     OleUIMetafilePictExtractLabel(lpOCI->hMetaPict, lpCI->szLabel, OLEUI_CCHLABELMAX, NULL);
        !           425:     lpCI->hCurIcon=OleUIMetafilePictExtractIcon(lpOCI->hMetaPict);
        !           426: 
        !           427:     //2.  If we got a font, send it to the necessary controls.
        !           428:     if (NULL!=hFont)
        !           429:         {
        !           430:         SendDlgItemMessage(hDlg, ID_RESULTLABEL, WM_SETFONT
        !           431:                            , (WPARAM)hFont, 0L);
        !           432:         }
        !           433: 
        !           434: 
        !           435:     //3.  Show or hide the help button
        !           436:     if (!(lpCI->dwFlags & CIF_SHOWHELP))
        !           437:         StandardShowDlgItem(hDlg, ID_OLEUIHELP, SW_HIDE);       
        !           438: 
        !           439: 
        !           440:     /*
        !           441:      * 4.  Set text limits and initial control values.  If we're given
        !           442:      *     an intial label we set it in the edit and static controls.
        !           443:      *     If we don't, then we copy the default contents of the static
        !           444:      *     control into the edit control, meaning that only the default
        !           445:      *     static control string need be localized.
        !           446:      */
        !           447: 
        !           448:     SendDlgItemMessage(hDlg, ID_LABELEDIT, EM_LIMITTEXT, OLEUI_CCHLABELMAX, 0L);
        !           449:     SendDlgItemMessage(hDlg, ID_FROMFILEEDIT, EM_LIMITTEXT, OLEUI_CCHPATHMAX,  0L);
        !           450:     SetDlgItemText(hDlg, ID_FROMFILEEDIT, lpCI->szFile);
        !           451: 
        !           452:     //Copy the label text into the edit and static controls.
        !           453:     SetDlgItemText(hDlg, ID_LABELEDIT,   lpCI->szLabel);
        !           454:     SetDlgItemText(hDlg, ID_RESULTLABEL, lpCI->szLabel);
        !           455: 
        !           456: 
        !           457:     lpCI->hDefIcon = NULL;
        !           458: 
        !           459:     if (lpCI->dwFlags & CIF_USEICONEXE)
        !           460:     {
        !           461:        lpCI->hDefIcon = ExtractIcon(ghInst, lpCI->lpOCI->szIconExe, 0);
        !           462: 
        !           463:        if (NULL != lpCI->hDefIcon)
        !           464:        {
        !           465:          lstrcpy(lpCI->szDefIconFile, lpCI->lpOCI->szIconExe);
        !           466:          lpCI->iDefIcon = 0;
        !           467:        }
        !           468:     }
        !           469: 
        !           470: 
        !           471:     if (NULL == lpCI->hDefIcon)
        !           472:     {
        !           473:        HGLOBAL hMetaPict;
        !           474: 
        !           475:        hMetaPict = GetIconOfClass(ghInst, 
        !           476:                                   &lpCI->lpOCI->clsid,
        !           477:                                   NULL,
        !           478:                                   TRUE);
        !           479: 
        !           480:        lpCI->hDefIcon = OleUIMetafilePictExtractIcon(hMetaPict);
        !           481: 
        !           482:        OleUIMetafilePictExtractIconSource(hMetaPict, 
        !           483:                                           lpCI->szDefIconFile, 
        !           484:                                           &lpCI->iDefIcon);
        !           485: 
        !           486:        OleUIMetafilePictIconFree(hMetaPict);
        !           487:     }
        !           488: 
        !           489: 
        !           490:     //Initialize all the icon displays.
        !           491:     SendDlgItemMessage(hDlg, ID_CURRENTICON, STM_SETICON
        !           492:         , (WPARAM)lpCI->hCurIcon, 0L);
        !           493:     SendDlgItemMessage(hDlg, ID_DEFAULTICON, STM_SETICON
        !           494:         , (WPARAM)lpCI->hDefIcon, 0L);
        !           495:     SendDlgItemMessage(hDlg, ID_RESULTICON,  STM_SETICON
        !           496:         , (WPARAM)lpCI->hCurIcon, 0L);
        !           497: 
        !           498: 
        !           499:     /*
        !           500:      * 5.  Since we cannot predict the size of icons on any display,
        !           501:      *     we have to resize the icon listbox to the size of an icon
        !           502:      *     (plus padding), a scrollbar, and two borders (top & bottom).
        !           503:      */
        !           504:     cyList=GetSystemMetrics(SM_CYICON)+GetSystemMetrics(SM_CYHSCROLL)
        !           505:            +GetSystemMetrics(SM_CYBORDER)*2+CYICONPAD;
        !           506: 
        !           507:     hList=GetDlgItem(hDlg, ID_ICONLIST);
        !           508:     GetClientRect(hList, &rc);
        !           509:     SetWindowPos(hList, NULL, 0, 0, rc.right, cyList
        !           510:                  , SWP_NOMOVE | SWP_NOZORDER);
        !           511: 
        !           512:     //Set the columns in this multi-column listbox to hold one icon
        !           513:     SendMessage(hList, LB_SETCOLUMNWIDTH
        !           514:                 , GetSystemMetrics(SM_CXICON)+CXICONPAD,0L);
        !           515: 
        !           516:     /*
        !           517:      * 5a.  If the listbox expanded below the group box, then size
        !           518:      *      the groupbox down, move the label static and exit controls
        !           519:      *      down, and expand the entire dialog appropriately.
        !           520:      */
        !           521: 
        !           522:     GetWindowRect(hList, &rc);
        !           523:     GetWindowRect(GetDlgItem(hDlg, ID_GROUP), &rcG);
        !           524: 
        !           525:     if (rc.bottom > rcG.bottom)
        !           526:         {
        !           527:         //Calculate amount to move things down.
        !           528:         cyList=(rcG.bottom-rcG.top)-(rc.bottom-rc.top-cyList);
        !           529: 
        !           530:         //Expand the group box.
        !           531:         rcG.right -=rcG.left;
        !           532:         rcG.bottom-=rcG.top;
        !           533:         SetWindowPos(GetDlgItem(hDlg, ID_GROUP), NULL, 0, 0
        !           534:                      , rcG.right, rcG.bottom+cyList
        !           535:                      , SWP_NOMOVE | SWP_NOZORDER);
        !           536: 
        !           537:         //Expand the dialog box.
        !           538:         GetClientRect(hDlg, &rc);
        !           539:         SetWindowPos(hDlg, NULL, 0, 0, rc.right, rc.bottom+cyList
        !           540:                      , SWP_NOMOVE | SWP_NOZORDER);
        !           541: 
        !           542:         //Move the label and edit controls down.
        !           543:         GetClientRect(GetDlgItem(hDlg, ID_LABEL), &rc);
        !           544:         SetWindowPos(GetDlgItem(hDlg, ID_LABEL), NULL, 0, cyList
        !           545:                      , rc.right, rc.bottom, SWP_NOSIZE | SWP_NOZORDER);
        !           546: 
        !           547:         GetClientRect(GetDlgItem(hDlg, ID_LABELEDIT), &rc);
        !           548:         SetWindowPos(GetDlgItem(hDlg, ID_LABELEDIT), NULL, 0, cyList
        !           549:                      , rc.right, rc.bottom, SWP_NOSIZE | SWP_NOZORDER);
        !           550:         }
        !           551: 
        !           552: 
        !           553:     /*
        !           554:      * 6.  Select Current, Default, or From File radiobuttons appropriately.
        !           555:      *     The CheckRadioButton call sends WM_COMMANDs which handle
        !           556:      *     other actions.  Note that if we check From File, which
        !           557:      *     takes an icon from the list, we better fill the list.
        !           558:      *     This will also fill the list even if default is selected.
        !           559:      */
        !           560: 
        !           561:     if (0!=UFillIconList(hDlg, ID_ICONLIST, lpCI->szFile))
        !           562:         {
        !           563:         //If szFile worked, then select the source icon in the listbox.
        !           564:         SendDlgItemMessage(hDlg, ID_ICONLIST, LB_SETCURSEL, lpCI->iIcon, 0L);
        !           565:         }
        !           566: 
        !           567: 
        !           568:     if (lpCI->dwFlags & CIF_SELECTCURRENT)
        !           569:         CheckRadioButton(hDlg, ID_CURRENT, ID_FROMFILE, ID_CURRENT);
        !           570:     else
        !           571:         {
        !           572:         uID=(lpCI->dwFlags & CIF_SELECTFROMFILE) ? ID_FROMFILE : ID_DEFAULT;
        !           573:         CheckRadioButton(hDlg, ID_CURRENT, ID_FROMFILE, uID);
        !           574:         }
        !           575: 
        !           576:     //7.  Call the hook with lCustData in lParam
        !           577:     UStandardHook(lpCI, hDlg, WM_INITDIALOG, wParam, lpOCI->lCustData);
        !           578:     return TRUE;
        !           579:     }
        !           580: 
        !           581: 
        !           582: 
        !           583: 
        !           584: 
        !           585: /*
        !           586:  * UFillIconList
        !           587:  *
        !           588:  * Purpose:
        !           589:  *  Given a listbox and a filename, attempts to open that file and
        !           590:  *  read all the icons that exist therein, adding them to the listbox
        !           591:  *  hList as owner-draw items.  If the file does not exist or has no
        !           592:  *  icons, then you get no icons and an appropriate warning message.
        !           593:  *
        !           594:  * Parameters:
        !           595:  *  hDlg            HWND of the dialog containing the listbox.
        !           596:  *  idList          UINT identifier of the listbox to fill.
        !           597:  *  pszFile         LPSTR of the file from which to extract icons.
        !           598:  *
        !           599:  * Return Value:
        !           600:  *  UINT            Number of items added to the listbox.  0 on failure.
        !           601:  */
        !           602: 
        !           603: UINT UFillIconList(HWND hDlg, UINT idList, LPSTR pszFile)
        !           604:     {
        !           605:     HWND        hList;
        !           606:     UINT        i;
        !           607:     UINT        cIcons=0;
        !           608:     HCURSOR     hCur;
        !           609:     HICON       hIcon;
        !           610:     OFSTRUCT    of;
        !           611: 
        !           612:     if (NULL==hDlg || !IsWindow(hDlg) || NULL==pszFile)
        !           613:         return 0;
        !           614: 
        !           615:     hList=GetDlgItem(hDlg, idList);
        !           616: 
        !           617:     if (NULL==hList)
        !           618:         return 0;
        !           619: 
        !           620:     //Clean out the listbox.
        !           621:     SendMessage(hList, LB_RESETCONTENT, 0, 0L);
        !           622: 
        !           623:     //If we have an empty string, just exit leaving the listbox empty as well
        !           624:     if (0==lstrlen(pszFile))
        !           625:         return 0;
        !           626: 
        !           627:     //Turn on the hourglass
        !           628:     hCur=HourGlassOn();
        !           629: 
        !           630:     //Check if the file is valid.
        !           631:     if (HFILE_ERROR!=OpenFile(pszFile, &of, OF_EXIST))
        !           632:         {
        !           633:        #ifdef EXTRACTICONWORKS
        !           634:         //Get the icon count for this file.
        !           635:         cIcons=(UINT)ExtractIcon(ghInst, pszFile, (UINT)-1);
        !           636:        #else
        !           637:         /*
        !           638:          * ExtractIcon in Windows 3.1 with -1 eats a selector, leaving an
        !           639:          * extra global memory object around for this applciation.  Since
        !           640:          * changing icons may happen very often with all OLE apps in
        !           641:          * the system, we have to work around it.  So we'll say we
        !           642:          * have lots of icons and just call ExtractIcon until it
        !           643:          * fails.  We check if there's any around by trying to get
        !           644:          * the first one.
        !           645:          */
        !           646:         cIcons=0xFFFF;
        !           647: 
        !           648:         hIcon=ExtractIcon(ghInst, pszFile, 0);
        !           649: 
        !           650:         //Fake a failure with cIcons=0, or cleanup hIcon from this test.
        !           651:         if (32 > (UINT)hIcon)
        !           652:             cIcons=0;
        !           653:         else
        !           654:             DestroyIcon(hIcon);
        !           655:        #endif
        !           656: 
        !           657:         if (0!=cIcons)
        !           658:             {
        !           659:             SendMessage(hList, WM_SETREDRAW, FALSE, 0L);
        !           660: 
        !           661:             for (i=0; i<cIcons; i++)
        !           662:                 {
        !           663:                 hIcon=ExtractIcon(ghInst, pszFile, i);
        !           664: 
        !           665:                 if (32 < (UINT)hIcon)
        !           666:                     SendMessage(hList, LB_ADDSTRING, 0, (LONG)(UINT)hIcon);
        !           667:                #ifndef EXTRACTICONWORKS
        !           668:                 else
        !           669:                     {
        !           670:                     //ExtractIcon failed, so let's leave now.
        !           671:                     break;
        !           672:                     }
        !           673:                #endif
        !           674:                 }
        !           675: 
        !           676:             //Force complete repaint
        !           677:             SendMessage(hList, WM_SETREDRAW, TRUE, 0L);
        !           678:             InvalidateRect(hList, NULL, TRUE);
        !           679: 
        !           680:             //Select an icon
        !           681:             SendMessage(hList, LB_SETCURSEL, 0, 0L);
        !           682:             }
        !           683:         else
        !           684:             ErrorWithFile(hDlg, ghInst, IDS_CINOICONSINFILE, pszFile, MB_OK);
        !           685:         }
        !           686:     else
        !           687:         OpenFileError(hDlg, of.nErrCode, pszFile);
        !           688: 
        !           689:     HourGlassOff(hCur);
        !           690:     return cIcons;
        !           691:     }
        !           692: 
        !           693: 
        !           694: 
        !           695: 
        !           696: /*
        !           697:  * FDrawListIcon
        !           698:  *
        !           699:  * Purpose:
        !           700:  *  Handles WM_DRAWITEM for the icon listbox.
        !           701:  *
        !           702:  * Parameters:
        !           703:  *  lpDI            LPDRAWITEMSTRUCT from WM_DRAWITEM
        !           704:  *
        !           705:  * Return Value:
        !           706:  *  BOOL            TRUE if we did anything, FALSE if there are no items
        !           707:  *                  in the list.
        !           708:  */
        !           709: 
        !           710: BOOL FDrawListIcon(LPDRAWITEMSTRUCT lpDI)
        !           711:     {
        !           712:     COLORREF        cr;
        !           713: 
        !           714:     /*
        !           715:      * If there are no items in the list, then itemID is negative according
        !           716:      * to the Win3.1 SDK.  Unfortunately DRAWITEMSTRUCT has an unsigned int
        !           717:      * for this field, so we need the typecast to do a signed comparison.
        !           718:      */
        !           719:     if ((int)lpDI->itemID < 0)
        !           720:         return FALSE;
        !           721: 
        !           722:     /*
        !           723:      * For selection or draw entire case we just draw the entire item all
        !           724:      * over again.  For focus cases, we only call DrawFocusRect.
        !           725:      */
        !           726: 
        !           727:     if (lpDI->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))
        !           728:         {
        !           729:         //Clear background and draw the icon.
        !           730:         if (lpDI->itemState & ODS_SELECTED)
        !           731:             cr=SetBkColor(lpDI->hDC, GetSysColor(COLOR_HIGHLIGHT));
        !           732:         else
        !           733:             cr=SetBkColor(lpDI->hDC, GetSysColor(COLOR_WINDOW));
        !           734: 
        !           735:         //Draw a cheap rectangle.
        !           736:         ExtTextOut(lpDI->hDC, 0, 0, ETO_OPAQUE, &lpDI->rcItem
        !           737:                    , NULL, 0, NULL);
        !           738: 
        !           739:         DrawIcon(lpDI->hDC, lpDI->rcItem.left+(CXICONPAD/2)
        !           740:                  , lpDI->rcItem.top+(CYICONPAD/2)
        !           741:                  , (HICON)LOWORD(lpDI->itemData));
        !           742: 
        !           743:         //Restore original background for DrawFocusRect
        !           744:         SetBkColor(lpDI->hDC, cr);
        !           745:         }
        !           746: 
        !           747:     //Always change focus on the focus action.
        !           748:     if (lpDI->itemAction & ODA_FOCUS || lpDI->itemState & ODS_FOCUS)
        !           749:         DrawFocusRect(lpDI->hDC, &lpDI->rcItem);
        !           750: 
        !           751:     return TRUE;
        !           752:     }
        !           753: 
        !           754: 
        !           755: 
        !           756: 
        !           757: 
        !           758: /*
        !           759:  * UpdateResultIcon
        !           760:  *
        !           761:  * Purpose:
        !           762:  *  Updates the result icon using the current icon in the default display
        !           763:  *  or the icon listbox depending on fFromDefault.
        !           764:  *
        !           765:  * Parameters:
        !           766:  *  lpCI            LPCHANGEICON containing dialog flags.
        !           767:  *  hDlg            HWND of the dialog
        !           768:  *  uID             UINT identifying the radiobutton selected.
        !           769:  *
        !           770:  * Return Value:
        !           771:  *  None
        !           772:  */
        !           773: 
        !           774: void UpdateResultIcon(LPCHANGEICON lpCI, HWND hDlg, UINT uID)
        !           775:     {
        !           776:     UINT        iSel;
        !           777:     LONG        lTemp=LB_ERR;
        !           778: 
        !           779:     lpCI->dwFlags &= ~(CIF_SELECTCURRENT | CIF_SELECTDEFAULT | CIF_SELECTFROMFILE);
        !           780: 
        !           781:     switch (uID)
        !           782:         {
        !           783:         case ID_CURRENT:
        !           784:             lTemp=SendDlgItemMessage(hDlg, ID_CURRENTICON, STM_GETICON, 0, 0L);
        !           785:             lpCI->dwFlags |= CIF_SELECTCURRENT;
        !           786:             break;
        !           787: 
        !           788:         case ID_DEFAULT:
        !           789:             lTemp=SendDlgItemMessage(hDlg, ID_DEFAULTICON, STM_GETICON, 0, 0L);
        !           790:             lpCI->dwFlags |= CIF_SELECTDEFAULT;
        !           791:             break;
        !           792: 
        !           793:         case ID_FROMFILE:
        !           794:             //Get the selected icon from the list and place it in the result
        !           795:             lpCI->dwFlags |= CIF_SELECTFROMFILE;
        !           796: 
        !           797:             iSel=(UINT)SendDlgItemMessage(hDlg, ID_ICONLIST, LB_GETCURSEL, 0, 0L);
        !           798:             if ((UINT)LB_ERR==iSel)
        !           799:                 lTemp=SendDlgItemMessage(hDlg, ID_DEFAULTICON, STM_GETICON, 0, 0L);
        !           800:             else
        !           801:                 SendDlgItemMessage(hDlg, ID_ICONLIST, LB_GETTEXT, iSel
        !           802:                                , (LPARAM)(LPLONG)&lTemp);
        !           803: 
        !           804:             break;
        !           805:         }
        !           806: 
        !           807:     if ((LONG)LB_ERR!=lTemp)
        !           808:         SendDlgItemMessage(hDlg, ID_RESULTICON, STM_SETICON, LOWORD(lTemp), 0L);
        !           809:     return;
        !           810:     }
        !           811: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.