Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

menuc.c

Go to the documentation of this file.
00001 /****************************** Module Header ******************************\ 00002 * Module Name: menuc.c 00003 * 00004 * Copyright (c) 1985 - 1999, Microsoft Corporation 00005 * 00006 * This module contains 00007 * 00008 * History: 00009 * 01-11-93 DavidPe Created 00010 \***************************************************************************/ 00011 00012 #include "precomp.h" 00013 #pragma hdrstop 00014 00015 DWORD CheckMenuItem( 00016 HMENU hMenu, 00017 UINT uIDCheckItem, 00018 UINT uCheck) 00019 { 00020 PMENU pMenu; 00021 PITEM pItem; 00022 00023 pMenu = VALIDATEHMENU(hMenu); 00024 if (pMenu == NULL) { 00025 return (DWORD)-1; 00026 } 00027 00028 /* 00029 * Get a pointer the the menu item 00030 */ 00031 if ((pItem = MNLookUpItem(pMenu, uIDCheckItem, (BOOL) (uCheck & MF_BYPOSITION), NULL)) == NULL) 00032 return (DWORD)-1; 00033 00034 /* 00035 * If the item is already in the state we're 00036 * trying to set, just return. 00037 */ 00038 if ((pItem->fState & MFS_CHECKED) == (uCheck & MFS_CHECKED)) { 00039 return pItem->fState & MF_CHECKED; 00040 } 00041 00042 return NtUserCheckMenuItem(hMenu, uIDCheckItem, uCheck); 00043 } 00044 00045 UINT GetMenuDefaultItem(HMENU hMenu, UINT fByPosition, UINT uFlags) { 00046 PMENU pMenu; 00047 00048 pMenu = VALIDATEHMENU(hMenu); 00049 if (pMenu == NULL) { 00050 return (DWORD)-1; 00051 } 00052 00053 return _GetMenuDefaultItem(pMenu, (BOOL)fByPosition, uFlags); 00054 } 00055 00056 /***************************************************************************\ 00057 * SetMenuItemInfoStruct 00058 * 00059 * History: 00060 * 07-22-96 GerardoB - Added header and Fixed up for 5.0 00061 \***************************************************************************/ 00062 void SetMenuItemInfoStruct(HMENU hMenu, UINT wFlags, UINT_PTR wIDNew, LPWSTR pwszNew, LPMENUITEMINFO pmii) 00063 { 00064 PMENU pMenu; 00065 PITEM pItem; 00066 00067 UserAssert(sizeof(MENUITEMINFOW) == sizeof(MENUITEMINFOA)); 00068 00069 RtlZeroMemory(pmii, sizeof(*pmii)); 00070 00071 pmii->fMask = MIIM_STATE | MIIM_ID | MIIM_FTYPE; 00072 00073 /* 00074 * For compatibility, setting the bitmap drops the string and 00075 * viceversa; new apps that want to have sting and bitmaps 00076 * must use the MENUITEMINFO APIs 00077 */ 00078 if (wFlags & MFT_BITMAP) { 00079 pmii->fMask |= MIIM_BITMAP | MIIM_STRING; 00080 pmii->hbmpItem = (HBITMAP)pwszNew; 00081 pmii->dwTypeData = 0; 00082 } else if (!(wFlags & MFT_NONSTRING)) { 00083 pmii->fMask |= MIIM_BITMAP | MIIM_STRING; 00084 pmii->dwTypeData = pwszNew; 00085 pmii->hbmpItem = NULL; 00086 } 00087 00088 if (wFlags & MF_POPUP) { 00089 pmii->fMask |= MIIM_SUBMENU; 00090 pmii->hSubMenu = (HMENU)wIDNew; 00091 } 00092 00093 if (wFlags & MF_OWNERDRAW) { 00094 pmii->fMask |= MIIM_DATA; 00095 pmii->dwItemData = (ULONG_PTR) pwszNew; 00096 } 00097 00098 pmii->fState = wFlags & MFS_OLDAPI_MASK; 00099 pmii->fType = wFlags & MFT_OLDAPI_MASK; 00100 pMenu = VALIDATEHMENU(hMenu); 00101 if (pMenu && pMenu->cItems) { 00102 pItem = &((PITEM)REBASEALWAYS(pMenu, rgItems))[0]; 00103 if (pItem && TestMFT(pItem, MFT_RIGHTORDER)) { 00104 pmii->fType |= MFT_RIGHTORDER; 00105 } 00106 } 00107 pmii->wID = (UINT)wIDNew; 00108 } 00109 /***************************************************************************\ 00110 * SetMenuItemInfo 00111 * 00112 * History: 00113 * 07-22-96 GerardoB - Added header 00114 \***************************************************************************/ 00115 BOOL SetMenuInfo(HMENU hMenu, LPCMENUINFO lpmi) 00116 { 00117 if (!ValidateMENUINFO(lpmi, MENUAPI_SET)) { 00118 return FALSE; 00119 } 00120 00121 return NtUserThunkedMenuInfo(hMenu, (LPCMENUINFO)lpmi); 00122 } 00123 /***************************************************************************\ 00124 * ChangeMenu 00125 * 00126 * Stub routine for compatibility with version < 3.0 00127 * 00128 * History: 00129 \***************************************************************************/ 00130 00131 BOOL ChangeMenuW( 00132 HMENU hMenu, 00133 UINT cmd, 00134 LPCWSTR lpNewItem, 00135 UINT IdItem, 00136 UINT flags) 00137 { 00138 /* 00139 * These next two statements take care of sleazyness needed for 00140 * compatability with old changemenu. 00141 */ 00142 if ((flags & MF_SEPARATOR) && cmd == MFMWFP_OFFMENU && !(flags & MF_CHANGE)) 00143 flags |= MF_APPEND; 00144 00145 if (lpNewItem == NULL) 00146 flags |= MF_SEPARATOR; 00147 00148 00149 00150 /* 00151 * MUST be MF_BYPOSITION for Win2.x compatability. 00152 */ 00153 if (flags & MF_REMOVE) 00154 return(NtUserRemoveMenu(hMenu, cmd, 00155 (DWORD)((flags & ~MF_REMOVE) | MF_BYPOSITION))); 00156 00157 if (flags & MF_DELETE) 00158 return(NtUserDeleteMenu(hMenu, cmd, (DWORD)(flags & ~MF_DELETE))); 00159 00160 if (flags & MF_CHANGE) 00161 return(ModifyMenuW(hMenu, cmd, (DWORD)((flags & ~MF_CHANGE) & 00162 (0x07F | MF_HELP | MF_BYPOSITION | MF_BYCOMMAND | 00163 MF_SEPARATOR)), IdItem, lpNewItem)); 00164 00165 if (flags & MF_APPEND) 00166 return(AppendMenuW(hMenu, (UINT)(flags & ~MF_APPEND), 00167 IdItem, lpNewItem)); 00168 00169 /* 00170 * Default is insert 00171 */ 00172 return(InsertMenuW(hMenu, cmd, (DWORD)(flags & ~MF_INSERT), 00173 IdItem, lpNewItem)); 00174 } 00175 00176 BOOL ChangeMenuA( 00177 HMENU hMenu, 00178 UINT cmd, 00179 LPCSTR lpNewItem, 00180 UINT IdItem, 00181 UINT flags) 00182 { 00183 /* 00184 * These next two statements take care of sleazyness needed for 00185 * compatability with old changemenu. 00186 */ 00187 if ((flags & MF_SEPARATOR) && cmd == MFMWFP_OFFMENU && !(flags & MF_CHANGE)) 00188 flags |= MF_APPEND; 00189 00190 if (lpNewItem == NULL) 00191 flags |= MF_SEPARATOR; 00192 00193 00194 00195 /* 00196 * MUST be MF_BYPOSITION for Win2.x compatability. 00197 */ 00198 if (flags & MF_REMOVE) 00199 return(NtUserRemoveMenu(hMenu, cmd, 00200 (DWORD)((flags & ~MF_REMOVE) | MF_BYPOSITION))); 00201 00202 if (flags & MF_DELETE) 00203 return(NtUserDeleteMenu(hMenu, cmd, (DWORD)(flags & ~MF_DELETE))); 00204 00205 if (flags & MF_CHANGE) 00206 return(ModifyMenuA(hMenu, cmd, (DWORD)((flags & ~MF_CHANGE) & 00207 (0x07F | MF_HELP | MF_BYPOSITION | MF_BYCOMMAND | 00208 MF_SEPARATOR)), IdItem, lpNewItem)); 00209 00210 if (flags & MF_APPEND) 00211 return(AppendMenuA(hMenu, (UINT)(flags & ~MF_APPEND), 00212 IdItem, lpNewItem)); 00213 00214 /* 00215 * Default is insert 00216 */ 00217 return(InsertMenuA(hMenu, cmd, (DWORD)(flags & ~MF_INSERT), 00218 IdItem, lpNewItem)); 00219 } 00220 00221 LONG GetMenuCheckMarkDimensions() 00222 { 00223 return((DWORD)MAKELONG(SYSMET(CXMENUCHECK), SYSMET(CYMENUCHECK))); 00224 } 00225 00226 /***************************************************************************\ 00227 * GetMenuContextHelpId 00228 * 00229 * Return the help id of a menu. 00230 * 00231 \***************************************************************************/ 00232 00233 WINUSERAPI DWORD WINAPI GetMenuContextHelpId( 00234 HMENU hMenu) 00235 { 00236 PMENU pMenu; 00237 00238 pMenu = VALIDATEHMENU(hMenu); 00239 00240 if (pMenu == NULL) 00241 return 0; 00242 00243 return pMenu->dwContextHelpId; 00244 } 00245 00246 BOOL TrackPopupMenu( 00247 HMENU hMenu, 00248 UINT fuFlags, 00249 int x, 00250 int y, 00251 int nReserved, 00252 HWND hwnd, 00253 CONST RECT *prcRect) 00254 { 00255 UNREFERENCED_PARAMETER(nReserved); 00256 UNREFERENCED_PARAMETER(prcRect); 00257 00258 return NtUserTrackPopupMenuEx(hMenu, fuFlags, x, y, hwnd, NULL); 00259 } 00260 00261 /***************************************************************************\ 00262 * GetSysMenuHandle 00263 * 00264 * Returns a handle to the system menu of the given window. NULL if 00265 * the window doesn't have a system menu. 00266 * 00267 * History: 00268 \***************************************************************************/ 00269 00270 PMENU xxxGetSysMenuHandle( 00271 PWND pwnd) 00272 { 00273 PMENU pMenu; 00274 00275 if (TestWF(pwnd, WFSYSMENU)) { 00276 pMenu = pwnd->spmenuSys; 00277 00278 /* 00279 * If the window doesn't have a System Menu, use the default one. 00280 */ 00281 if (pMenu == NULL) { 00282 00283 /* 00284 * Change owner so this app can access this menu. 00285 */ 00286 pMenu = (PMENU)NtUserCallHwndLock(HWq(pwnd), SFI_XXXGETSYSMENUHANDLE); 00287 } 00288 } else { 00289 pMenu = NULL; 00290 } 00291 00292 return pMenu; 00293 } 00294 00295 BOOL WINAPI SetMenuItemBitmaps 00296 ( 00297 HMENU hMenu, 00298 UINT nPosition, 00299 UINT uFlags, 00300 HBITMAP hbmpUnchecked, 00301 HBITMAP hbmpChecked 00302 ) 00303 { 00304 MENUITEMINFO mii; 00305 mii.cbSize = sizeof(MENUITEMINFO); 00306 mii.fMask = MIIM_CHECKMARKS; 00307 mii.hbmpChecked = hbmpChecked; 00308 mii.hbmpUnchecked = hbmpUnchecked; 00309 00310 return(SetMenuItemInfo(hMenu, nPosition, (BOOL) (uFlags & MF_BYPOSITION), &mii)); 00311 } 00312 00313 int WINAPI DrawMenuBarTemp( 00314 HWND hwnd, 00315 HDC hdc, 00316 LPCRECT lprc, 00317 HMENU hMenu, 00318 HFONT hFont) 00319 { 00320 HDC hdcr; 00321 00322 if (IsMetaFile(hdc)) 00323 return -1; 00324 00325 hdcr = GdiConvertAndCheckDC(hdc); 00326 if (hdcr == (HDC)0) 00327 return -1; 00328 00329 if (!hMenu) 00330 return -1; 00331 00332 return NtUserDrawMenuBarTemp( 00333 hwnd, 00334 hdc, 00335 lprc, 00336 hMenu, 00337 hFont); 00338 } 00339 00340 /***************************************************************************\ 00341 * 00342 * CheckMenuRadioItem() - 00343 * 00344 * Checks one menu item in a range, unchecking the others. This can be 00345 * done either MF_BYCOMMAND or MF_BYPOSITION. It works similarly to 00346 * CheckRadioButton(). 00347 * 00348 * The return value is TRUE if the given item was checked, FALSE if not. 00349 * 00350 * History 00351 * 04/04/97 GerardoB Moved to the client side 00352 \***************************************************************************/ 00353 00354 BOOL CheckMenuRadioItem(HMENU hMenu, UINT wIDFirst, UINT wIDLast, 00355 UINT wIDCheck, UINT flags) 00356 { 00357 BOOL fByPosition = (BOOL) (flags & MF_BYPOSITION); 00358 PMENU pMenu, pMenuItemIsOn; 00359 PITEM pItem; 00360 UINT wIDCur; 00361 BOOL fChecked = FALSE; 00362 BOOL fFirst = TRUE; 00363 MENUITEMINFO mii; 00364 00365 pMenu = VALIDATEHMENU(hMenu); 00366 if (pMenu == NULL) { 00367 return FALSE; 00368 } 00369 00370 mii.cbSize = sizeof(mii); 00371 /* 00372 * Make sure we won't loop for ever 00373 */ 00374 wIDLast = min(wIDLast, (UINT)0xFFFFFFFE); 00375 00376 for (wIDCur = wIDFirst; wIDCur <= wIDLast; wIDCur++) { 00377 pItem = MNLookUpItem(pMenu, wIDCur, fByPosition, &pMenuItemIsOn); 00378 /* 00379 * Continue searching if it didn't find the item or it's a separator 00380 */ 00381 if ((pItem == NULL) || TestMFT(pItem, MFT_SEPARATOR)) { 00382 continue; 00383 } 00384 /* 00385 * If this is the first one, rememeber what menu it's on because 00386 * all items are supposed to be in the same menu. 00387 */ 00388 if (fFirst) { 00389 pMenu = pMenuItemIsOn; 00390 hMenu = PtoHq(pMenu); 00391 fFirst = FALSE; 00392 } 00393 /* 00394 * If this item is on a different menu, don't touch it 00395 */ 00396 if (pMenu != pMenuItemIsOn) { 00397 continue; 00398 } 00399 /* 00400 * Set the new check state. Avoid the trip to the kernel if possible 00401 */ 00402 if (wIDCur == wIDCheck) { 00403 /* 00404 * Check it. 00405 */ 00406 if (!TestMFT(pItem, MFT_RADIOCHECK) || !TestMFS(pItem, MFS_CHECKED)) { 00407 mii.fMask = MIIM_FTYPE | MIIM_STATE; 00408 mii.fType = (pItem->fType & MFT_MASK) | MFT_RADIOCHECK; 00409 mii.fState = (pItem->fState & MFS_MASK) | MFS_CHECKED; 00410 NtUserThunkedMenuItemInfo(hMenu, wIDCheck, fByPosition, FALSE, &mii, NULL); 00411 } 00412 fChecked = TRUE; 00413 } else { 00414 /* 00415 * Uncheck it 00416 * NOTE: don't remove MFT_RADIOCHECK type 00417 */ 00418 if (TestMFS(pItem, MFS_CHECKED)) { 00419 mii.fMask = MIIM_STATE; 00420 mii.fState = (pItem->fState & MFS_MASK) & ~MFS_CHECKED; 00421 NtUserThunkedMenuItemInfo(hMenu, wIDCur, fByPosition, FALSE, &mii, NULL); 00422 } 00423 } 00424 } /* for */ 00425 00426 if (fFirst) { 00427 /* 00428 * No item was ever found. 00429 */ 00430 RIPERR0(ERROR_MENU_ITEM_NOT_FOUND, RIP_VERBOSE, "CheckMenuRadioItem, no items found\n"); 00431 00432 } 00433 return(fChecked); 00434 }

Generated on Sat May 15 19:40:44 2004 for test by doxygen 1.3.7