Annotation of mstools/ole20/samples/ole2ui/icon.c, revision 1.1.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.