Annotation of mstools/samples/sdktools/netwatch/bitmap.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  Bitmap.c
        !             3:  *  
        !             4:  *  Purpose:
        !             5:  *      bitmap and listbox support functions for netwatch.exe
        !             6:  *  
        !             7:  *  Owner:
        !             8:  *      MikeSart
        !             9:  */
        !            10: #define UNICODE 1
        !            11: 
        !            12: #include <windows.h>
        !            13: #include <windowsx.h>
        !            14: #include "netwatch.h"
        !            15: #include "rcids.h"
        !            16: 
        !            17: /*
        !            18:  *  function prototypes
        !            19:  */
        !            20: void DeleteBitmapLB(void);
        !            21: 
        !            22: /*
        !            23:  *  globals
        !            24:  */
        !            25: DWORD   rgbWindowColor = 0xFF000000;    // variables for the current
        !            26: DWORD   rgbHiliteColor = 0xFF000000;    // system color settings.
        !            27: DWORD   rgbWindowText  = 0xFF000000;    // on a WM_SYSCOLORCHANGE
        !            28: DWORD   rgbHiliteText  = 0xFF000000;    // we check to see if we need
        !            29: DWORD   rgbGrayText    = 0xFF000000;    // to reload our bitmap.
        !            30: DWORD   rgbDDWindow    = 0xFF000000;    //
        !            31: DWORD   rgbDDHilite    = 0xFF000000;    // 0xFF000000 is an invalid RGB
        !            32: 
        !            33: // an array of integers containing the tab stops, in pixels. The tab 
        !            34: // stops must be sorted in ascending order; back tabs are not allowed. 
        !            35: int     rgTabs[] = { 2, 20, 38, 56, 74 };
        !            36: 
        !            37: // font style of font to use in listbox
        !            38: typedef struct
        !            39: {
        !            40:     int     lfHeight;
        !            41:     int     lfWeight;
        !            42:     BYTE    lfItalic;
        !            43:     TCHAR   lfFaceName[LF_FACESIZE];
        !            44: } FONTSTYLE;
        !            45: 
        !            46: FONTSTYLE fontStyle = { 8, FW_NORMAL, 0, TEXT("MS Sans Serif") };
        !            47: 
        !            48: int dxbmpLB, dybmpLB;       // dx and dy of listbox bmps
        !            49: 
        !            50: HDC     hdcMemory = NULL;   // hdc to hold listbox bitmaps (for speed)
        !            51: 
        !            52: HBITMAP hbmpOrigMemBmp = NULL;  // original null bitmap in hdcMemory
        !            53: HBITMAP hbmpLB = NULL;      // cached listbox bitmaps
        !            54: 
        !            55: HFONT   hfontLB = NULL;     // hfont of LB
        !            56: HWND    hwndLB = NULL;      // hwnd of LB
        !            57: 
        !            58: /*
        !            59:  *  DeInitBmps
        !            60:  *  
        !            61:  *  Purpose:
        !            62:  *      cleans up LB hfonts, hdc, and hbmps
        !            63:  *  
        !            64:  *  Arguments:
        !            65:  *  
        !            66:  *  Returns:
        !            67:  *      hopefully
        !            68:  */
        !            69: VOID
        !            70: DeInitBmps(VOID)
        !            71: {
        !            72:     DeleteBitmapLB();
        !            73:     if(hdcMemory)
        !            74:     {
        !            75:         DeleteDC(hdcMemory);
        !            76:         hdcMemory = NULL;
        !            77:     }
        !            78: 
        !            79:     if(hfontLB)
        !            80:     {
        !            81:         SetWindowFont(hwndLB, GetStockObject(SYSTEM_FONT), FALSE);
        !            82:         DeleteObject(hfontLB);
        !            83:         hfontLB = NULL;
        !            84:     }
        !            85: }
        !            86: 
        !            87: /*
        !            88:  *  SetLBFont
        !            89:  *  
        !            90:  *  Purpose:
        !            91:  *      creates a font from the global fontStyle
        !            92:  *      sets global hfontLB to new font and WM_SETFONTs
        !            93:  *      the hwndLB to the new font
        !            94:  *  
        !            95:  *  Arguments:
        !            96:  *  
        !            97:  *  Returns:
        !            98:  *      yep
        !            99:  */
        !           100: VOID
        !           101: SetLBFont(VOID)
        !           102: {
        !           103:     LOGFONT lf;
        !           104: 
        !           105:     lf.lfHeight = fontStyle.lfHeight;
        !           106:     lf.lfWidth = 0;
        !           107:     lf.lfEscapement = 0;
        !           108:     lf.lfOrientation = 0;
        !           109:     lf.lfWeight = fontStyle.lfWeight;
        !           110:     lf.lfItalic = fontStyle.lfItalic;
        !           111:     lf.lfUnderline = 0;
        !           112:     lf.lfStrikeOut = 0;
        !           113:     lf.lfCharSet = ANSI_CHARSET;
        !           114:     lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
        !           115:     lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
        !           116:     lf.lfQuality = DEFAULT_QUALITY;
        !           117:     lf.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
        !           118:     lstrcpy(lf.lfFaceName, fontStyle.lfFaceName);
        !           119: 
        !           120:     hfontLB = CreateFontIndirect(&lf);
        !           121:     if(hfontLB)
        !           122:         SetWindowFont(hwndLB, hfontLB, FALSE);        
        !           123: }
        !           124: 
        !           125: /*
        !           126:  *  InitBmps
        !           127:  *  
        !           128:  *  Purpose:
        !           129:  *      inits listbox globals, creates listbox
        !           130:  *  
        !           131:  *  Arguments:
        !           132:  *      HWND    main hwnd of app (parent of LB)
        !           133:  *  
        !           134:  *  Returns:
        !           135:  *      TRUE - success; FALSE - failed
        !           136:  */
        !           137: BOOL
        !           138: InitBmps(HWND hwnd)
        !           139: {
        !           140:     HDC     hdcScreen;
        !           141:     HBITMAP hbmpTemp;
        !           142: 
        !           143:     hdcScreen = GetDC(NULL);
        !           144:     if(!hdcScreen)
        !           145:         goto CantInit;
        !           146:     hdcMemory = CreateCompatibleDC(hdcScreen);
        !           147:     if(!hdcMemory)
        !           148:         goto ReleaseScreenDC;
        !           149: 
        !           150:     hbmpTemp = CreateCompatibleBitmap(hdcMemory, 1, 1);
        !           151:     if(!hbmpTemp)
        !           152:         goto ReleaseMemDC;
        !           153:     hbmpOrigMemBmp = SelectObject(hdcMemory, hbmpTemp); // get hbmp of NULL
        !           154:     if(!hbmpOrigMemBmp)                                 // bmp for hdcMemory
        !           155:         goto ReleaseMemDC;                              // for when we delete
        !           156:     SelectObject(hdcMemory, hbmpOrigMemBmp);            // it later in life
        !           157:     DeleteObject(hbmpTemp);
        !           158:     ReleaseDC(NULL, hdcScreen);
        !           159: 
        !           160:     SetRGBValues();     // set the global RGB values
        !           161:     LoadBitmapLB();     // load the bmps into hdcMemory
        !           162: 
        !           163:     hwndLB = CreateWindow(TEXT("listbox"), NULL,
        !           164:         WS_CHILD | WS_VISIBLE | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT |
        !           165:         WS_VSCROLL | LBS_WANTKEYBOARDINPUT | LBS_HASSTRINGS |
        !           166:         LBS_OWNERDRAWFIXED,
        !           167:         0, 0, 0, 0, hwnd, (HMENU)IDD_lstSHARES, ghInst, NULL);
        !           168: 
        !           169:     SetLBFont();    // set the font of our listbox
        !           170:     return TRUE;
        !           171: 
        !           172: /* Error recovery exits */
        !           173: ReleaseMemDC:
        !           174:     DeleteDC(hdcMemory);
        !           175:     hdcMemory = NULL;
        !           176: 
        !           177: ReleaseScreenDC:
        !           178:     ReleaseDC(NULL, hdcScreen);
        !           179: 
        !           180: CantInit:
        !           181:     return FALSE;
        !           182: }
        !           183: 
        !           184: /*
        !           185:  *  SetRGBValues
        !           186:  *  
        !           187:  *  Purpose:
        !           188:  *      To set various system colors in static variables.  Called at
        !           189:  *      init time and when system colors change.
        !           190:  *  
        !           191:  *  Arguments:
        !           192:  *  
        !           193:  *  Returns:
        !           194:  *      Yes
        !           195:  */
        !           196: VOID
        !           197: SetRGBValues(VOID)
        !           198: {
        !           199:     rgbWindowColor = GetSysColor(COLOR_WINDOW);
        !           200:     rgbHiliteColor = GetSysColor(COLOR_HIGHLIGHT);
        !           201:     rgbWindowText  = GetSysColor(COLOR_WINDOWTEXT);
        !           202:     rgbHiliteText  = GetSysColor(COLOR_HIGHLIGHTTEXT);
        !           203:     rgbGrayText    = GetSysColor(COLOR_GRAYTEXT);
        !           204: }
        !           205: 
        !           206: /*
        !           207:  *  MeasureItem
        !           208:  *  
        !           209:  *  Purpose:
        !           210:  *      called from msg WM_MEASUREITEM: returns max dy of listbox items
        !           211:  *  
        !           212:  *  Arguments:
        !           213:  *      HWND        hwnd of main window
        !           214:  *      pmis        measureitemstruct from WM_MEASUREITEM call
        !           215:  *  
        !           216:  *  Returns:
        !           217:  *      uh huh
        !           218:  */
        !           219: VOID
        !           220: MeasureItem(HANDLE hwnd, LPMEASUREITEMSTRUCT pmis)
        !           221: {
        !           222:     HDC        hDC = GetDC(hwnd);
        !           223:     HANDLE     hFont = hfontLB;
        !           224:     TEXTMETRIC TM;
        !           225: 
        !           226:     if(!hFont)
        !           227:         hFont = GetStockObject(SYSTEM_FONT);
        !           228:     hFont = SelectObject(hDC, hFont);
        !           229:     GetTextMetrics(hDC, &TM);
        !           230:     SelectObject(hDC, hFont);
        !           231:     ReleaseDC(hwnd, hDC);
        !           232: 
        !           233:     // set the height to be max of (dyfont or dybitmap)
        !           234:     pmis->itemHeight = max(dybmpLB, TM.tmHeight);
        !           235: }
        !           236: 
        !           237: /*
        !           238:  *  OutTextFormat
        !           239:  *  
        !           240:  *  Purpose:
        !           241:  *      to parse the string in the listbox and draw it accordingly:
        !           242:  *      first char == chBOLD: line is bold
        !           243:  *      first char == chUNDERLINE: line is underlined (can follow chBOLD)
        !           244:  *      char == chTAB: go to next column in rgTabs
        !           245:  *      '/001#': bitblt that numbered bitmap.
        !           246:  *      otherwise, outtext the line
        !           247:  *  
        !           248:  *  Arguments:
        !           249:  *      pDI     from DrawItem from WM_DRAWITEM msg
        !           250:  *  
        !           251:  *  Returns:
        !           252:  *      yessir
        !           253:  */
        !           254: VOID
        !           255: OutTextFormat(LPDRAWITEMSTRUCT pDI)
        !           256: {
        !           257:     static  TCHAR szItem[60];
        !           258:     TCHAR   *pch;
        !           259:     INT     nT;
        !           260:     INT     nTab = 0;           // current tab we is on
        !           261:     HFONT   hfDef = NULL;
        !           262:     HFONT   hfOld = NULL;       // bold or underlined font
        !           263:     TCHAR   *pchBuff = NULL;
        !           264: 
        !           265:     nT = (ListBox_GetTextLen(pDI->hwndItem, pDI->itemID) + 1) * sizeof(TCHAR);
        !           266:     if(nT == LB_ERR)
        !           267:         return;
        !           268: 
        !           269:     // if our quick buffer is big enough
        !           270:     if(nT > (sizeof(szItem) / sizeof(TCHAR)))
        !           271:     {
        !           272:         pchBuff = GlobalAllocPtr(GHND, nT);
        !           273:         if(!pchBuff)
        !           274:             return;
        !           275:         pch = pchBuff;
        !           276:     }
        !           277:     else
        !           278:     {
        !           279:         pch = szItem;
        !           280:     }
        !           281: 
        !           282:     //Get the text string for this item
        !           283:     ListBox_GetText(pDI->hwndItem, pDI->itemID, pch);
        !           284: 
        !           285:     // erase background
        !           286:     ExtTextOut(pDI->hDC, 0, 0, ETO_OPAQUE, &pDI->rcItem, NULL, 0, NULL);
        !           287: 
        !           288:     // underline or bold this line?  Only check first & second char
        !           289:     if(*pch == chBOLD || *pch == chUNDERLINE)
        !           290:     {
        !           291:         LOGFONT     lf;
        !           292: 
        !           293:         hfOld = GetWindowFont(pDI->hwndItem);
        !           294:         if(!hfOld)
        !           295:             hfOld = GetStockObject(SYSTEM_FONT);
        !           296:         GetObject(hfOld, sizeof(lf), &lf);
        !           297: 
        !           298:         if(*pch == chBOLD)
        !           299:         {
        !           300:             lf.lfWeight = FW_BOLD;
        !           301:             pch++;
        !           302:         }
        !           303:         if(*pch == chUNDERLINE)
        !           304:         {
        !           305:             lf.lfUnderline = TRUE;
        !           306:             pch++;
        !           307:         }
        !           308: 
        !           309:         hfDef = CreateFontIndirect(&lf);
        !           310:         if(hfDef)
        !           311:             SelectObject(pDI->hDC, hfDef);
        !           312:     }
        !           313: 
        !           314:     // selected or nonselected bmps?
        !           315:     nT = (ODS_SELECTED & pDI->itemState) ? (BMWIDTH * NUMBMPS) : 0;
        !           316: 
        !           317:     // parse the string
        !           318:     for(; *pch; pch++)
        !           319:     {
        !           320:         TCHAR   *pchT;
        !           321:         RECT    rc;
        !           322: 
        !           323:         if(*pch == chBITMAP)     // do we have a bitmap?
        !           324:         {
        !           325:             ++pch;
        !           326:             // draw the bitmap
        !           327:             BitBlt(pDI->hDC, pDI->rcItem.left + rgTabs[nTab],
        !           328:                 pDI->rcItem.top, BMWIDTH, BMHEIGHT, hdcMemory,
        !           329:                 nT + (int)(*pch - TEXT('0')) * BMWIDTH, 0, SRCCOPY);
        !           330:             continue;
        !           331:         }
        !           332: 
        !           333:         if(*pch == chTAB)    // move to next tabstop?
        !           334:         {
        !           335:             nTab++;
        !           336:             continue;
        !           337:         }
        !           338: 
        !           339:         pchT = pch;     // find end of the column of text
        !           340:         while(*pchT && (*pchT != chTAB))
        !           341:             pchT++;
        !           342: 
        !           343:         // set rect to drawtext in
        !           344:         SetRect(&rc, pDI->rcItem.left + rgTabs[nTab], pDI->rcItem.top, 
        !           345:             pDI->rcItem.right, pDI->rcItem.bottom);
        !           346: 
        !           347:         // draw the text
        !           348:         ExtTextOut(pDI->hDC, rc.left, rc.top + 1, ETO_OPAQUE | ETO_CLIPPED,
        !           349:             &rc, pch, pchT - pch, NULL);
        !           350:         pch = pchT - 1; // move to end of this column
        !           351:     }
        !           352: 
        !           353:     if(hfDef)   // delete underline or bold font if we created it
        !           354:     {
        !           355:         SelectObject(pDI->hDC, hfOld);
        !           356:         DeleteObject(hfDef);
        !           357:     }
        !           358: 
        !           359:     GlobalFreeNullPtr(pchBuff);
        !           360: }
        !           361: 
        !           362: /*
        !           363:  *  DrawItem
        !           364:  *
        !           365:  *  Purpose:
        !           366:  *      Handles WM_DRAWITEM for both drive and directory listboxes.
        !           367:  *
        !           368:  *  Parameters:
        !           369:  *      pDI     LPDRAWITEMSTRUCT passed from the WM_DRAWITEM message.
        !           370:  *
        !           371:  *  Return Value:
        !           372:  *      ya
        !           373:  */
        !           374: VOID
        !           375: DrawItem(LPDRAWITEMSTRUCT pDI)
        !           376: {
        !           377:     COLORREF    crText, crBack;
        !           378: 
        !           379:     if((int)pDI->itemID < 0)
        !           380:         return;
        !           381: 
        !           382:     if((ODA_DRAWENTIRE | ODA_SELECT) & pDI->itemAction)
        !           383:     {
        !           384:         if(pDI->itemState & ODS_SELECTED)
        !           385:         {
        !           386:             // Select the appropriate text colors
        !           387:             crText = SetTextColor(pDI->hDC, rgbHiliteText);
        !           388:             crBack = SetBkColor(pDI->hDC, rgbHiliteColor);
        !           389:         }
        !           390: 
        !           391:         // parse and spit out bmps and text
        !           392:         OutTextFormat(pDI);
        !           393: 
        !           394:         // Restore original colors if we changed them above.
        !           395:         if(pDI->itemState & ODS_SELECTED)
        !           396:         {
        !           397:             SetTextColor(pDI->hDC, crText);
        !           398:             SetBkColor(pDI->hDC,   crBack);
        !           399:         }
        !           400:     }
        !           401: 
        !           402:     if((ODA_FOCUS & pDI->itemAction) || (ODS_FOCUS & pDI->itemState))
        !           403:         DrawFocusRect(pDI->hDC, &pDI->rcItem);
        !           404: }
        !           405: 
        !           406: /*
        !           407:  *  RgbInvertRgb
        !           408:  *  
        !           409:  *  Purpose:
        !           410:  *      To reverse the byte order of the RGB value (for file format
        !           411:  *  
        !           412:  *  Arguments:
        !           413:  *  
        !           414:  *  Returns:
        !           415:  *      New color value (RGB to BGR)
        !           416:  */
        !           417: #define RgbInvertRgb(_rgbOld) \
        !           418:     (LONG)RGB(GetBValue(_rgbOld), GetGValue(_rgbOld), GetRValue(_rgbOld))
        !           419: 
        !           420: /*
        !           421:  *  LoadAlterBitmap (mostly stolen from commdlg)
        !           422:  *  
        !           423:  *  Purpose:
        !           424:  *      Loads the IDB_LB bitmap and gives all the pixels that are
        !           425:  *      RGBREPLACE a new color.
        !           426:  *
        !           427:  *  Assumption:
        !           428:  *      This function will work on one bitmap during it's lifetime.
        !           429:  *      (Due to the fact that it finds RGBREPLACE once and then
        !           430:  *      operates on that offset whenever called again because under NT,
        !           431:  *      it appears that the bitmap is cached, so the second time you go
        !           432:  *      looking for RGBREPLACE, it won't be found.) You could load the
        !           433:  *      resource, copy it, then modify the copy as a workaround. But I
        !           434:  *      chose the cheap way out as I will only ever modify one bmp.
        !           435:  *  
        !           436:  *  Arguments:
        !           437:  *      rgbInstead  rgb value to replace defined RGBREPLACE with
        !           438:  *  
        !           439:  *  Returns:
        !           440:  *      NULL - failed or hbmp of new modified bitmap
        !           441:  */
        !           442: HBITMAP
        !           443: LoadAlterBitmap(DWORD rgbInstead)
        !           444: {
        !           445:     static WORD         qlng = 0;   // offset into color table
        !           446:     HANDLE              hbmp = NULL;
        !           447:     LPBITMAPINFOHEADER  qbihInfo;
        !           448:     HDC                 hdcScreen;
        !           449:     HANDLE              hresLoad;
        !           450:     HANDLE              hres;
        !           451:     LPBYTE              qbBits;
        !           452:     DWORD               rgbReplace;
        !           453: 
        !           454:     // load our listbox bmps resource
        !           455:     hresLoad = FindResource(ghInst, MAKEINTRESOURCE(IDB_LB), RT_BITMAP);
        !           456:     if(hresLoad == NULL)
        !           457:         return NULL;
        !           458:     hres = LoadResource(ghInst, hresLoad);
        !           459:     if(hres == NULL)
        !           460:         return NULL;
        !           461: 
        !           462:     rgbReplace = RgbInvertRgb(RGBREPLACE);
        !           463:     rgbInstead = RgbInvertRgb(rgbInstead);
        !           464:     qbihInfo = (LPBITMAPINFOHEADER)LockResource(hres);
        !           465: 
        !           466:     // if we haven't found the color offset yet, find it
        !           467:     if(!qlng)
        !           468:     {
        !           469:         for(qlng = (WORD)qbihInfo->biSize; ; qlng += sizeof(DWORD))
        !           470:         {
        !           471:             if(*((LPBYTE)(qbihInfo) + qlng) == rgbReplace)
        !           472:                 break;
        !           473:         }
        !           474:     }
        !           475: 
        !           476:     // replace that color value with our new one
        !           477:     *(DWORD *)((LPBYTE)(qbihInfo) + qlng) = (DWORD)rgbInstead;
        !           478: 
        !           479:     // Skip over the header structure
        !           480:     qbBits = (LPBYTE)(qbihInfo + 1);
        !           481: 
        !           482:     // Skip the color table entries, if any
        !           483:     qbBits += (1 << (qbihInfo->biBitCount)) * sizeof(RGBQUAD);
        !           484: 
        !           485:     // Create a color bitmap compatible with the display device
        !           486:     hdcScreen = GetDC(NULL);
        !           487:     if(hdcScreen != NULL)
        !           488:     {
        !           489:         hbmp = CreateDIBitmap(hdcScreen, qbihInfo, (LONG)CBM_INIT,
        !           490:             qbBits, (LPBITMAPINFO) qbihInfo, DIB_RGB_COLORS);
        !           491:         ReleaseDC(NULL, hdcScreen);
        !           492:     }
        !           493: 
        !           494:     UnlockResource(hres);
        !           495:     FreeResource(hres);
        !           496: 
        !           497:     return hbmp;
        !           498: }
        !           499: 
        !           500: /*
        !           501:  *  DeleteBitmapLB
        !           502:  *  
        !           503:  *  Purpose:
        !           504:  *      Get rid of hbmpLB, if it exists
        !           505:  *  
        !           506:  *  Arguments:
        !           507:  *  
        !           508:  *  Returns:
        !           509:  *      Si senor
        !           510:  */
        !           511: VOID 
        !           512: DeleteBitmapLB(VOID)
        !           513: {
        !           514:     if(hbmpOrigMemBmp)
        !           515:     {
        !           516:         SelectObject(hdcMemory, hbmpOrigMemBmp);
        !           517:         if(hbmpLB != NULL)
        !           518:         {
        !           519:             DeleteObject(hbmpLB);
        !           520:             hbmpLB = NULL;
        !           521:         }
        !           522:     }
        !           523: }
        !           524: 
        !           525: /*
        !           526:  *  LoadBitmapLB (mostly stolen from commdlg)
        !           527:  *  
        !           528:  *  Purpose:
        !           529:  *      Creates the listbox bitmap. If an appropriate bitmap
        !           530:  *      already exists, it just returns immediately.  Otherwise, it
        !           531:  *      loads the bitmap and creates a larger bitmap with both regular
        !           532:  *      and highlight colors.
        !           533:  *
        !           534:  *  Arguments:
        !           535:  *  
        !           536:  *  Returns:
        !           537:  *      TRUE - success; FALSE - failure
        !           538:  */
        !           539: BOOL 
        !           540: LoadBitmapLB(VOID)
        !           541: {
        !           542:     BITMAP  bmp;
        !           543:     HANDLE  hbmp, hbmpOrig;
        !           544:     HDC     hdcTemp;
        !           545:     BOOL    bWorked = FALSE;
        !           546: 
        !           547:     // check for existing bitmap and validity
        !           548:     if( (hbmpLB != NULL) &&
        !           549:         (rgbWindowColor == rgbDDWindow) &&
        !           550:         (rgbHiliteColor == rgbDDHilite))
        !           551:     {
        !           552:         if(SelectObject(hdcMemory, hbmpLB))
        !           553:             return TRUE;
        !           554:     }
        !           555: 
        !           556:     DeleteBitmapLB();
        !           557: 
        !           558:     rgbDDWindow = rgbWindowColor;
        !           559:     rgbDDHilite = rgbHiliteColor;
        !           560: 
        !           561:     if(!(hdcTemp = CreateCompatibleDC(hdcMemory)))
        !           562:         goto LoadExit;
        !           563: 
        !           564:     if(!(hbmp = LoadAlterBitmap(rgbWindowColor)))
        !           565:         goto DeleteTempDC;
        !           566: 
        !           567:     GetObject(hbmp, sizeof(BITMAP), (LPBYTE) &bmp);
        !           568:     dybmpLB = bmp.bmHeight;
        !           569:     dxbmpLB = bmp.bmWidth;
        !           570: 
        !           571:     hbmpOrig = SelectObject(hdcTemp, hbmp);
        !           572: 
        !           573:     hbmpLB = CreateDiscardableBitmap(hdcTemp, dxbmpLB*2, dybmpLB);
        !           574:     if(!hbmpLB)
        !           575:         goto DeleteTempBmp;
        !           576: 
        !           577:     if(!SelectObject(hdcMemory, hbmpLB))
        !           578:     {
        !           579:         DeleteBitmapLB();
        !           580:         goto DeleteTempBmp;
        !           581:     }
        !           582: 
        !           583:     BitBlt(hdcMemory, 0, 0, dxbmpLB, dybmpLB,   // copy unhighlited bmps
        !           584:            hdcTemp, 0, 0, SRCCOPY);             // into hdcMemory
        !           585:     SelectObject(hdcTemp, hbmpOrig);
        !           586: 
        !           587:     DeleteObject(hbmp);
        !           588: 
        !           589:     if(!(hbmp = LoadAlterBitmap(rgbHiliteColor)))
        !           590:         goto DeleteTempDC;
        !           591: 
        !           592:     hbmpOrig = SelectObject(hdcTemp, hbmp);
        !           593:     BitBlt(hdcMemory, dxbmpLB, 0, dxbmpLB, dybmpLB, // copy highlited bmps
        !           594:         hdcTemp, 0, 0, SRCCOPY);                    // into hdcMemory
        !           595:     SelectObject(hdcTemp, hbmpOrig);
        !           596: 
        !           597:     bWorked = TRUE;
        !           598: 
        !           599: DeleteTempBmp:
        !           600:     DeleteObject(hbmp);
        !           601: DeleteTempDC:
        !           602:     DeleteDC(hdcTemp);
        !           603: LoadExit:
        !           604:     return bWorked;
        !           605: }
        !           606: 
        !           607: void
        !           608: BlitIcon(HDC hdc, LONG x, LONG y, int nBitmap)
        !           609: {
        !           610:     if(hdcMemory)
        !           611:     {
        !           612:         BitBlt(hdc, x, y, BMWIDTH, BMHEIGHT, hdcMemory,
        !           613:             BMWIDTH * nBitmap, 0, SRCCOPY);
        !           614:     }
        !           615: }

unix.superglobalmegacorp.com

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