Changeset 232 for trunk


Ignore:
Timestamp:
Aug 22, 2007, 5:22:01 PM (14 years ago)
Author:
Eugene Romanenko
Message:

better icon preview, double buffering

Location:
trunk/Lucide/SOURCE/gui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/SOURCE/gui/dialogs.rc

    r230 r232  
    243243                CONTROL "FDLG_DRIVE", DID_DRIVE_TXT, 5, 160, 36, 8, WC_STATIC, SS_TEXT | DT_LEFT | DT_TOP | WS_VISIBLE | WS_GROUP
    244244                PRESPARAMS PP_FONTNAMESIZE , "9.WarpSans"
    245                 CONTROL "", DID_DRIVE_CB, 43, 118, 83, 51, WC_COMBOBOX, CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
     245                CONTROL "", DID_DRIVE_CB, 43, 43, 83, 126, WC_COMBOBOX, CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
    246246                PRESPARAMS PP_FONTNAMESIZE , "9.WarpSans"
    247247                CONTROL "FDLG_FILETYPE", DID_FILTER_TXT, 135, 160, 42, 8, WC_STATIC, SS_TEXT | DT_LEFT | DT_TOP | WS_VISIBLE | WS_GROUP
  • trunk/Lucide/SOURCE/gui/lcdfdlg.cpp

    r231 r232  
    44#include <os2.h>
    55
    6 #include <stdio.h>
    76#include <string.h>
    87#include <stdlib.h>
     
    2625    HPS      hps;
    2726    HBITMAP  image;
     27    HBITMAP  mask;
    2828    char     *text;
     29    HPS      hpsBuffer;
     30    HDC      hdcBuffer;
    2931};
    3032
     
    4143            {
    4244                RECTL rect = {0};
     45                RECTL rcl = {0};
    4346                WinQueryWindowRect( hwnd, &rect );
     47                WinCopyRect( hab, &rcl, &rect );
    4448                HPS hps = WinBeginPaint( hwnd, 0L, 0L );
    45                 WinFillRect( hps, &rect, SYSCLR_WINDOWFRAME );
     49
     50                GpiSetColor( pd->hpsBuffer, SYSCLR_WINDOWTEXT );
     51                GpiSetBackColor( pd->hpsBuffer, SYSCLR_DIALOGBACKGROUND );
     52                WinFillRect( pd->hpsBuffer, &rect, SYSCLR_WINDOWFRAME );
    4653                rect.xLeft++;
    4754                rect.yBottom++;
    4855                rect.xRight--;
    4956                rect.yTop--;
    50                 WinFillRect( hps, &rect, SYSCLR_DIALOGBACKGROUND );
    51                 if ( pd->image == NULLHANDLE ) {
    52                     WinDrawText( hps, -1, pd->text, &rect, 0, 0,
     57                WinFillRect( pd->hpsBuffer, &rect, SYSCLR_DIALOGBACKGROUND );
     58                if ( pd->image == NULLHANDLE )
     59                {
     60                    WinDrawText( pd->hpsBuffer, -1, pd->text, &rect, 0, 0,
    5361                                 DT_TEXTATTRS | DT_CENTER | DT_VCENTER );
    5462                }
     
    5967                    bmi.cbFix = sizeof( BITMAPINFOHEADER );
    6068                    GpiQueryBitmapParameters( pd->image, &bmi );
    61                     //printf( "bmi.cx: %d,  bmi.cy: %d\n", bmi.cx, bmi.cy );
    6269                    LONG xPos = ( rect.xRight - bmi.cx ) / 2;
    6370                    LONG yPos = ( rect.yTop - bmi.cy ) / 2;
    64                     POINTL ptl = { xPos, yPos };
    65                     WinDrawBitmap( hps, pd->image, NULL, &ptl, 0, 0, DBM_NORMAL );
     71
     72                    if ( pd->mask != NULLHANDLE )
     73                    {
     74                        GpiQueryBitmapParameters( pd->mask, &bmi );
     75                        GpiSetColor( pd->hpsBuffer, SYSCLR_DIALOGBACKGROUND );
     76                        GpiSetBackColor( pd->hpsBuffer, CLR_BLACK );
     77                        POINTL aptl[ 4 ] = { { xPos, yPos },
     78                                             { xPos + bmi.cx, yPos + (bmi.cy / 2) },
     79                                             { 0, bmi.cy / 2 }, { bmi.cx + 1, bmi.cy + 1 } };
     80                        GpiWCBitBlt( pd->hpsBuffer, pd->mask, 4, aptl, ROP_SRCAND, BBO_IGNORE );
     81                    }
     82                    if ( pd->image != NULLHANDLE )
     83                    {
     84                        GpiQueryBitmapParameters( pd->image, &bmi );
     85                        POINTL aptl1[ 4 ] = { { xPos, yPos },
     86                                              { xPos + bmi.cx, yPos + bmi.cy },
     87                                              { 0, 0 }, { bmi.cx + 1, bmi.cy + 1 } };
     88                        if ( pd->mask == NULLHANDLE ) {
     89                            WinDrawBitmap( pd->hpsBuffer, pd->image, NULL, aptl1, 0, 0, DBM_NORMAL );
     90                        }
     91                        else {
     92                            GpiWCBitBlt( pd->hpsBuffer, pd->image, 4, aptl1, ROP_SRCPAINT, BBO_IGNORE );
     93                        }
     94                    }
    6695                }
     96                BlitGraphicsBuffer( hps, pd->hpsBuffer, &rcl );
    6797                WinEndPaint( hps );
    6898            }
     
    74104                GpiDeleteBitmap( pd->image );
    75105            }
     106            if ( pd->mask != NULLHANDLE ) {
     107                GpiDeleteBitmap( pd->mask );
     108            }
    76109            delete pd->text;
     110            DestroyGraphicsBuffer( pd->hpsBuffer, pd->hdcBuffer );
    77111            delete pd;
    78112            return (MRESULT)FALSE;
    79113    }
    80114    return pd->oldPvProc( hwnd, msg, mp1, mp2 );
    81 }
    82 
    83 static void previewImageCreate( HWND hwnd )
    84 {
    85     previewData *pd = new previewData;
    86     memset( pd, 0, sizeof( previewData ) );
    87     pd->oldPvProc = WinSubclassWindow( hwnd, PreviewProc );
    88     pd->text = newstrdupL( FDLG_NO_PREVIEW_AVAILABLE );
    89     WinSetWindowULong( hwnd, QWL_USER, (ULONG)pd );
    90     WinInvalidateRect( hwnd, NULL, FALSE );
    91115}
    92116
     
    102126    WinQueryWindowRect( hwnd, &rect );
    103127    WinSetWindowPos( hwnd, HWND_TOP, 0, 0, xRight + 8, rect.yTop, SWP_SIZE );
     128}
     129
     130static void previewImageCreate( HWND hwnd )
     131{
     132    previewData *pd = new previewData;
     133    memset( pd, 0, sizeof( previewData ) );
     134    RECTL rcl;
     135    WinQueryWindowRect( hwnd, &rcl );
     136    HPS hps = WinGetPS( hwnd );
     137    CreateGraphicsBuffer( hab, &rcl, hps, &pd->hpsBuffer, &pd->hdcBuffer );
     138    WinReleasePS( hps );
     139    pd->oldPvProc = WinSubclassWindow( hwnd, PreviewProc );
     140    pd->text = newstrdupL( FDLG_NO_PREVIEW_AVAILABLE );
     141    WinSetWindowULong( hwnd, QWL_USER, (ULONG)pd );
     142    WinInvalidateRect( hwnd, NULL, FALSE );
    104143}
    105144
     
    288327        }
    289328    }
    290     WinInvalidateRect( hwnd, NULL, FALSE );
    291329}
    292330
     
    399437}
    400438
    401 static HBITMAP IconBufferToBitmap( HWND hwnd, PBYTE pchIcon, USHORT usIconSize )
     439static BOOL IconBufferToBitmaps( HWND hwnd, PBYTE pchIcon, USHORT usIconSize,
     440                                 HBITMAP *clr, HBITMAP *ptr )
    402441{
    403442    static USHORT usDeviceCX = 0;
     
    409448    HPOINTER hptrIcon = NULLHANDLE;
    410449
    411     memset(&PointerInfo, 0, sizeof PointerInfo);
    412 
    413     if (!usDeviceCX)
    414     {
     450    memset( &PointerInfo, 0, sizeof PointerInfo );
     451
     452    if ( !usDeviceCX ) {
    415453        usDeviceCX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
    416454        usDeviceCY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
     
    435473            }
    436474            else
    437                 return NULLHANDLE;
     475                return FALSE;
    438476            break;
    439477        default :
    440             return NULLHANDLE;
     478            return FALSE;
    441479    }
    442480
     
    497535
    498536    if (!fIconFound)
    499         return NULLHANDLE;
    500 
    501     if ( PointerInfo.hbmPointer != NULLHANDLE ) {
    502         GpiDeleteBitmap(PointerInfo.hbmPointer);
    503     }
    504 
    505     return PointerInfo.hbmColor;
     537        return FALSE;
     538
     539    *clr = PointerInfo.hbmColor;
     540    *ptr = PointerInfo.hbmPointer;
     541
     542    return TRUE;
    506543}
    507544
     
    514551        pd->image = NULLHANDLE;
    515552    }
     553    if ( pd->mask != NULLHANDLE ) {
     554        GpiDeleteBitmap( pd->mask );
     555        pd->mask = NULLHANDLE;
     556    }
    516557    if ( pd->hps != NULLHANDLE ) {
    517558        GpiDestroyPS( pd->hps );
     
    522563        pd->hdc = NULLHANDLE;
    523564    }
    524     WinInvalidateRect( hwnd, NULL, FALSE );
    525565
    526566
     
    553593        if ( eadata != NULL )
    554594        {
    555             HBITMAP hbm = IconBufferToBitmap( hwnd, (PBYTE)eadata, ealen );
    556 
    557             previewData *pd = (previewData *)WinQueryWindowULong( hwnd, QWL_USER );
    558             pd->image = hbm;
    559             WinInvalidateRect( hwnd, NULL, FALSE );
    560 
     595            IconBufferToBitmaps( hwnd, (PBYTE)eadata, ealen, &pd->image, &pd->mask );
    561596            free( eadata );
    562597        }
    563598    }
    564 }
    565 
    566 
     599
     600    WinInvalidateRect( hwnd, NULL, FALSE );
     601}
     602
     603
Note: See TracChangeset for help on using the changeset viewer.