00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
#include "precomp.h"
00015 
#pragma hdrstop
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 PWND FindPwndChild(
00025     
PWND pwndMDI,
00026     UINT wChildID)
00027 {
00028     
PWND pwndT;
00029 
00030     
for (pwndT = 
REBASEPWND(pwndMDI, spwndChild);
00031             pwndT && (pwndT->
spwndOwner || PtrToUlong(pwndT->
spmenu) != wChildID);
00032             pwndT = 
REBASEPWND(pwndT, spwndNext))
00033         ;
00034 
00035     
return pwndT;
00036 }
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 int MakeMenuItem(
00048     LPWSTR lpOut,
00049     
PWND pwnd)
00050 {
00051     
PMDI pmdi;
00052     
DWORD rgParm;
00053     
int cch = 0;
00054     WCHAR string[160];
00055     LPWSTR lpstr;
00056     
int i = 0;
00057 
00058     
00059 
00060 
00061     pmdi = ((
PMDIWND)(
REBASEPWND(pwnd, spwndParent)))->pmdi;
00062 
00063     *lpOut = 0;
00064 
00065     rgParm = PtrToUlong(pwnd->
spmenu) - (
DWORD)
FIRST(pmdi) + 1;
00066 
00067     
if (pwnd->
strName.
Length) {
00068         lpstr = 
REBASEALWAYS(pwnd, strName.Buffer);
00069 
00070         
00071 
00072 
00073 
00074         
while (*lpstr && i < ((
sizeof(string) / 
sizeof(WCHAR)) - 1)) {
00075             string[i] = *lpstr;
00076             i++;
00077             
if (*lpstr == TEXT(
'&'))
00078                 string[i++] = TEXT(
'&');
00079 
00080             lpstr++;
00081         }
00082 
00083         string[i] = 0;
00084         cch = 
wsprintfW(lpOut, 
L"&%d %ws", rgParm, string);
00085 
00086     } 
else {
00087 
00088         
00089 
00090 
00091         cch = 
wsprintfW(lpOut, 
L"&%d ", rgParm);
00092     }
00093 
00094     
return cch;
00095 }
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 void ModifyMenuItem(
00105     
PWND pwnd)
00106 {
00107     
PMDI pmdi;
00108     WCHAR sz[200];
00109     MENUITEMINFO    mii;
00110     
PWND pwndParent;
00111     
PMENU pmenu;
00112 
00113     
00114 
00115 
00116     pwndParent = 
REBASEPWND(pwnd, spwndParent);
00117     pmdi = ((
PMDIWND)pwndParent)->pmdi;
00118 
00119     
if (PtrToUlong(pwnd->
spmenu) > 
FIRST(pmdi) + (
UINT)8)
00120         
return;
00121 
00122     mii.cbSize = 
sizeof(MENUITEMINFO);
00123     mii.fMask = MIIM_STRING;
00124     mii.dwTypeData = sz;
00125 
00126     
00127 
00128 
00129     
MakeMenuItem(sz, pwnd);
00130 
00131     
00132 
00133 
00134     
if (
HWq(pwnd) == 
ACTIVE(pmdi)) {
00135         mii.fMask |= MIIM_STATE;
00136         mii.fState = MFS_CHECKED;
00137     }
00138 
00139     pwndParent = 
REBASEPWND(pwndParent, spwndParent);
00140 
00141     
if (pwndParent->
spmenu) {
00142 
00143         
00144 
00145 
00146 
00147 
00148         pmenu = 
REBASEALWAYS(pwndParent, spmenu);
00149         
00150 
00151 
00152         
ThunkedMenuItemInfo(
PtoH(pmenu), PtrToUlong(pwnd->
spmenu), 
FALSE, 
FALSE, &mii, 
FALSE);
00153     }
00154 }
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 BOOL MDIAddSysMenu(
00166     HMENU hMenuFrame,
00167     HWND hwndChild)
00168 {
00169     
PWND pwndChild;
00170     MENUITEMINFO    mii;
00171     
PMENU pMenuChild;
00172 
00173 
00174 
00175 
00176     UserAssert(
IsWindow(hwndChild));
00177     pwndChild = 
ValidateHwnd(hwndChild);
00178     
if (!hMenuFrame || !pwndChild || !pwndChild->
spmenuSys) {
00179         
return FALSE;
00180     }
00181 
00182     
00183 
00184 
00185 
00186     pMenuChild = 
_GetSubMenu (
REBASEALWAYS(pwndChild, spmenuSys), 0);
00187     
if (!pMenuChild) {
00188         
return FALSE;
00189     }
00190 
00191 
00192     mii.cbSize = 
sizeof(MENUITEMINFO);
00193     mii.fMask = MIIM_SUBMENU | MIIM_DATA | MIIM_BITMAP;  
00194     mii.hSubMenu = 
PtoH(pMenuChild);
00195 
00196 
00197     mii.hbmpItem = HBMMENU_SYSTEM;
00198 
00199     mii.dwItemData = (ULONG_PTR)hwndChild;
00200 
00201     
if (!
InternalInsertMenuItem(hMenuFrame, 0, 
TRUE, &mii))
00202         
return FALSE;
00203 
00204     
00205     
00206 
00207     mii.fMask = MIIM_ID | MIIM_FTYPE | MIIM_BITMAP;
00208     mii.fType = MFT_RIGHTJUSTIFY;
00209 
00210     pwndChild = 
ValidateHwnd(hwndChild);
00211     
if (!pwndChild) {
00212         
NtUserRemoveMenu(hMenuFrame, 0, MF_BYPOSITION);
00213         
return FALSE;
00214     }
00215 
00216 
00217     
if (!
TestWF(pwndChild, 
WFOLDUI))
00218     {
00219         
00220         mii.hbmpItem = (
TestWF(pwndChild, 
WFMINBOX) ? HBMMENU_MBAR_MINIMIZE : HBMMENU_MBAR_MINIMIZE_D);
00221         mii.wID = SC_MINIMIZE;
00222 
00223         
if (!
InternalInsertMenuItem(hMenuFrame, 
MFMWFP_NOITEM, 
TRUE, &mii))
00224         {
00225             
NtUserRemoveMenu(hMenuFrame, 0, MF_BYPOSITION);
00226             
return FALSE;
00227         }
00228         mii.fType &= ~MFT_RIGHTJUSTIFY;
00229     }
00230 
00231     
00232     mii.hbmpItem = HBMMENU_MBAR_RESTORE;
00233     mii.wID = SC_RESTORE;
00234 
00235     
if (!
InternalInsertMenuItem(hMenuFrame, 
MFMWFP_NOITEM, 
TRUE, &mii)) {
00236         
00237         
NtUserRemoveMenu(hMenuFrame, 0, MF_BYPOSITION);
00238         
return FALSE;
00239     }
00240 
00241     pwndChild = 
ValidateHwnd(hwndChild);
00242     
if (!pwndChild) {
00243         
NtUserRemoveMenu(hMenuFrame, 0, MF_BYPOSITION);
00244         
return FALSE;
00245     }
00246 
00247     
if (!
TestWF(pwndChild, 
WFOLDUI))
00248     {
00249         
00250         mii.hbmpItem = (
xxxMNCanClose(pwndChild) ? HBMMENU_MBAR_CLOSE : HBMMENU_MBAR_CLOSE_D);
00251         mii.wID = SC_CLOSE;
00252 
00253         
if (!
InternalInsertMenuItem(hMenuFrame, 
MFMWFP_NOITEM, 
TRUE, &mii))
00254         {
00255             
00256             
NtUserRemoveMenu(hMenuFrame, 0, MF_BYPOSITION);
00257             
return FALSE;
00258         }
00259     }
00260 
00261     
00262 
00263 
00264 
00265     
NtUserSetSysMenu(hwndChild);
00266 
00267     
00268 
00269 
00270 
00271     
ClearWindowState(pwndChild, 
WFSYSMENU);
00272 
00273     
00274 
00275 
00276 
00277     
NtUserRedrawFrame(hwndChild);
00278 
00279     
return TRUE;
00280 }
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 
00289 BOOL MDIRemoveSysMenu(
00290     HMENU hMenuFrame,
00291     HWND hwndChild)
00292 {
00293     
int iLastItem;
00294     
UINT    iLastCmd;
00295     
PWND pwndChild;
00296 
00297 
00298 
00299     
if (hMenuFrame == 
NULL)
00300         
return FALSE;
00301 
00302     pwndChild = 
ValidateHwnd(hwndChild);
00303 
00304     
if (pwndChild == 
NULL)
00305         
return FALSE;
00306 
00307     iLastItem = 
GetMenuItemCount(hMenuFrame) - 1;
00308     iLastCmd = 
TestWF(pwndChild, 
WFOLDUI) ? SC_RESTORE : SC_CLOSE;
00309 
00310     
if ((
UINT) 
GetMenuItemID(hMenuFrame, iLastItem) != iLastCmd)
00311         
return FALSE;
00312 
00313     
00314 
00315 
00316     
SetWindowState(pwndChild, 
WFSYSMENU);
00317 
00318     
00319 
00320 
00321     
NtUserRemoveMenu(hMenuFrame, 0, MF_BYPOSITION);
00322 
00323     
00324 
00325 
00326     
NtUserDeleteMenu(hMenuFrame, iLastItem - 1, MF_BYPOSITION);
00327 
00328     pwndChild = 
ValidateHwnd(hwndChild);
00329     
if (pwndChild == 
NULL)
00330         
return FALSE;
00331 
00332     
if (!
TestWF(pwndChild, 
WFOLDUI)) {
00333         
NtUserDeleteMenu(hMenuFrame, iLastItem - 2, MF_BYPOSITION);
00334         
NtUserDeleteMenu(hMenuFrame, iLastItem - 3, MF_BYPOSITION);
00335     }
00336 
00337     
00338 
00339 
00340 
00341     
NtUserRedrawFrame(hwndChild);
00342 
00343     
return TRUE;
00344 }
00345 
00346 
00347 
00348 
00349 
00350 
00351 
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359 
00360 
00361 
00362 BOOL FAR PASCAL 
AppendToWindowsMenu(
00363     
PWND pwndMDI,
00364     
PWND pwndChild)
00365 {
00366     
PMDI pmdi;
00367     WCHAR szMenuItem[165];
00368     
int item;
00369     MENUITEMINFO    mii;
00370 
00371     
00372 
00373 
00374     pmdi = ((
PMDIWND)pwndMDI)->pmdi;
00375 
00376     item = PtrToUlong(pwndChild->
spmenu) - 
FIRST(pmdi);
00377 
00378     
if (
WINDOW(pmdi) && (item < 
MAXITEMS)) {
00379         mii.cbSize = 
sizeof(MENUITEMINFO);
00380         
if (!item) {
00381 
00382             
00383 
00384 
00385             mii.fMask = MIIM_FTYPE;
00386             mii.fType = MFT_SEPARATOR;
00387             
if (!
InternalInsertMenuItem(
WINDOW(pmdi), 
MFMWFP_NOITEM, 
TRUE, &mii))
00388                 
return FALSE;
00389         }
00390 
00391         
if (item == (
MAXITEMS - 1))
00392             LoadString(
hmodUser, 
STR_MOREWINDOWS, szMenuItem,
00393                        
sizeof(szMenuItem) / 
sizeof(WCHAR));
00394         
else
00395             
MakeMenuItem(szMenuItem, pwndChild);
00396 
00397         mii.fMask = MIIM_ID | MIIM_STRING;
00398         mii.wID = PtrToUlong(pwndChild->
spmenu);
00399         mii.dwTypeData = szMenuItem;
00400         mii.cch = (
UINT)-1;
00401         
if (!
InternalInsertMenuItem(
WINDOW(pmdi), 
MFMWFP_NOITEM, 
TRUE, &mii))
00402             
return FALSE;
00403     }
00404     
return TRUE;
00405 }
00406 
00407 
00408 
00409 
00410 
00411 
00412 
00413 
00414 
00415 
00416 
00417 BOOL SwitchWindowsMenus(
00418     HMENU hmenu,
00419     HMENU hOldWindow,
00420     HMENU hNewWindow)
00421 {
00422     
int i;
00423     HMENU hsubMenu;
00424     WCHAR szMenuName[128];
00425     MENUITEMINFO    mii;
00426 
00427     
if (hOldWindow == hNewWindow)
00428         
return TRUE;
00429 
00430     mii.cbSize = 
sizeof(MENUITEMINFO);
00431 
00432     
00433 
00434 
00435     
for (i = 0; hsubMenu = 
GetSubMenu(hmenu, i); i++) {
00436         
if (hsubMenu == hOldWindow)
00437         {
00438             
00439             mii.fMask = MIIM_STRING;
00440             mii.dwTypeData = szMenuName;
00441             mii.cch = 
sizeof(szMenuName)/
sizeof(WCHAR);
00442             
GetMenuItemInfoInternalW(hmenu, i, 
TRUE, &mii);
00443             
00444             
if (!
NtUserRemoveMenu(hmenu, i, MF_BYPOSITION))
00445                 
return(
FALSE);
00446 
00447             mii.fMask |= MIIM_SUBMENU;
00448             mii.hSubMenu = hNewWindow;
00449             
return(
InternalInsertMenuItem(hmenu, i, 
TRUE, &mii));
00450         }
00451     }
00452 
00453     
return(
FALSE);
00454 }
00455 
00456 
00457 
00458 
00459 
00460 
00461 
00462 
00463 
00464 
00465 
00466 
00467 void ShiftMenuIDs(
00468     
PWND pwnd,
00469     
PWND pwndVictim)
00470 {
00471     
PMDI pmdi;
00472     
PWND pwndChild;
00473     
PWND pwndParent;
00474     
00475 
00476 
00477     pmdi = ((
PMDIWND)pwnd)->pmdi;
00478 
00479     pwndParent = 
REBASEPWND(pwndVictim, spwndParent);
00480     pwndChild = 
REBASEPWND(pwndParent, spwndChild);
00481 
00482     
while (pwndChild) {
00483         
if (!pwndChild->
spwndOwner && (pwndChild->
spmenu > pwndVictim->
spmenu)) {
00484             
SetWindowLongPtr(
HWq(pwndChild), GWLP_ID, PtrToUlong(pwndChild->
spmenu) - 1);
00485         }
00486         pwndChild = 
REBASEPWND(pwndChild, spwndNext);
00487     }
00488 
00489     
SetWindowLongPtr(
HWq(pwndVictim), GWLP_ID, 
FIRST(pmdi) + 
CKIDS(pmdi) - 1);
00490 }
00491 
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 HMENU 
MDISetMenu(
00500     
PWND pwndMDI,
00501     BOOL fRefresh,
00502     HMENU hNewSys,
00503     HMENU hNewWindow)
00504 {
00505     
int i;
00506     
int iFirst;
00507     
int item;
00508     
PMDI pmdi;
00509     
PWND pwndParent;
00510     HMENU hOldSys;
00511     HMENU hOldWindow;
00512     
PWND pwndChild;
00513 
00514     
00515 
00516 
00517     pmdi = ((
PMDIWND)pwndMDI)->pmdi;
00518 
00519     
00520 
00521 
00522     pwndParent = 
REBASEPWND(pwndMDI, spwndParent);
00523     hOldSys = 
GetMenu(
HW(pwndParent));
00524     hOldWindow = 
WINDOW(pmdi);
00525 
00526     
if (fRefresh) {
00527         hNewSys = hOldSys;
00528         hNewWindow = hOldWindow;
00529     }
00530 
00531     
00532 
00533 
00534     
if (hNewSys && (hNewSys != hOldSys)) {
00535         
if (
MAXED(pmdi))
00536             
MDIRemoveSysMenu(hOldSys, 
MAXED(pmdi));
00537 
00538         
NtUserSetMenu(
HW(pwndParent), hNewSys, 
FALSE);
00539 
00540         
if (
MAXED(pmdi))
00541             
MDIAddSysMenu(hNewSys, 
MAXED(pmdi));
00542     } 
else
00543         hNewSys = hOldSys;
00544 
00545     
00546 
00547 
00548     
if (fRefresh || (hOldWindow != hNewWindow)) {
00549         iFirst = 
FIRST(pmdi);
00550 
00551         
if (hOldWindow) {
00552             
int cItems = 
GetMenuItemCount(hOldWindow);
00553 
00554             
for (i = cItems - 1; i >= 0; i--) {
00555                 
if (
GetMenuState(hOldWindow, i, MF_BYPOSITION) & MF_SEPARATOR)
00556                    
break;
00557             }
00558             
if ((i >= 0) && (
GetMenuItemID(hOldWindow, i + 1) == (
UINT)iFirst)) {
00559                 
int idTrim = i;
00560 
00561                 
for (i = idTrim; i < cItems; i++)
00562                     
NtUserDeleteMenu(hOldWindow, idTrim, MF_BYPOSITION);
00563             }
00564         }
00565 
00566         
Lock(&
WINDOW(pmdi), hNewWindow);
00567 
00568         
if (hNewWindow != 
NULL) {
00569 
00570            
00571 
00572 
00573            
for (i = 0, item = 0; ((
UINT)i < 
CKIDS(pmdi)) && (item < 
MAXITEMS);
00574                     i++) {
00575                pwndChild = 
FindPwndChild(pwndMDI, iFirst + item);
00576                
if (pwndChild != 
NULL) {
00577                    
if ((!
TestWF(pwndChild, 
WFVISIBLE) &&
00578                           (LOWORD(pwndMDI->style) & 0x0001)) ||
00579                           
TestWF(pwndChild, 
WFDISABLED)) {
00580                        
ShiftMenuIDs(pwndMDI, pwndChild);
00581                    } 
else {
00582                        
AppendToWindowsMenu(pwndMDI, pwndChild);
00583                        item++;
00584                    }
00585                }
00586            }
00587 
00588            
00589 
00590 
00591            
if (
ACTIVE(pmdi))
00592                
CheckMenuItem(hNewWindow, (WORD)GetWindowID(
ACTIVE(pmdi)),
00593                        MF_BYCOMMAND | MF_CHECKED);
00594         }
00595 
00596         
00597 
00598 
00599         
SwitchWindowsMenus(hNewSys, hOldWindow, hNewWindow);
00600     }
00601     
return hOldSys;
00602 }
00603 
00604 
00605 
00606 
00607 
00608 
00609 
00610 
00611 void xxxInitActivateDlg(
00612     HWND hwnd,
00613     
PWND pwndMDI)
00614 {
00615     
PMDI pmdi;
00616     
UINT wKid;
00617     HWND hwndT;
00618     
PWND pwndT;
00619     WCHAR 
szTitle[
CCHTITLEMAX];
00620     
TL tlpwndT;
00621     SIZE 
Size;
00622     HDC hDC;
00623     
DWORD width = 0;
00624 
00625     
CheckLock(pwndMDI);
00626 
00627     
00628 
00629 
00630     pmdi = ((
PMDIWND)pwndMDI)->pmdi;
00631 
00632     hDC = 
NtUserGetDC(hwnd);
00633 
00634     
00635 
00636 
00637 
00638 
00639 
00640 
00641     
for (wKid = 0; wKid < 
CKIDS(pmdi); wKid++) {
00642         pwndT = 
FindPwndChild(pwndMDI, (
UINT)(wKid + 
FIRST(pmdi)));
00643 
00644         
if (pwndT && 
TestWF(pwndT, 
WFVISIBLE) && !
TestWF(pwndT, 
WFDISABLED)) {
00645             
ThreadLockAlways(pwndT, &tlpwndT);
00646             
GetWindowText(
HWq(pwndT), 
szTitle, 
CCHTITLEMAX);
00647             
SendDlgItemMessage(hwnd, 100, LB_ADDSTRING, 0, (LPARAM)
szTitle);
00648             GetTextExtentPoint(hDC, 
szTitle, lstrlen(
szTitle), &
Size);
00649             
if (
Size.cx > (LONG)width) {
00650                 width = 
Size.cx;
00651             }
00652             
ThreadUnlock(&tlpwndT);
00653         }
00654     }
00655 
00656     
00657 
00658 
00659     
SendDlgItemMessage(hwnd, 100, LB_SETTOPINDEX, 
MAXITEMS - 1, 0
L);
00660     
SendDlgItemMessage(hwnd, 100, LB_SETCURSEL, 
MAXITEMS - 1, 0
L);
00661 
00662     
00663 
00664 
00665     
SendDlgItemMessage(hwnd, 100, LB_SETHORIZONTALEXTENT, width, 0
L);
00666     
NtUserReleaseDC(hwnd, hDC);
00667 
00668     
00669 
00670 
00671     hwndT = 
GetDlgItem(hwnd, 100);
00672     
NtUserSetFocus(hwndT);
00673 }
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 VOID MDIActivateDlgSize(HWND hwnd, 
int width, 
int height)
00686 {
00687     
PMDIACTIVATEPOS pPos;
00688     
PWND pwnd, pwndList, pwndButtonLeft, pwndButtonRight;
00689     HDWP hdwp;
00690     
int  deltaX, deltaY;
00691 
00692     pPos = (
PMDIACTIVATEPOS)
GetProp(
GetParent(hwnd), 
MAKEINTATOM(
atomMDIActivateProp));
00693     
if (pPos == 
NULL) {
00694         
return;
00695     }
00696 
00697     
00698 
00699 
00700     
if ((pwnd = 
ValidateHwnd(hwnd)) == 
NULL) {
00701         
return;
00702     }
00703     pwndList = 
REBASEPWND(pwnd, spwndChild);
00704     pwndButtonLeft  = 
REBASEPWND(pwndList, spwndNext);
00705     pwndButtonRight = 
REBASEPWND(pwndButtonLeft, spwndNext);
00706 
00707     UserAssert(
GETFNID(pwndList) == 
FNID_LISTBOX);
00708     UserAssert(
GETFNID(pwndButtonLeft) == 
FNID_BUTTON);
00709     UserAssert(
GETFNID(pwndButtonRight) == 
FNID_BUTTON);
00710     UserAssert(pwndButtonRight->
rcWindow.left > pwndButtonLeft->
rcWindow.left);
00711 
00712     deltaX = width - pPos->
cx;
00713     deltaY = height - pPos->
cy;
00714 
00715     pPos->
cx = width;
00716     pPos->
cy = height;
00717 
00718     
00719 
00720 
00721     hdwp = 
NtUserBeginDeferWindowPos(3);
00722 
00723     
if (hdwp)
00724     {
00725         hdwp = 
NtUserDeferWindowPos( hdwp,
00726                                
PtoH(pwndList),
00727                                
NULL,
00728                                0,
00729                                0,
00730                                deltaX + pwndList->
rcWindow.right - pwndList->
rcWindow.left,
00731                                deltaY + pwndList->
rcWindow.bottom - pwndList->
rcWindow.top,
00732                                SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE );
00733 
00734         
if (hdwp)
00735         {
00736             hdwp = 
NtUserDeferWindowPos(hdwp,
00737                                
PtoH(pwndButtonLeft),
00738                                
NULL,
00739                                pwndButtonLeft->
rcWindow.left - pwnd->
rcClient.left,
00740                                deltaY + pwndButtonLeft->
rcWindow.top - pwnd->
rcClient.top,
00741                                0,
00742                                0,
00743                                SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
00744 
00745 
00746             
if (hdwp)
00747             {
00748                 hdwp = 
NtUserDeferWindowPos( hdwp,
00749                                
PtoH(pwndButtonRight),
00750                                
NULL,
00751                                pwndButtonRight->
rcWindow.left - pwnd->
rcClient.left,
00752                                deltaY + pwndButtonRight->
rcWindow.top - pwnd->
rcClient.top,
00753                                0,
00754                                0,
00755                                SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
00756             }
00757 
00758         }
00759         
if (hdwp) {
00760             
NtUserEndDeferWindowPosEx(hdwp, 
FALSE);
00761         }
00762     }
00763 }
00764 
00765 
00766 
00767 
00768 
00769 
00770 
00771 
00772 
00773 
00774 
00775 VOID MDIActivateDlgInit(HWND hwnd, LPARAM lParam)
00776 {
00777     
PMDIACTIVATEPOS pPos;
00778     HWND  hwndParent;
00779     RECT  rc;
00780 
00781     
xxxInitActivateDlg(hwnd, (
PWND)lParam);
00782 
00783     hwndParent = 
GetParent(hwnd);
00784     
00785 
00786 
00787     
if (
atomMDIActivateProp == 0) {
00788 
00789         
atomMDIActivateProp = AddAtomW(
MDIACTIVATE_PROP_NAME);
00790         UserAssert(
atomMDIActivateProp);
00791     }
00792 
00793     
GetWindowRect(hwnd, &rc);
00794 
00795     pPos = (
PMDIACTIVATEPOS)
GetProp(hwndParent, 
MAKEINTATOM(
atomMDIActivateProp));
00796     
00797 
00798 
00799     
if (pPos != 
NULL) {
00800 
00801         
int cxBorder, cyBorder, cx, 
cy;
00802 
00803         
00804 
00805 
00806 
00807         cxBorder = rc.right - rc.left;
00808         cyBorder = rc.bottom - rc.top;
00809         
GetClientRect(hwnd, &rc);
00810         cxBorder -= rc.right - rc.left;
00811         cyBorder -= rc.bottom - rc.top;
00812 
00813         
NtUserSetWindowPos(hwnd, 
NULL, 0, 0,
00814                            pPos->
cx + cxBorder,
00815                            pPos->
cy + cyBorder,
00816                            SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER
00817                            | SWP_NOSENDCHANGING | SWP_NOREDRAW);
00818         cx = pPos->
cx;
00819         
cy = pPos->
cy;
00820         pPos->
cx = pPos->
cxMin - cxBorder;
00821         pPos->
cy = pPos->
cyMin - cyBorder;
00822         
MDIActivateDlgSize(hwnd, cx, 
cy);
00823 
00824     } 
else {
00825         
00826 
00827 
00828         pPos = 
UserLocalAlloc(0, 
sizeof(
MDIACTIVATEPOS));
00829         
if (pPos == 
NULL) {
00830             
return;
00831         }
00832         pPos->
cxMin = rc.right - rc.left;
00833         pPos->
cyMin = rc.bottom - rc.top;
00834 
00835         
GetClientRect(hwnd, &rc);
00836         pPos->
cx = rc.right - rc.left;
00837         pPos->
cy = rc.bottom - rc.top;
00838         
SetProp(hwndParent, 
MAKEINTATOM(
atomMDIActivateProp), (HANDLE)pPos);
00839     }
00840 }
00841 
00842 
00843 
00844 
00845 
00846 
00847 
00848 
00849 INT_PTR 
MDIActivateDlgProcWorker(
00850     HWND hwnd,
00851     UINT wMsg,
00852     WPARAM wParam,
00853     LPARAM lParam)
00854 {
00855     
int i;
00856 
00857     
switch (wMsg) {
00858 
00859     
case WM_INITDIALOG:
00860         
00861 
00862 
00863 
00864         
MDIActivateDlgInit(hwnd, lParam);
00865         
return FALSE;
00866 
00867     
case WM_COMMAND:
00868         i = -2;
00869 
00870         
switch (LOWORD(wParam)) {
00871 
00872         
00873 
00874 
00875         
case 100:
00876             
if (HIWORD(wParam) != LBN_DBLCLK)
00877                 
break;
00878 
00879         
00880 
00881 
00882         
case IDOK:
00883             i = (
UINT)
SendDlgItemMessage(hwnd, 100, LB_GETCURSEL, 0, 0
L);
00884 
00885         
00886 
00887 
00888         
case IDCANCEL:
00889             
EndDialog(hwnd, i);
00890             
break;
00891         
default:
00892             
return FALSE;
00893         }
00894         
break;
00895 
00896     
case WM_SIZE:
00897         
MDIActivateDlgSize(hwnd, LOWORD(lParam), HIWORD(lParam));
00898         
return FALSE;
00899 
00900     
case WM_GETMINMAXINFO:
00901         {
00902             
PMDIACTIVATEPOS pPos;
00903 
00904             
if (pPos = (
PMDIACTIVATEPOS)
GetProp(
GetParent(hwnd), 
MAKEINTATOM(
atomMDIActivateProp))) {
00905                  ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = pPos->
cxMin;
00906                  ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = pPos->
cyMin;
00907             }
00908             
return FALSE;
00909         }
00910 
00911     
default:
00912         
return FALSE;
00913     }
00914     
return TRUE;
00915 }
00916 
00917 INT_PTR WINAPI 
MDIActivateDlgProcA(
00918     HWND hwnd,
00919     UINT message,
00920     WPARAM wParam,
00921     LPARAM lParam)
00922 {
00923     
return MDIActivateDlgProcWorker(hwnd, message, wParam, lParam);
00924 }
00925 
00926 INT_PTR WINAPI 
MDIActivateDlgProcW(
00927     HWND hwnd,
00928     UINT message,
00929     WPARAM wParam,
00930     LPARAM lParam)
00931 {
00932     
return MDIActivateDlgProcWorker(hwnd, message, wParam, lParam);
00933 }