Changeset 402 for trunk/src


Ignore:
Timestamp:
Jul 27, 1999, 6:14:22 PM (26 years ago)
Author:
cbratschi
Message:

keyboard support and other updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/new/button.cpp

    r387 r402  
    1 /* $Id: button.cpp,v 1.9 1999-07-24 17:10:24 cbratschi Exp $ */
    2 /* File: button.c -- Button type widgets
    3  *
    4  * Copyright (c) 1999 Christoph Bratschi (ported from WINE)
     1/* $Id: button.cpp,v 1.10 1999-07-27 16:14:22 cbratschi Exp $ */
     2/* File: button.cpp -- Button type widgets
    53 *
    64 * Copyright (C) 1993 Johannes Ruscheinski
    75 * Copyright (C) 1993 David Metcalfe
    86 * Copyright (C) 1994 Alexandre Julliard
     7 * Copyright (c) 1999 Christoph Bratschi
    98 */
    109
    1110/* CB: todo
    1211   - update checkboxes.bmp to Win9x style
     12     + color and transparent mask
    1313*/
    1414
     
    3131static void OB_Paint(HWND hwnd,HDC hDC,WORD action);
    3232static void BUTTON_CheckAutoRadioButton(HWND hwnd);
     33static LRESULT BUTTON_LButtonDown(HWND hwnd,WPARAM wParam,LPARAM lParam);
    3334
    3435#define MAX_BTN_TYPE  12
     
    8889  switch (dwStyle & 0x0f)
    8990  {
     91    case BS_AUTOCHECKBOX:
     92    case BS_CHECKBOX:
     93     return DLGC_WANTCHARS | DLGC_BUTTON;
     94
    9095    case BS_PUSHBUTTON:
    91       return DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON;
     96      return DLGC_UNDEFPUSHBUTTON;
     97
    9298    case BS_DEFPUSHBUTTON:
    93       return DLGC_BUTTON | DLGC_DEFPUSHBUTTON;
     99      return DLGC_DEFPUSHBUTTON;
     100
     101    case BS_AUTORADIOBUTTON:
    94102    case BS_RADIOBUTTON:
    95     case BS_AUTORADIOBUTTON:
    96       return DLGC_BUTTON | DLGC_RADIOBUTTON;
     103      return DLGC_RADIOBUTTON;
     104
     105    case BS_GROUPBOX:;
     106      return DLGC_STATIC;
     107
    97108    default:
    98109      return DLGC_BUTTON;
     
    119130
    120131    hbitmapCheckBoxes = NativeLoadBitmap(0,MAKEINTRESOURCEA(OBM_CHECKBOXES));
    121     GetObjectA( hbitmapCheckBoxes, sizeof(bmp), &bmp );
    122     checkBoxWidth  = bmp.bmWidth / 4;
    123     checkBoxHeight = bmp.bmHeight / 3;
     132    if (GetObjectA(hbitmapCheckBoxes,sizeof(bmp),&bmp))
     133    {
     134      checkBoxWidth  = bmp.bmWidth / 4;
     135      checkBoxHeight = bmp.bmHeight / 3;
     136    } else checkBoxWidth = checkBoxHeight = 0;
    124137  }
    125138  if (style < 0L || style >= MAX_BTN_TYPE) return -1; /* abort */
     
    160173    (btnPaintFunc[style])(hwnd,hdc,ODA_DRAWENTIRE);
    161174    if(!wParam) EndPaint(hwnd,&ps);
     175  }
     176
     177  return 0;
     178}
     179
     180static LRESULT BUTTON_LButtonDblClk(HWND hwnd,WPARAM wParam,LPARAM lParam)
     181{
     182  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     183
     184  switch(dwStyle & 0x0f)
     185  {
     186    case BS_RADIOBUTTON:
     187    case BS_AUTORADIOBUTTON:
     188    case BS_OWNERDRAW:
     189      SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetWindowLongA(hwnd,GWL_ID),BN_DOUBLECLICKED),hwnd);
     190      break;
     191
     192    default:
     193      BUTTON_LButtonDown(hwnd,wParam,lParam);
     194      break;
    162195  }
    163196
     
    266299}
    267300
     301static LRESULT BUTTON_KeyDown(HWND hwnd,WPARAM wParam,LPARAM lParam)
     302{
     303  if (wParam == VK_SPACE)
     304  {
     305    SendMessageA(hwnd,BM_SETSTATE,TRUE,0);
     306    SetFocus(hwnd);
     307    SetCapture(hwnd);
     308  }
     309
     310  return 0;
     311}
     312
     313static LRESULT BUTTON_KeyUp(HWND hwnd,WPARAM wParam,LPARAM lParam)
     314{
     315  if (wParam == VK_SPACE)
     316  {
     317    BUTTONINFO* infoPtr = (BUTTONINFO*)GetInfoPtr(hwnd);
     318    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     319    DWORD id = GetWindowLongA(hwnd,GWL_ID);
     320
     321    ReleaseCapture();
     322    if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) return 0;
     323    SendMessageA(hwnd,BM_SETSTATE,FALSE,0);
     324
     325    switch(dwStyle & 0x0f)
     326    {
     327      case BS_AUTOCHECKBOX:
     328        SendMessageA(hwnd,BM_SETCHECK,!(infoPtr->state & BUTTON_CHECKED),0);
     329        break;
     330      case BS_AUTORADIOBUTTON:
     331        SendMessageA(hwnd,BM_SETCHECK,TRUE,0);
     332        break;
     333      case BS_AUTO3STATE:
     334        SendMessageA(hwnd,BM_SETCHECK,
     335                     (infoPtr->state & BUTTON_3STATE) ? 0 :
     336                     ((infoPtr->state & 3)+1),0);
     337        break;
     338    }
     339    SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(id,BN_CLICKED),hwnd);
     340  } else if (wParam != VK_TAB) ReleaseCapture();
     341
     342  return 0;
     343}
     344
     345static LRESULT BUTTON_SysKeyUp(HWND hwnd,WPARAM wParam,LPARAM lParam)
     346{
     347  if (wParam != VK_TAB) ReleaseCapture();
     348
     349  return 0;
     350}
     351
    268352static LRESULT BUTTON_SetFocus(HWND hwnd,WPARAM wParam,LPARAM lParam)
    269353{
     
    275359  {
    276360    SendMessageA(hwnd,BM_SETCHECK,1,0);
    277   }
     361    SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetWindowLongA(hwnd,GWL_ID),BN_CLICKED),hwnd);
     362  } else if (style == BS_RADIOBUTTON)
     363  {
     364    SendMessageA(GetParent(hwnd),WM_COMMAND,MAKEWPARAM(GetWindowLongA(hwnd,GWL_ID),BN_CLICKED),hwnd);
     365  }
     366
    278367  PAINT_BUTTON(hwnd,style,ODA_FOCUS);
    279368
     
    286375  DWORD style = GetWindowLongA(hwnd,GWL_STYLE) & 0x0f;
    287376
    288   infoPtr->state &= ~BUTTON_HASFOCUS;
    289   PAINT_BUTTON(hwnd,style,ODA_FOCUS);
    290   InvalidateRect(hwnd,NULL,TRUE);
     377  if (infoPtr->state & BUTTON_HASFOCUS)
     378  {
     379    infoPtr->state &= ~BUTTON_HASFOCUS;
     380    PAINT_BUTTON(hwnd,style,ODA_FOCUS);
     381    InvalidateRect(hwnd,NULL,TRUE);
     382  }
    291383
    292384  return 0;
     
    296388{
    297389  InvalidateRect(hwnd,NULL,FALSE);
     390
     391  return 0;
     392}
     393
     394static LRESULT BUTTON_Click(HWND hwnd,WPARAM wParam,LPARAM lParam)
     395{
     396  RECT rect;
     397  LPARAM point;
     398
     399  GetClientRect(hwnd,&rect);
     400  point = MAKELPARAM(rect.right/2,rect.bottom/2);
     401  SendMessageA(hwnd,WM_LBUTTONDOWN,0,point);
     402  Sleep(100);
     403  SendMessageA(hwnd,WM_LBUTTONUP,0,point);
    298404
    299405  return 0;
     
    417523      return BUTTON_Paint(hwnd,wParam,lParam);
    418524
     525    case WM_LBUTTONDBLCLK:
     526      return BUTTON_LButtonDblClk(hwnd,wParam,lParam);
     527
    419528    case WM_LBUTTONDOWN:
    420     case WM_LBUTTONDBLCLK:
    421529      return BUTTON_LButtonDown(hwnd,wParam,lParam);
    422530
     
    439547      return BUTTON_GetFont(hwnd,wParam,lParam);
    440548
     549    case WM_KEYDOWN:
     550      return BUTTON_KeyDown(hwnd,wParam,lParam);
     551
     552    case WM_KEYUP:
     553      return BUTTON_KeyUp(hwnd,wParam,lParam);
     554
     555    case WM_SYSKEYUP:
     556      return BUTTON_SysKeyUp(hwnd,wParam,lParam);
     557
    441558    case WM_SETFOCUS:
    442559      return BUTTON_SetFocus(hwnd,wParam,lParam);
     
    447564    case WM_SYSCOLORCHANGE:
    448565      return BUTTON_SysColorChange(hwnd,wParam,lParam);
     566
     567    case BM_CLICK:
     568      return BUTTON_Click(hwnd,wParam,lParam);
    449569
    450570    case BM_SETSTYLE:
     
    9101030
    9111031    ZeroMemory(&wndClass,sizeof(WNDCLASSA));
    912     wndClass.style         = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW | CS_PARENTDC;
     1032    wndClass.style         = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW | CS_PARENTDC | CS_DBLCLKS;
    9131033    wndClass.lpfnWndProc   = (WNDPROC)ButtonWndProc;
    9141034    wndClass.cbClsExtra    = 0;
Note: See TracChangeset for help on using the changeset viewer.