Ignore:
Timestamp:
Oct 30, 1999, 8:40:49 PM (26 years ago)
Author:
cbratschi
Message:

button, static, scroll and dialog fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/static.cpp

    r1433 r1525  
    1 /* $Id: static.cpp,v 1.7 1999-10-24 22:56:07 sandervl Exp $ */
     1/* $Id: static.cpp,v 1.8 1999-10-30 18:40:46 cbratschi Exp $ */
    22/*
    33 * Static control
    44 *
    5  * Copyright 1999 Christoph Bratschi (ported from WINE)
     5 * Copyright 1999 Christoph Bratschi
    66 *
    77 * Copyright  David W. Metcalfe, 1993
    88 *
    99 * WINE version: 990923
     10 *
     11 * Status:  complete
     12 * Version: 5.00
    1013 */
    1114
     
    2124static void STATIC_PaintIconfn( HWND hwnd, HDC hdc );
    2225static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc );
     26static void STATIC_PaintMetafilefn(HWND hwnd,HDC hdc);
     27static void STATIC_PaintOwnerDrawfn(HWND hwnd,HDC hdc);
    2328static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc );
    2429
     
    4045    STATIC_PaintRectfn,      /* SS_GRAYFRAME */
    4146    STATIC_PaintRectfn,      /* SS_WHITEFRAME */
    42     NULL,                    /* Not defined */
     47    NULL,                    /* SS_USERITEM */
    4348    STATIC_PaintTextfn,      /* SS_SIMPLE */
    4449    STATIC_PaintTextfn,      /* SS_LEFTNOWORDWRAP */
    45     NULL,                    /* SS_OWNERDRAW */
     50    STATIC_PaintOwnerDrawfn, /* SS_OWNERDRAW */
    4651    STATIC_PaintBitmapfn,    /* SS_BITMAP */
    47     NULL,                    /* SS_ENHMETAFILE */
     52    STATIC_PaintMetafilefn,  /* SS_ENHMETAFILE */
    4853    STATIC_PaintEtchedfn,    /* SS_ETCHEDHORIZ */
    4954    STATIC_PaintEtchedfn,    /* SS_ETCHEDVERT */
     
    5156};
    5257
     58static void STATIC_ResizeWindow(HWND hwnd,DWORD dwStyle,INT w,INT h)
     59{
     60  if (dwStyle & SS_RIGHTJUST)
     61  {
     62    RECT rect;
     63
     64    GetWindowRect(hwnd,&rect);
     65    SetWindowPos(hwnd,0,rect.right-w,rect.bottom-h,w,h,SWP_NOACTIVATE | SWP_NOZORDER);
     66  } else SetWindowPos(hwnd,0,0,0,w,h,SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);
     67}
    5368
    5469/***********************************************************************
     
    7186    infoPtr->hIcon = hicon;
    7287
    73     GetIconInfo(hicon,&ii);
     88    if (!GetIconInfo(hicon,&ii)) return prevIcon;
    7489    GetObjectA(ii.hbmColor,sizeof(BITMAP),(LPVOID)&bmp);
    7590
    76     SetWindowPos(hwnd,0,0,0,bmp.bmWidth,bmp.bmHeight,SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
     91    if (!(dwStyle & (SS_CENTERIMAGE | SS_REALSIZEIMAGE))) STATIC_ResizeWindow(hwnd,dwStyle,bmp.bmWidth,bmp.bmHeight);
    7792
    7893    return prevIcon;
     
    98113    hOldBitmap = infoPtr->hIcon;
    99114    infoPtr->hIcon = hBitmap;
    100     if (hBitmap)
     115    if (hBitmap && !(dwStyle & (SS_CENTERIMAGE | SS_REALSIZEIMAGE)))
    101116    {
    102         BITMAP bm;
    103         GetObjectA(hBitmap, sizeof(bm), &bm);
    104         SetWindowPos( hwnd, 0, 0, 0, bm.bmWidth, bm.bmHeight,
    105                       SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
     117      BITMAP bm;
     118
     119      GetObjectA(hBitmap,sizeof(bm),&bm);
     120      STATIC_ResizeWindow(hwnd,dwStyle,bm.bmWidth,bm.bmHeight);
    106121    }
     122
    107123    return hOldBitmap;
     124}
     125
     126static HENHMETAFILE STATIC_SetMetafile(HWND hwnd,HENHMETAFILE hMetafile)
     127{
     128  HENHMETAFILE hOldMetafile;
     129
     130  STATICINFO *infoPtr = (STATICINFO *)GetInfoPtr(hwnd);
     131  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     132
     133  if ((dwStyle & SS_TYPEMASK) != SS_ENHMETAFILE) return 0;
     134
     135  hOldMetafile = infoPtr->hIcon;
     136  infoPtr->hIcon = hMetafile;
     137
     138  return hOldMetafile;
    108139}
    109140
     
    142173}
    143174
     175static HBITMAP STATIC_LoadMetafile(HWND hwnd,LPCSTR name)
     176{
     177  HENHMETAFILE hMetafile;
     178
     179  hMetafile = GetEnhMetaFileA(name); //CB: right?
     180
     181  return hMetafile;
     182}
     183
    144184/* message handler */
    145185
    146186LRESULT STATIC_NCCreate(HWND hwnd,WPARAM wParam,LPARAM lParam)
    147187{
    148   CREATESTRUCTA *cs = (CREATESTRUCTA *)lParam;
     188  CREATESTRUCTA *cs = (CREATESTRUCTA*)lParam;
    149189  STATICINFO* infoPtr;
    150190  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     
    166206  if (style == SS_ICON)
    167207  {
    168     if (cs->lpszName)
     208    if (cs->lpszName) //CB: is 0 a valid icon id? winhlp32: lpszName = NULL
    169209    {
    170210      if (!HIWORD(cs->lpszName) || cs->lpszName[0])
     
    179219    return TRUE;
    180220  }
     221  if (style == SS_ENHMETAFILE)
     222  {
     223    if (cs->lpszName) STATIC_SetMetafile(hwnd,STATIC_LoadMetafile(hwnd,cs->lpszName));
     224    return TRUE;
     225  }
    181226  if (!HIWORD(cs->lpszName) && (cs->lpszName)) return TRUE;
    182227
     
    213258  {
    214259    DeleteObject(infoPtr->hIcon);
     260  } else if (style == SS_ENHMETAFILE && infoPtr->hIcon)
     261  {
     262    DeleteEnhMetaFile((HENHMETAFILE)infoPtr->hIcon);
    215263  }
    216264
     
    234282LRESULT STATIC_Enable(HWND hwnd,WPARAM wParam,LPARAM lParam)
    235283{
     284  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     285
     286  if (dwStyle & SS_NOTIFY) SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetWindowLongA(hwnd,GWL_ID),wParam ? STN_ENABLE:STN_DISABLE),hwnd);
     287
    236288  InvalidateRect(hwnd,NULL,FALSE);
    237289
     
    258310  else if (style == SS_BITMAP)
    259311    STATIC_SetBitmap(hwnd,STATIC_LoadBitmap(hwnd,(LPCSTR)lParam));
     312  else if (style == SS_ENHMETAFILE)
     313    STATIC_SetMetafile(hwnd,STATIC_LoadMetafile(hwnd,(LPCSTR)lParam));
    260314  else
    261315    DefWindowProcA(hwnd,WM_SETTEXT,wParam,lParam);
     
    274328  if (style == SS_ICON) return 0;
    275329  if (style == SS_BITMAP) return 0;
     330  if (style == SS_ENHMETAFILE) return 0;
    276331
    277332  infoPtr->hFont = (HFONT)wParam;
     
    310365}
    311366
     367LRESULT STATIC_GetImage(HWND hwnd,WPARAM wParam,LPARAM lParam)
     368{
     369  STATICINFO* infoPtr = (STATICINFO*)GetInfoPtr(hwnd);
     370  DWORD style = GetWindowLongA(hwnd,GWL_STYLE) & SS_TYPEMASK;
     371
     372  switch (wParam)
     373  {
     374    case IMAGE_BITMAP:
     375      if (style & SS_BITMAP) return infoPtr->hIcon;
     376      break;
     377
     378    case IMAGE_CURSOR:
     379    case IMAGE_ICON:
     380      if (style & SS_ICON) return infoPtr->hIcon;
     381      break;
     382
     383    case IMAGE_ENHMETAFILE:
     384      if (style & SS_ENHMETAFILE) return infoPtr->hIcon;
     385      break;
     386
     387    default:
     388      break;
     389  }
     390
     391  return 0;
     392}
     393
    312394LRESULT STATIC_SetImage(HWND hwnd,WPARAM wParam,LPARAM lParam)
    313395{
    314   LRESULT lResult;
     396  LRESULT lResult = 0;
    315397
    316398  switch (wParam)
     
    320402      lResult = STATIC_SetIcon(hwnd,(HICON)lParam);
    321403      break;
     404
    322405    case IMAGE_BITMAP:
    323406      lResult = STATIC_SetBitmap(hwnd,(HBITMAP)lParam);
     407      break;
     408
    324409    case IMAGE_ENHMETAFILE:
    325       return 0; //CB: not supported!
     410      lResult = STATIC_SetMetafile(hwnd,(HENHMETAFILE)lParam);
     411      break;
     412
    326413    default:
    327414      return 0;
    328415  }
    329416
     417  if (lResult) InvalidateRect(hwnd,NULL,FALSE);
     418
     419  return lResult;
     420}
     421
     422LRESULT STATIC_SetIconMsg(HWND hwnd,WPARAM wParam,LPARAM lParam)
     423{
     424  LRESULT lResult;
     425
     426  lResult = STATIC_SetIcon(hwnd,(HICON)wParam);
     427
    330428  InvalidateRect(hwnd,NULL,FALSE);
    331   UpdateWindow(hwnd);
    332429
    333430  return lResult;
    334431}
    335432
    336 LRESULT STATIC_SetIcon(HWND hwnd,WPARAM wParam,LPARAM lParam)
    337 {
    338   LRESULT lResult;
    339 
    340   lResult = STATIC_SetIcon(hwnd,(HICON)wParam);
    341 
    342   InvalidateRect(hwnd,NULL,FALSE);
    343   UpdateWindow(hwnd);
    344 
    345   return lResult;
     433LRESULT STATIC_Click(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
     434{
     435  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     436
     437  if (dwStyle & SS_NOTIFY) SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetWindowLongA(hwnd,GWL_ID),STN_CLICKED),hwnd);
     438
     439  return DefWindowProcA(hwnd,uMsg,wParam,lParam);
     440}
     441
     442LRESULT STATIC_DoubleClick(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
     443{
     444  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     445
     446  if (dwStyle & SS_NOTIFY) SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetWindowLongA(hwnd,GWL_ID),STN_DBLCLK),hwnd);
     447
     448  return DefWindowProcA(hwnd,uMsg,wParam,lParam);
    346449}
    347450
     
    386489      return STATIC_GetDlgCode(hwnd,wParam,lParam);
    387490
     491    case WM_LBUTTONDOWN:
     492    case WM_NCLBUTTONDOWN:
     493      return STATIC_Click(hwnd,uMsg,wParam,lParam);
     494
     495    case WM_LBUTTONDBLCLK:
     496    case WM_NCLBUTTONDBLCLK:
     497      return STATIC_DoubleClick(hwnd,uMsg,wParam,lParam);
     498
    388499    case STM_GETIMAGE:
     500      return STATIC_GetImage(hwnd,wParam,lParam);
     501
    389502    case STM_GETICON:
    390503      return STATIC_GetIcon(hwnd,wParam,lParam);
     
    394507
    395508    case STM_SETICON:
    396       return STATIC_SetIcon(hwnd,wParam,lParam);
     509      return STATIC_SetIconMsg(hwnd,wParam,lParam);
     510
     511    case STM_MSGMAX:
     512      return 0; //CB: undocumented!
    397513
    398514    default:
     
    411527    WORD wFormat;
    412528    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    413     LONG style = dwStyle;
    414529    STATICINFO *infoPtr = (STATICINFO *)GetInfoPtr(hwnd);
    415530    INT textLen;
     
    417532    GetClientRect(hwnd,&rc);
    418533
    419     switch (style & SS_TYPEMASK)
     534    switch (dwStyle & SS_TYPEMASK)
    420535    {
    421     case SS_LEFT:
     536      case SS_LEFT:
    422537        wFormat = DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
    423538        break;
    424539
    425     case SS_CENTER:
     540      case SS_CENTER:
     541      case SS_CENTERIMAGE:
    426542        wFormat = DT_CENTER | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
    427543        break;
    428544
    429     case SS_RIGHT:
     545      case SS_RIGHT:
    430546        wFormat = DT_RIGHT | DT_EXPANDTABS | DT_WORDBREAK | DT_NOCLIP;
    431547        break;
    432548
    433     case SS_SIMPLE:
     549      case SS_SIMPLE:
    434550        wFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOCLIP;
    435551        break;
    436552
    437     case SS_LEFTNOWORDWRAP:
     553      case SS_LEFTNOWORDWRAP:
    438554        wFormat = DT_LEFT | DT_EXPANDTABS | DT_VCENTER;
    439555        break;
    440556
    441     default:
     557      default:
    442558        return;
    443559    }
    444560
    445     if (style & SS_NOPREFIX)
    446         wFormat |= DT_NOPREFIX;
     561    if (dwStyle & SS_NOPREFIX) wFormat |= DT_NOPREFIX;
     562    if (dwStyle & SS_ENDELLIPSIS) wFormat |= DT_END_ELLIPSIS;
     563    if (dwStyle & SS_PATHELLIPSIS) wFormat |= DT_PATH_ELLIPSIS;
     564    if (dwStyle & SS_WORDELLIPSIS) wFormat |= DT_WORD_ELLIPSIS;
    447565
    448566    if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont );
     
    462580      text = (char*)malloc(textLen);
    463581      GetWindowTextA(hwnd,text,textLen);
    464       DrawTextA( hdc, text, -1, &rc, wFormat );
     582      DrawTextExA(hdc,text,-1,&rc,wFormat,NULL);
    465583      free(text);
    466584    }
     
    513631    HBRUSH hbrush;
    514632    STATICINFO *infoPtr = (STATICINFO *)GetInfoPtr(hwnd);
     633    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    515634
    516635    GetClientRect( hwnd, &rc );
     
    518637                             hdc, hwnd );
    519638    FillRect( hdc, &rc, hbrush );
    520     if (infoPtr->hIcon) DrawIcon( hdc, rc.left, rc.top, infoPtr->hIcon );
     639    if (dwStyle & SS_CENTERIMAGE)
     640    {
     641      ICONINFO ii;
     642      BITMAP bmp;
     643
     644      if (!GetIconInfo(infoPtr->hIcon,&ii)) return;
     645      GetObjectA(ii.hbmColor,sizeof(BITMAP),(LPVOID)&bmp);
     646      DrawIcon(hdc,(rc.right-bmp.bmWidth)/2,(rc.bottom-bmp.bmHeight)/2,infoPtr->hIcon);
     647    } else if (infoPtr->hIcon) DrawIcon(hdc,rc.left,rc.top,infoPtr->hIcon);
    521648}
    522649
     
    526653    HBRUSH hbrush;
    527654    STATICINFO *infoPtr = (STATICINFO *)GetInfoPtr(hwnd);
     655    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    528656    HDC hMemDC;
    529657    HBITMAP oldbitmap;
     
    544672        GetBitmapDimensionEx(infoPtr->hIcon, &sz);
    545673        oldbitmap = SelectObject(hMemDC, infoPtr->hIcon);
    546         BitBlt(hdc, sz.cx, sz.cy, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0,
    547                SRCCOPY);
     674        if (dwStyle & SS_CENTERIMAGE)
     675          BitBlt(hdc,sz.cx,sz.cy,bm.bmWidth,bm.bmHeight,hMemDC,(rc.right-bm.bmWidth)/2,(rc.bottom-bm.bmHeight)/2,SRCCOPY);
     676        else
     677          BitBlt(hdc,sz.cx,sz.cy,bm.bmWidth,bm.bmHeight,hMemDC,0,0,SRCCOPY);
    548678        SelectObject(hMemDC, oldbitmap);
    549679        DeleteDC(hMemDC);
     
    551681}
    552682
     683static void STATIC_PaintMetafilefn(HWND hwnd,HDC hdc)
     684{
     685    RECT rect;
     686    HBRUSH hbrush;
     687    STATICINFO *infoPtr = (STATICINFO *)GetInfoPtr(hwnd);
     688
     689    GetClientRect(hwnd,&rect);
     690    hbrush = SendMessageA(GetParent(hwnd),WM_CTLCOLORSTATIC,hdc,hwnd);
     691    FillRect(hdc,&rect,hbrush);
     692
     693    if (infoPtr->hIcon) PlayEnhMetaFile(hdc,(HENHMETAFILE)infoPtr->hIcon,&rect);
     694}
     695
     696static void STATIC_PaintOwnerDrawfn(HWND hwnd,HDC hdc)
     697{
     698  DRAWITEMSTRUCT di;
     699
     700  di.CtlType    = ODT_STATIC;
     701  di.CtlID      = GetWindowLongA(hwnd,GWL_ID);
     702  di.itemID     = 0;
     703  di.itemAction = ODA_DRAWENTIRE;
     704  di.itemState  = ODS_DEFAULT;
     705  di.hwndItem   = hwnd;
     706  di.hDC        = hdc;
     707  GetClientRect(hwnd,&di.rcItem);
     708  di.itemData   = 0;
     709
     710  SendMessageA(GetParent(hwnd),WM_DRAWITEM,GetWindowLongA(hwnd,GWL_ID),(LPARAM)&di);
     711}
    553712
    554713static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc )
Note: See TracChangeset for help on using the changeset viewer.