Changeset 808


Ignore:
Timestamp:
Sep 3, 1999, 5:09:46 PM (26 years ago)
Author:
sandervl
Message:

MDI child/client changes

Location:
trunk/src/user32/new
Files:
5 edited

Legend:

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

    r780 r808  
    1 /* $Id: user32.cpp,v 1.16 1999-09-01 19:12:21 phaller Exp $ */
     1/* $Id: user32.cpp,v 1.17 1999-09-03 15:09:44 sandervl Exp $ */
    22
    33/*
     
    11911191BOOL WIN32API SystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
    11921192{
    1193  BOOL rc;
     1193 BOOL rc = TRUE;
    11941194 NONCLIENTMETRICSA *cmetric = (NONCLIENTMETRICSA *)pvParam;
    11951195
     
    11971197    case SPI_SCREENSAVERRUNNING:
    11981198        *(BOOL *)pvParam = FALSE;
    1199         rc = TRUE;
    12001199        break;
    12011200    case SPI_GETDRAGFULLWINDOWS:
    12021201        *(BOOL *)pvParam = FALSE;
    1203         rc = TRUE;
    12041202        break;
    12051203    case SPI_GETNONCLIENTMETRICS:
     
    12251223        cmetric->iMenuWidth       = 32; //TODO
    12261224        cmetric->iMenuHeight      = GetSystemMetrics(SM_CYMENU);
    1227         rc = TRUE;
    1228         break;
     1225        break;
     1226    case SPI_GETICONTITLELOGFONT:
     1227        break;
     1228
     1229    case SPI_GETBORDER:
     1230        *(INT *)pvParam = GetSystemMetrics( SM_CXFRAME );
     1231        break;
     1232
     1233    case SPI_GETWORKAREA:
     1234        SetRect( (RECT *)pvParam, 0, 0,
     1235                GetSystemMetrics( SM_CXSCREEN ),
     1236                GetSystemMetrics( SM_CYSCREEN )
     1237        );
     1238        break;
     1239
    12291240    case 104: //TODO: Undocumented
    12301241        rc = 16;
  • TabularUnified trunk/src/user32/new/win32wbase.h

    r750 r808  
    1 /* $Id: win32wbase.h,v 1.2 1999-08-31 10:36:23 sandervl Exp $ */
     1/* $Id: win32wbase.h,v 1.3 1999-09-03 15:09:45 sandervl Exp $ */
    22/*
    33 * Win32 Window Base Class for OS/2
     
    157157         BOOL   SetWindowText(LPSTR lpsz);
    158158          BOOL  hasWindowName(LPSTR wndname, BOOL fUnicode = 0);
     159Win32WndClass  *getClass()  { return windowClass; };
     160        char   *getWindowNameA()              { return windowNameA; };
     161Win32BaseWindow *getOwner()                   { return owner; };
    159162
    160163       LRESULT  SendMessageA(ULONG msg, WPARAM wParam, LPARAM lParam);
     
    167170         void   NotifyParent(UINT Msg, WPARAM wParam, LPARAM lParam);
    168171
    169 Win32WndClass  *getClass()  { return windowClass; };
    170 
    171172    static HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter, LPSTR lpszClass, LPSTR lpszWindow,
    172173                             BOOL fUnicode = 0);
     
    199200       LRESULT  SendInternalMessageW(ULONG msg, WPARAM wParam, LPARAM lParam);
    200201        void    Init();
    201 
    202         char   *getWindowNameA()              { return windowNameA; };
    203202
    204203        HWND    OS2Hwnd;
  • TabularUnified trunk/src/user32/new/win32wmdichild.cpp

    r760 r808  
    1 /* $Id: win32wmdichild.cpp,v 1.2 1999-08-31 17:14:51 sandervl Exp $ */
     1/* $Id: win32wmdichild.cpp,v 1.3 1999-09-03 15:09:46 sandervl Exp $ */
    22/*
    33 * Win32 MDI Child Window Class for OS/2
     
    6262    {
    6363    case WM_SETTEXT:
    64             DefWindowProcA(Msg, wParam, lParam);
    65             menuModifyItem();
    66 #if 0   
     64        DefWindowProcA(Msg, wParam, lParam);
     65        menuModifyItem();
    6766        if( client->getMaximizedChild() == this )
    68                     MDI_UpdateFrameText( clientWnd->parent, ci->self, MDI_REPAINTFRAME, NULL );
    69 #endif 
    70             return 0;
     67                client->updateFrameText(MDI_REPAINTFRAME, NULL);
     68        return 0;
    7169
    7270    case WM_GETMINMAXINFO:
     
    7775
    7876    case WM_MENUCHAR:
    79             /* MDI children don't have menu bars */
    80             client->PostMessageA(WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (LPARAM)LOWORD(wParam) );
     77        /* MDI children don't have menu bars */
     78        client->PostMessageA(WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (LPARAM)LOWORD(wParam) );
    8179        return 0x00010000L;
    8280
    8381    case WM_CLOSE:
    84             client->SendMessageA(WM_MDIDESTROY,(WPARAM16)getWindowHandle(), 0L);
    85             return 0;
     82        client->SendMessageA(WM_MDIDESTROY,(WPARAM16)getWindowHandle(), 0L);
     83        return 0;
    8684
    8785    case WM_SETFOCUS:
    88             if(client->getActiveChild() != this )
    89                 client->childActivate(this);
     86        if(client->getActiveChild() != this )
     87            client->childActivate(this);
    9088        break;
    9189
    9290    case WM_CHILDACTIVATE:
    93             client->childActivate(this);
     91        client->childActivate(this);
    9492        return 0;
    9593
     
    9896
    9997    case WM_SYSCOMMAND:
    100             switch( wParam )
    101             {
    102                 case SC_MOVE:
     98        switch( wParam )
     99        {
     100        case SC_MOVE:
    103101            if( client->getMaximizedChild() == this)
    104102            {
     
    106104            }
    107105            break;
    108             case SC_RESTORE:
    109             case SC_MINIMIZE:
    110                 setStyle(getStyle() | WS_SYSMENU);
     106        case SC_RESTORE:
     107        case SC_MINIMIZE:
     108            setStyle(getStyle() | WS_SYSMENU);
    111109            break;
    112110
    113                 case SC_MAXIMIZE:
     111        case SC_MAXIMIZE:
    114112            if( client->getMaximizedChild() == this)
    115113            {
    116                           return client->SendMessageA(Msg, wParam, lParam);
     114                  return client->SendMessageA(Msg, wParam, lParam);
    117115            }
    118                 setStyle(getStyle() & ~WS_SYSMENU);
     116            setStyle(getStyle() & ~WS_SYSMENU);
    119117            break;
    120118
    121                 case SC_NEXTWINDOW:
    122                      client->SendMessageA(WM_MDINEXT, 0, 0);
    123                      return 0;
    124 
    125                 case SC_PREVWINDOW: //WM_MDINEXT??
    126                      client->SendMessageA(WM_MDINEXT, 0, 0);
    127                      return 0;
    128             }
     119        case SC_NEXTWINDOW:
     120             client->SendMessageA(WM_MDINEXT, 0, 0);
     121             return 0;
     122
     123        case SC_PREVWINDOW: //WM_MDINEXT??
     124             client->SendMessageA(WM_MDINEXT, 0, 0);
     125             return 0;
     126        }
    129127        break;
    130128
    131129    case WM_SETVISIBLE:
     130        if( client->getMaximizedChild()) {
     131                client->setMdiFlags(client->getMdiFlags() & ~MDIF_NEEDUPDATE);
     132        }
     133        else    client->postUpdate(SB_BOTH+1);
     134        break;
     135
     136    case WM_SIZE:
     137        /* do not change */
     138        if( client->getActiveChild() == this && wParam != SIZE_MAXIMIZED )
     139        {
     140            client->setActiveChild(NULL);
    132141#if 0
    133         if( client->getMaximizedChild()) ci->mdiFlags &= ~MDIF_NEEDUPDATE;
    134             else
    135             MDI_PostUpdate(clientWnd->hwndSelf, ci, SB_BOTH+1);
     142            MDI_RestoreFrameMenu( clientWnd->parent, hwnd);
    136143#endif
    137         break;
    138 
    139 #if 0           
    140     case WM_SIZE:
    141             /* do not change */
    142 
    143             if( ci->hwndActiveChild == hwnd && wParam != SIZE_MAXIMIZED )
    144             {
    145                 ci->hwndChildMaximized = 0;
    146        
    147                 MDI_RestoreFrameMenu( clientWnd->parent, hwnd);
    148             MDI_UpdateFrameText( clientWnd->parent, ci->self,
    149                                  MDI_REPAINTFRAME, NULL );
    150             }
    151 
    152             if( wParam == SIZE_MAXIMIZED )
    153             {
    154                 HWND16 hMaxChild = ci->hwndChildMaximized;
    155 
    156                 if( hMaxChild == hwnd ) break;
    157 
    158                 if( hMaxChild)
    159                 {       
    160                     SendMessage16( hMaxChild, WM_SETREDRAW, FALSE, 0L );
    161 
    162                     MDI_RestoreFrameMenu( clientWnd->parent, hMaxChild);
    163                     ShowWindow16( hMaxChild, SW_SHOWNOACTIVATE);
    164 
    165                     SendMessage16( hMaxChild, WM_SETREDRAW, TRUE, 0L );
    166                 }
    167 
    168                 ci->hwndChildMaximized = hwnd; /* !!! */
    169                 ci->hwndActiveChild = hwnd;
    170 
    171                 MDI_AugmentFrameMenu( ci, clientWnd->parent, hwnd);
    172                 MDI_UpdateFrameText( clientWnd->parent, ci->self,
    173                                  MDI_REPAINTFRAME, NULL );
    174             }
    175 
    176             if( wParam == SIZE_MINIMIZED )
    177             {
    178                 HWND16 switchTo = MDI_GetWindow(clientWnd, hwnd, TRUE, WS_MINIMIZE);
    179 
    180                 if( switchTo )
    181                     SendMessage16( switchTo, WM_CHILDACTIVATE, 0, 0L);
    182             }
    183        
    184             MDI_PostUpdate(clientWnd->hwndSelf, ci, SB_BOTH+1);
    185             break;
     144            client->updateFrameText(MDI_REPAINTFRAME, NULL );
     145        }
     146
     147        if( wParam == SIZE_MAXIMIZED )
     148        {
     149            Win32MDIChildWindow *maxChild = client->getMaximizedChild();
     150
     151            if( maxChild == this ) break;
     152
     153            if( maxChild)
     154            {
     155                maxChild->SendMessageA(WM_SETREDRAW, FALSE, 0L );
     156#if 0
     157                MDI_RestoreFrameMenu( clientWnd->parent, hMaxChild);
    186158#endif
     159                maxChild->ShowWindow(SW_SHOWNOACTIVATE);
     160
     161                maxChild->SendMessageA(WM_SETREDRAW, TRUE, 0L );
     162            }
     163
     164            client->setMaximizedChild(this);
     165            client->setActiveChild(this);
     166
     167#if 0
     168            MDI_AugmentFrameMenu( ci, clientWnd->parent, hwnd);
     169#endif
     170            client->updateFrameText(MDI_REPAINTFRAME, NULL );
     171        }
     172
     173        if( wParam == SIZE_MINIMIZED )
     174        {
     175            Win32MDIChildWindow *switchTo = client->getWindow(this, TRUE, WS_MINIMIZE);
     176
     177            if( switchTo )
     178                switchTo->SendMessageA(WM_CHILDACTIVATE, 0, 0L);
     179        }
     180
     181        client->postUpdate(SB_BOTH+1);
     182        break;
    187183
    188184#if 0
    189185    case WM_NEXTMENU:
    190             if( wParam == VK_LEFT )             /* switch to frame system menu */
     186        if( wParam == VK_LEFT )     /* switch to frame system menu */
    191187        {
    192188            return MAKELONG( GetSubMenu(clientWnd->parent->hSysMenu, 0),
    193                            clientWnd->parent->hwndSelf );
     189               clientWnd->parent->hwndSelf );
    194190            goto END;
    195191        }
    196             if( wParam == VK_RIGHT )    /* to frame menu bar */
     192        if( wParam == VK_RIGHT )    /* to frame menu bar */
    197193        {
    198194            retvalue = MAKELONG( clientWnd->parent->wIDmenu,
    199                            clientWnd->parent->hwndSelf );
     195               clientWnd->parent->hwndSelf );
    200196            goto END;
    201197        }
    202198#endif
    203199    case WM_SYSCHAR:
    204             if (wParam == '-')
    205             {
    206                     SendMessageA(WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
    207                     return 0;
    208             }
     200        if (wParam == '-')
     201        {
     202            SendMessageA(WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
     203            return 0;
     204        }
    209205    }
    210206    return DefWindowProcA(Msg, wParam, lParam);
     
    214210LRESULT Win32MDIChildWindow::DefMDIChildProcW(UINT Msg, WPARAM wParam, LPARAM lParam)
    215211{
     212 Win32MDIClientWindow *client = (Win32MDIClientWindow *)getParent();
     213
    216214    switch (Msg)
    217215    {
    218216    case WM_SETTEXT:
    219             DefWindowProcW(Msg, wParam, lParam);
    220             menuModifyItem();
    221 #if 0   
    222             if( client->getMaximizedChild() == this )
    223                     MDI_UpdateFrameText( clientWnd->parent, ci->self, MDI_REPAINTFRAME, NULL );
    224 #endif 
    225             return 0;
    226        
     217        DefWindowProcW(Msg, wParam, lParam);
     218        menuModifyItem();
     219        if( client->getMaximizedChild() == this )
     220                client->updateFrameText(MDI_REPAINTFRAME, NULL );
     221
     222        return 0;
     223
    227224    case WM_GETMINMAXINFO:
    228225    case WM_MENUCHAR:
     
    236233    case WM_NEXTMENU:
    237234        return DefMDIChildProcA(Msg, wParam, lParam );
    238        
     235
    239236    case WM_SYSCHAR:
    240237        if (wParam == '-')
    241             {
    242                     SendMessageW(WM_SYSCOMMAND, SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
    243                     return 0;
    244             }
    245             break;
     238        {
     239            SendMessageW(WM_SYSCOMMAND, SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
     240            return 0;
     241        }
     242        break;
    246243    }
    247244    return DefWindowProcW(Msg, wParam, lParam);
     
    338335#if 0
    339336                    MDI_AugmentFrameMenu( ci, w->parent, hwnd );
    340                     MDI_UpdateFrameText( w->parent, ci->self, MDI_REPAINTFRAME, NULL );
     337                    client->updateFrameText(MDI_REPAINTFRAME, NULL );
    341338#endif
    342339                }
  • TabularUnified trunk/src/user32/new/win32wmdiclient.cpp

    r760 r808  
    1 /* $Id: win32wmdiclient.cpp,v 1.3 1999-08-31 17:14:52 sandervl Exp $ */
     1/* $Id: win32wmdiclient.cpp,v 1.4 1999-09-03 15:09:46 sandervl Exp $ */
    22/*
    33 * Win32 MDI Client Window Class for OS/2
     
    5151    idFirstChild       = 0;
    5252    hWindowMenu        = 0;
     53    sbRecalc           = 0;
    5354}
    5455//******************************************************************************
     
    5657Win32MDIClientWindow::~Win32MDIClientWindow()
    5758{
     59    if(frameTitle)
     60        HeapFree(GetProcessHeap(), 0, frameTitle);
    5861}
    5962//******************************************************************************
     
    9295        setStyle(getStyle() | WS_CLIPCHILDREN);
    9396
    94 //        MDI_UpdateFrameText(frameWnd, hwnd, MDI_NOFRAMEREPAINT,frameWnd->text);
     97        updateFrameText(MDI_NOFRAMEREPAINT, getParent()->getWindowNameA());
    9598
    9699        AppendMenuA( hWindowMenu, MF_SEPARATOR, 0, NULL );
     
    140143
    141144    case WM_MDIDESTROY:
    142 //        retvalue = MDIDestroyChild( w, ci, hwnd, (HWND)wParam, TRUE );
     145        mdichild = (Win32MDIChildWindow *)GetWindowFromHandle((HWND)wParam);
     146        if(mdichild) {
     147            retvalue = destroyChild(mdichild, TRUE );
     148        }
    143149        goto END;
    144150
     
    166172
    167173    case WM_MDINEXT: /* lParam != 0 means previous window */
    168 //        MDI_SwitchActiveChild(hwnd, (HWND)wParam, (lParam)? FALSE : TRUE );
     174        mdichild = (Win32MDIChildWindow *)GetWindowFromHandle((HWND)wParam);
     175        if(mdichild) {
     176            switchActiveChild(mdichild, (lParam)? FALSE : TRUE );
     177        }
    169178        break;
     179
    170180
    171181    case WM_MDIRESTORE:
     
    243253            ::MoveWindow(maximizedChild->getWindowHandle(), rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 1);
    244254        }
    245 #if 0
    246         else
    247             MDI_PostUpdate(hwnd, ci, SB_BOTH+1);
    248 #endif
     255        else postUpdate(SB_BOTH+1);
    249256        break;
    250257
     
    281288    }
    282289    return window->MDIClientWndProc(message, wParam, lParam);
     290}
     291/**********************************************************************
     292 *                      MDI_GetWindow
     293 *
     294 * returns "activateable" child different from the current or zero
     295 */
     296Win32MDIChildWindow *Win32MDIClientWindow::getWindow(Win32MDIChildWindow *actchild, BOOL bNext,
     297                                                     DWORD dwStyleMask)
     298{
     299 Win32MDIChildWindow *lastchild = 0, *curchild;
     300
     301    dwStyleMask |= WS_DISABLED | WS_VISIBLE;
     302
     303    if( !actchild ) actchild = getActiveChild();
     304    if( !actchild)  return 0;
     305
     306    for ( curchild = (Win32MDIChildWindow *)actchild->getNextChild(); ; curchild = (Win32MDIChildWindow *)curchild->getNextChild())
     307    {
     308        if (!curchild ) curchild = (Win32MDIChildWindow *)getFirstChild();
     309
     310        if ( curchild == actchild ) break; /* went full circle */
     311
     312        if (!curchild->getOwner() && (curchild->getStyle() & dwStyleMask) == WS_VISIBLE )
     313        {
     314                lastchild = curchild;
     315                if ( bNext ) break;
     316        }
     317    }
     318    return lastchild;
    283319}
    284320/**********************************************************************
     
    406442            {
    407443//                MDI_RestoreFrameMenu(w_parent->parent, child);
    408                   setMaximizedChild(NULL);
    409 //                MDI_UpdateFrameText(w_parent->parent,parent,TRUE,NULL);
     444                setMaximizedChild(NULL);
     445                updateFrameText(TRUE,NULL);
    410446            }
    411447            childActivate(0);
     
    426462    return 0;
    427463}
     464/**********************************************************************
     465 *                      MDI_UpdateFrameText
     466 *
     467 * used when child window is maximized/restored
     468 *
     469 * Note: lpTitle can be NULL
     470 */
     471void Win32MDIClientWindow::updateFrameText(BOOL repaint, LPCSTR lpTitle )
     472{
     473    char   lpBuffer[MDI_MAXTITLELENGTH+1];
     474
     475    /* store new "default" title if lpTitle is not NULL */
     476    if (lpTitle)
     477    {
     478        if (frameTitle) HeapFree( GetProcessHeap(), 0, frameTitle );
     479        frameTitle = HEAP_strdupA( GetProcessHeap(), 0, lpTitle );
     480    }
     481
     482    if (frameTitle)
     483    {
     484        Win32MDIChildWindow *childWnd = getMaximizedChild();
     485
     486        if( childWnd && childWnd->getWindowNameA() )
     487        {
     488            /* combine frame title and child title if possible */
     489
     490            LPCSTR lpBracket  = " - [";
     491            int i_frame_text_length = strlen(frameTitle);
     492            int i_child_text_length = strlen(childWnd->getWindowNameA());
     493
     494            lstrcpynA( lpBuffer, frameTitle, MDI_MAXTITLELENGTH);
     495
     496            if( i_frame_text_length + 6 < MDI_MAXTITLELENGTH )
     497            {
     498                strcat( lpBuffer, lpBracket );
     499
     500                if( i_frame_text_length + i_child_text_length + 6 < MDI_MAXTITLELENGTH )
     501                {
     502                    strcat( lpBuffer, childWnd->getWindowNameA());
     503                    strcat( lpBuffer, "]" );
     504                }
     505                else
     506                {
     507                    lstrcpynA(lpBuffer + i_frame_text_length + 4,
     508                              childWnd->getWindowNameA(), MDI_MAXTITLELENGTH - i_frame_text_length - 5 );
     509                    strcat( lpBuffer, "]" );
     510                }
     511            }
     512        }
     513        else
     514        {
     515            strncpy(lpBuffer, frameTitle, MDI_MAXTITLELENGTH );
     516            lpBuffer[MDI_MAXTITLELENGTH]='\0';
     517        }
     518    }
     519    else
     520    lpBuffer[0] = '\0';
     521
     522    getParent()->SetWindowText(lpBuffer);
     523    if( repaint == MDI_REPAINTFRAME)
     524        getParent()->SetWindowPos(0,0,0,0,0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER );
     525}
     526#if 0
     527/**********************************************************************
     528 *                              MDICascade
     529 */
     530LONG Win32MDIClientWindow::cascade()
     531{
     532    WND**       ppWnd;
     533    UINT        total;
     534
     535    if (getMaximizedChild())
     536        SendMessageA(WM_MDIRESTORE, (WPARAM)getMaximizedChild()->getWindowHandle(), 0);
     537
     538    if (nActiveChildren == 0) return 0;
     539
     540    if ((ppWnd = WIN_BuildWinArray(clientWnd, BWA_SKIPHIDDEN | BWA_SKIPOWNED |
     541                                              BWA_SKIPICONIC, &total)))
     542    {
     543            WND**       heapPtr = ppWnd;
     544            if( total )
     545            {
     546            INT delta = 0, n = 0;
     547            POINT       pos[2];
     548            if( total < ci->nActiveChildren )
     549                delta = GetSystemMetrics(SM_CYICONSPACING) +
     550                GetSystemMetrics(SM_CYICON);
     551
     552                /* walk the list (backwards) and move windows */
     553            while (*ppWnd) ppWnd++;
     554                    while (ppWnd != heapPtr)
     555                    {
     556                    ppWnd--;
     557
     558                        MDI_CalcDefaultChildPos(clientWnd, n++, pos, delta);
     559                            SetWindowPos( (*ppWnd)->hwndSelf, 0, pos[0].x, pos[0].y,
     560                                pos[1].x, pos[1].y,
     561                                SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
     562                    }
     563            }
     564            WIN_ReleaseWinArray(heapPtr);
     565    }
     566
     567    if( total < ci->nActiveChildren )
     568        ArrangeIconicWindows( clientWnd->hwndSelf );
     569
     570    return 0;
     571}
     572
     573/**********************************************************************
     574 *                                      MDITile
     575 */
     576void Win32MDIClientWindow::MDITile(WPARAM wParam )
     577{
     578    WND**       ppWnd;
     579    UINT        total = 0;
     580
     581    if (getMaximizedChild())
     582        SendMessageA(WM_MDIRESTORE, (WPARAM)getMaximizedChild()->getWindowHandle(), 0);
     583
     584    if (nActiveChildren == 0) return;
     585
     586    ppWnd = WIN_BuildWinArray(wndClient, BWA_SKIPHIDDEN | BWA_SKIPOWNED | BWA_SKIPICONIC |
     587                ((wParam & MDITILE_SKIPDISABLED)? BWA_SKIPDISABLED : 0), &total );
     588
     589    TRACE("%u windows to tile\n", total);
     590
     591    if( ppWnd )
     592    {
     593        WND**   heapPtr = ppWnd;
     594
     595            if( total )
     596            {
     597            RECT        rect;
     598            int         x, y, xsize, ysize;
     599            int         rows, columns, r, c, i;
     600
     601            GetClientRect(wndClient->hwndSelf,&rect);
     602            rows    = (int) sqrt((double)total);
     603            columns = total / rows;
     604
     605            if( wParam & MDITILE_HORIZONTAL )  /* version >= 3.1 */
     606            {
     607                i = rows;
     608                rows = columns;  /* exchange r and c */
     609                columns = i;
     610            }
     611
     612            if( total != ci->nActiveChildren)
     613            {
     614                y = rect.bottom - 2 * GetSystemMetrics(SM_CYICONSPACING) - GetSystemMetrics(SM_CYICON);
     615                rect.bottom = ( y - GetSystemMetrics(SM_CYICON) < rect.top )? rect.bottom: y;
     616            }
     617
     618                ysize   = rect.bottom / rows;
     619            xsize   = rect.right  / columns;
     620
     621            for (x = i = 0, c = 1; c <= columns && *ppWnd; c++)
     622            {
     623                if (c == columns)
     624                        {
     625                        rows  = total - i;
     626                            ysize = rect.bottom / rows;
     627                        }
     628
     629                        y = 0;
     630                        for (r = 1; r <= rows && *ppWnd; r++, i++)
     631                        {
     632                            SetWindowPos((*ppWnd)->hwndSelf, 0, x, y, xsize, ysize,
     633                                        SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
     634                            y += ysize;
     635                            ppWnd++;
     636                        }
     637                        x += xsize;
     638                }
     639        }
     640        WIN_ReleaseWinArray(heapPtr);
     641    }
     642
     643    if( total < ci->nActiveChildren ) ArrangeIconicWindows( wndClient->hwndSelf );
     644}
     645
     646/* ----------------------- Frame window ---------------------------- */
     647
     648/**********************************************************************
     649 *                                      MDI_AugmentFrameMenu
     650 */
     651BOOL Win32MDIClientWindow::augmentFrameMenu(HWND hChild )
     652{
     653    WND*        child = WIN_FindWndPtr(hChild);
     654    HMENU       hSysPopup = 0;
     655    HBITMAP hSysMenuBitmap = 0;
     656
     657    if( !frame->wIDmenu || !child->hSysMenu )
     658    {
     659        WIN_ReleaseWndPtr(child);
     660        return 0;
     661    }
     662    WIN_ReleaseWndPtr(child);
     663
     664    /* create a copy of sysmenu popup and insert it into frame menu bar */
     665
     666    if (!(hSysPopup = LoadMenuA(GetModuleHandleA("USER32"), "SYSMENU")))
     667        return 0;
     668
     669    TRACE("\tgot popup %04x in sysmenu %04x\n",
     670                hSysPopup, child->hSysMenu);
     671
     672    AppendMenuA(frame->wIDmenu,MF_HELP | MF_BITMAP,
     673                   SC_MINIMIZE, (LPSTR)(DWORD)HBMMENU_MBAR_MINIMIZE ) ;
     674    AppendMenuA(frame->wIDmenu,MF_HELP | MF_BITMAP,
     675                   SC_RESTORE, (LPSTR)(DWORD)HBMMENU_MBAR_RESTORE );
     676
     677  /* In Win 95 look, the system menu is replaced by the child icon */
     678
     679  if(TWEAK_WineLook > WIN31_LOOK)
     680  {
     681    HICON hIcon = GetClassLongA(hChild, GCL_HICONSM);
     682    if (!hIcon)
     683      hIcon = GetClassLongA(hChild, GCL_HICON);
     684    if (hIcon)
     685    {
     686      HDC hMemDC;
     687      HBITMAP hBitmap, hOldBitmap;
     688      HBRUSH hBrush;
     689      HDC hdc = GetDC(hChild);
     690
     691      if (hdc)
     692      {
     693        int cx, cy;
     694        cx = GetSystemMetrics(SM_CXSMICON);
     695        cy = GetSystemMetrics(SM_CYSMICON);
     696        hMemDC = CreateCompatibleDC(hdc);
     697        hBitmap = CreateCompatibleBitmap(hdc, cx, cy);
     698        hOldBitmap = SelectObject(hMemDC, hBitmap);
     699        SetMapMode(hMemDC, MM_TEXT);
     700        hBrush = CreateSolidBrush(GetSysColor(COLOR_MENU));
     701        DrawIconEx(hMemDC, 0, 0, hIcon, cx, cy, 0, hBrush, DI_NORMAL);
     702        SelectObject (hMemDC, hOldBitmap);
     703        DeleteObject(hBrush);
     704        DeleteDC(hMemDC);
     705        ReleaseDC(hChild, hdc);
     706        hSysMenuBitmap = hBitmap;
     707      }
     708    }
     709  }
     710  else
     711    hSysMenuBitmap = hBmpClose;
     712
     713    if( !InsertMenuA(frame->wIDmenu,0,MF_BYPOSITION | MF_BITMAP | MF_POPUP,
     714                    hSysPopup, (LPSTR)(DWORD)hSysMenuBitmap))
     715    {
     716        TRACE("not inserted\n");
     717        DestroyMenu(hSysPopup);
     718        return 0;
     719    }
     720
     721    /* The close button is only present in Win 95 look */
     722    if(TWEAK_WineLook > WIN31_LOOK)
     723    {
     724        AppendMenuA(frame->wIDmenu,MF_HELP | MF_BITMAP,
     725                       SC_CLOSE, (LPSTR)(DWORD)HBMMENU_MBAR_CLOSE );
     726    }
     727
     728    EnableMenuItem(hSysPopup, SC_SIZE, MF_BYCOMMAND | MF_GRAYED);
     729    EnableMenuItem(hSysPopup, SC_MOVE, MF_BYCOMMAND | MF_GRAYED);
     730    EnableMenuItem(hSysPopup, SC_MAXIMIZE, MF_BYCOMMAND | MF_GRAYED);
     731    SetMenuDefaultItem(hSysPopup, SC_CLOSE, FALSE);
     732
     733    /* redraw menu */
     734    DrawMenuBar(frame->hwndSelf);
     735
     736    return 1;
     737}
     738
     739/**********************************************************************
     740 *                                      MDI_RestoreFrameMenu
     741 */
     742static BOOL MDI_RestoreFrameMenu( WND *frameWnd, HWND hChild )
     743{
     744    MENUITEMINFOA menuInfo;
     745    INT nItems = GetMenuItemCount(frameWnd->wIDmenu) - 1;
     746    UINT iId = GetMenuItemID(frameWnd->wIDmenu,nItems) ;
     747
     748    TRACE("frameWnd %p,child %04x\n",frameWnd,hChild);
     749
     750    if(!(iId == SC_RESTORE || iId == SC_CLOSE) )
     751        return 0;
     752
     753    /*
     754     * Remove the system menu, If that menu is the icon of the window
     755     * as it is in win95, we have to delete the bitmap.
     756     */
     757    menuInfo.cbSize = sizeof(MENUITEMINFOA);
     758    menuInfo.fMask  = MIIM_DATA | MIIM_TYPE;
     759
     760    GetMenuItemInfoA(frameWnd->wIDmenu,
     761                     0,
     762                     TRUE,
     763                     &menuInfo);
     764
     765    RemoveMenu(frameWnd->wIDmenu,0,MF_BYPOSITION);
     766
     767    if ( (menuInfo.fType & MFT_BITMAP)           &&
     768         (LOWORD(menuInfo.dwTypeData)!=0)        &&
     769         (LOWORD(menuInfo.dwTypeData)!=hBmpClose) )
     770    {
     771      DeleteObject((HBITMAP)LOWORD(menuInfo.dwTypeData));
     772    }
     773
     774    if(TWEAK_WineLook > WIN31_LOOK)
     775    {
     776        /* close */
     777        DeleteMenu(frameWnd->wIDmenu,GetMenuItemCount(frameWnd->wIDmenu) - 1,MF_BYPOSITION);
     778    }
     779    /* restore */
     780    DeleteMenu(frameWnd->wIDmenu,GetMenuItemCount(frameWnd->wIDmenu) - 1,MF_BYPOSITION);
     781    /* minimize */
     782    DeleteMenu(frameWnd->wIDmenu,GetMenuItemCount(frameWnd->wIDmenu) - 1,MF_BYPOSITION);
     783
     784    DrawMenuBar(frameWnd->hwndSelf);
     785
     786    return 1;
     787}
     788#endif
    428789/* -------- Miscellaneous service functions ----------
    429790 *
    430  *                      MDI_GetChildByID
     791 *          MDI_GetChildByID
    431792 */
    432793Win32MDIChildWindow *Win32MDIClientWindow::getChildByID(INT id)
     
    438799
    439800    return 0;
     801}
     802
     803void Win32MDIClientWindow::postUpdate(WORD recalc)
     804{
     805    if( !(mdiFlags & MDIF_NEEDUPDATE) )
     806    {
     807        mdiFlags |= MDIF_NEEDUPDATE;
     808        PostMessageA(WM_MDICALCCHILDSCROLL, 0, 0);
     809    }
     810    sbRecalc = recalc;
    440811}
    441812//******************************************************************************
  • TabularUnified trunk/src/user32/new/win32wmdiclient.h

    r760 r808  
    1 /* $Id: win32wmdiclient.h,v 1.3 1999-08-31 17:14:52 sandervl Exp $ */
     1/* $Id: win32wmdiclient.h,v 1.4 1999-09-03 15:09:46 sandervl Exp $ */
    22/*
    33 * Win32 MDI Client Window Class for OS/2
     
    1717#define MDICLIENTCLASSNAMEA "MDICLIENT"
    1818#define MDICLIENTCLASSNAMEW L"MDICLIENT"
     19
     20#define MDIF_NEEDUPDATE         0x0001
    1921
    2022//******************************************************************************
     
    3739               void  setActiveChild(Win32MDIChildWindow *newchild) { activeChild = newchild; };
    3840
     41Win32MDIChildWindow *getWindow(Win32MDIChildWindow *actchild, BOOL bNext, DWORD dwStyleMask);
     42
    3943Win32MDIChildWindow *getChildByID(INT id);
     44               void postUpdate(WORD recalc);
    4045
    4146           int  getNrOfChildren()                { return nActiveChildren; };
    4247           int  incNrActiveChildren()            { return ++nActiveChildren; };
    4348           int  decNrActiveChildren()            { return --nActiveChildren; };
     49
     50           int  getMdiFlags()                    { return mdiFlags; };
     51           void setMdiFlags(int newflags)        { mdiFlags = newflags; };
     52
     53           void updateFrameText(BOOL repaint, LPCSTR lpTitle );
    4454
    4555           LONG childActivate(Win32MDIChildWindow *child);
     
    5868        int     nActiveChildren;
    5969        int     nTotalCreated;
     70        int     sbRecalc;
    6071        LPSTR   frameTitle;
    6172        DWORD   mdiFlags;
Note: See TracChangeset for help on using the changeset viewer.