Release 940405
Tue Apr 5 14:36:59 1994 Bob Amstadt (bob@pooh)
* [include/mdi.h] [windows/mdi.c]
Use WM_PARENTNOTIFY messages to activate children.
Generate WM_CHILDACTIVATE messages.
Beginnings handler for maxmized child window.
Clean up when children are destroyed.
* [windows/message.c] [windows/nonclient.c] [windows/winpos.c]
Removed code add 94/03/26.
Apr 4, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [control/menu.c]
Make mouse menu navigation working again. :-))
(be carefull, clicking outside menus (ie.: clientrect)
not resolved yet)
* [windows/nonclient.c] [controls/scroll.c]
Bugs fix in NCTrackScrollBars().
* [misc/dos_fs.c]
Bug fix in 'ToDos()' in conversion for '/',
(example: '/window/' was translated to 'WINDOWs').
* [miscemu/int21.c]
Function ChangeDir() extract possible drive before DOS_ChangeDir().
* [loader/library.c] [loader/wine.c]
Playing around moving function GetProcAddress() and put some code in.
Mon Apr 4 21:39:07 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
* [misc/main.c]
Better explanation of command-line options.
* [objects/dib.c]
Implemented SetDIBitsToDevice().
* [windows/dc.c]
Bug fix in SetDCState().
* [windows/event.c]
Removed WS_DISABLED handling (now done in message.c).
* [windows/message.c]
Added sending a WM_PARENTNOTIFY message in MSG_TranslateMouseMsg().
Use WindowFromPoint() to find the window for mouse events, taking
into account disabled windows.
* [windows/painting.c]
Bug fix in BeginPaint() to allow calling it at other times than
on WM_PAINT (Solitaire needs it...)
* [windows/win.c]
Implemented FindWindow().
Rewritten EnableWindow() to behave more like Windows.
* [windows/winpos.c]
Rewritten WindowFromPoint() to also search child windows.
Mon Apr 4 17:36:32 1994 Erik Bos (erik@trashcan.hacktic.nl)
* [include/int21.h] -> [msdos.h]
renamed.
* [miscemu/int10.h] [miscemu/int25.h] [miscemu/int26.h]
new, added for int 10, 25 and 26.
* [miscemu/ioports.c]
new, added to allow win apps to use ioports.
* [loader/signal.c]
Added support for in, inb, out, outb instructions.
Sun Mar 27 13:40:25 1994 Bob Amstadt (bob@pooh)
* controls/menu.c (InsertMenu): Changed to use FindMenuItem().
Sat Mar 26 21:23:55 1994 Bob Amstadt (bob@pooh)
* [windows/mdi.c]
Window list properly updated.
* [windows/message.c]
Call WINPOS_ChildActivate() when mouse pressed.
* [windows/nonclient.c]
Use WINPOS_IsAnActiveWindow() instead of GetActiveWindow() in
NC_HandleNCPaint().
* [windows/winpos.c]
Created functions WINPOS_IsAnActiveWindow() and WINPOS_ActivateChild()
Thu Mar 24 14:49:17 1994 Bob Amstadt (bob@pooh)
* controls/menu.c (DeleteMenu): Changed to use FindMenuItem
(DeleteMenu): Many bug fixes.
* [controls/menu.c]
Created function FindMenuItem().
Thu Mar 24 14:17:24 1994 Bob Amstadt (bob@pooh)
* [windows/win.c]
Removed incorrect MDI handling code from CreateWindowEx().
* [controls/menu.c]
MF_STRING items needed to allocate a private copy of string.
* [controls/menu.c]
Fixed buggy calls to GlobalFree().
* [memory/global.c]
Eliminated some redundant code with function call.
Wed Mar 23 1994 Pentti Moilanen (pentti.moilanen@ntc.nokia.com)
* [windows/timer.c]
timer list pointers looped in InsertTimer
Tue Mar 29 13:32:08 MET DST 1994 julliard@di.epfl.ch (Alexandre Julliard)
* [misc/cursor.c]
A few changes for desktop window support.
* [misc/main.c]
Added -depth option.
* [misc/rect.c]
Yet another bug fix in SubtractRect().
* [objects/bitmap.c]
Changes to use only one depth (specified with -depth)
for color bitmaps.
* [objects/brush.c]
Added support for dithered solid brushes.
* [objects/color.c]
Use the same 20 system colors as in Windows.
System palette initialisation now done in COLOR_InitPalette().
Added support for a color mapping table to map logical color
indexes to X colormap entries.
Implemented GetNearestColor() and RealizeDefaultPalette().
* [objects/dib.c]
Added support for color mapping table.
* [objects/dither.c] (New file)
Implemented solid color dithering.
* [objects/palette.c]
Implemented GetSystemPaletteEntries() and SelectPalette().
* [windows/class.c]
Make a copy of the menu name in RegisterClass().
* [windows/dc.c]
Fixed device caps when using a desktop window.
Added support for the color mapping table in DCs.
* [windows/event.c]
Added ConfigureNotify handler on desktop window.
* [windows/message.c]
Removed call to XTranslateCoordinates() on every mouse motion
New function MSG_Synchronize() to synchronize with the X server.
* [windows/syscolor.c]
Rewritten SYSCOLOR_Init() to read the system colors from WIN.INI.
* [windows/winpos.c]
Added synchronization on window mapping. Solves the double redraw
problem when starting Solitaire.
Mar 27, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [control/menu.c] * [windows/defwnd.c]
Make keyboard navigation working with menubar,
but temporarely inserted a bug in menubar mouse handling ... :-((
(it will be fix next week !)
* [windows/defwnd.c]
Connect VK_MENU to menubar navigation.
* [loader/library.c]
GetModuleHandle() return 'fictive 0xF000+ handles' for built-in DLLs.
Sun Mar 20 22:32:13 1994 Erik Bos (erik@trashcan.hacktic.nl)
* [misc/main.c]
Added Copy(). Added a check for `-h' to show usage.
* [misc/dos_fs.c]
Fixed bug in FindFile(), to load directories as dlls.
* [misc/dos_fs.c]
Fixed ToUnix() and ToDos() again, as my previous patch
didn't make it.
* [misc/dos_fs.c] [miscemu/int21.c]
Bug fixes, should be able to handle all winfile and progman int21
requests now except for a few small things.
Tue Mar 29 06:25:54 1994 crw@harris.mlb.semi.harris.com (Carl Williams)
* [memory/heap.c]
Implemented GetFreeSystemResources().
Mon Mar 21 17:32:25 1994 Bob Amstadt (bob@pooh)
* controls/menu.c (GetSubMenu): Function did not return correct value
* [windows/mdi.c]
Beginnings of menu handling.
Thu Mar 10 11:32:06 1994 Stefan (SAM) Muenzel (muenzel@tat.physik.uni-tuebingen.de)
* [objects/font.c]
if font.width equals zero use asterix instead.
Mon Mar 21 17:23:37 MET 1994 julliard@di.epfl.ch (Alexandre Julliard)
* [objects/bitmap.c]
Rewritten bitmap code to use exclusively X pixmaps; *much* faster.
* [objects/brush.c]
Some changes with pattern brushes because of the new bitmap code.
* [objects/color.c]
Added function COLOR_ToPhysical for better color mapping.
* [objects/dib.c]
Heavily optimized SetDIBits().
* [windows/dc.c]
Opimized SetDCState() and DC_SetupGC*() functions.
Added stub for CreateIC().
Mar 20, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [misc/message.c]
Call SetFocus() after closing box to give back focus to previous owner.
* [misc/files.c]
Small bug fix in GetTempFilename() : replace a '\' to '\\'.
* [control/scroll.c]
Calls to BitBlt() replace by StretchBlt().
* [control/menu.c]
Call SetFocus() to previous owner after closing Popups.
Fill stub DeleteMenu().
* [control/listbox.c]
* [control/combo.c]
Use SetFocus() in WM_LBUTTONDOWN.
Close ComboBox List upon WM_KILLFOCUS.
Early development of WM_MEASUREITEM mecanism.
* [windows/defwnd.c]
Early development of WM_MEASUREITEM mecanism.
Tue Mar 22 10:44:57 1994 Miguel de Icaza (miguel@xochitl)
* [misc/atom.c]
Fixed sintaxis problem when building the library.
Tue Mar 15 13:11:56 1994 Bob Amstadt (bob@pooh)
* [include/windows.h]
Added message types and structures for MDI
* [include/mdi.h]
Created internal structures for handling MDI
* [windows/mdi.c]
Began creating MDI support
Thu Mar 10 16:51:46 1994 Bob Amstadt (bob@pooh)
* [loader/wine.c] [include/wine.h]
Added new field to "struct w_files" to hold the "name table"
resource for Windows 3.0 programs
* [loader/resource.c]
Added code to handle programs with a "name table" resource.
LoadResourceByName() modified to check for the existence of
this resource.
Mon Mar 14 22:31:42 MET 1994 julliard@di.epfl.ch (Alexandre Julliard)
* [objects/color.c]
Added installing the private colormap on the desktop window.
* [windows/event.c]
Cleaned up focus event handling (see focus.c).
Use GetFocus() to direct key events to the correct window.
* [windows/focus.c]
Rewritten SetFocus() to:
- only set X focus on top-level windows
- send WM_SETFOCUS and WM_KILLFOCUS messages (was done in event.c)
- prevent setting focus to disabled windows
- install private colormap so -privatemap option works again
* [windows/message.c] [windows/timer.c]
Changed timer management to no longer use PostMessage(), but
to generate timer messages on the fly. Also fixed a related bug
in GetMessage() which could cause busy-waiting.
* [windows/win.c]
Only select focus events on top-level windows.
* [windows/winpos.c]
Added some sanity checks for desktop window.
Fri Mar 4 20:42:01 1994 Erik Bos (erik@trashcan.hacktic.nl)
* [misc/dos_fs.c]
bug fixes in ToUnix(), WinIniFileName(), GetUnixFileName().
Support for tilde symbol added for rootdirectories in [drives]
section of wine's configfile.
* [misc/file.c]
hread(), hwrite() added.
* [misc/main.c]
hmemcpy() added.
* [if1632/stress.spec] [include/stress.h] [misc/stress.c]
Added STRESS.DLL, an useless dll used to stress a windows system.
* [*/*]
Added missing #includes, fixed prototypes for prototype checking.
* [include/prototypes.h]
Added prototypes for loader/*c, if1632/*c.
Tue Mar 8 09:54:34 1994 Bob Amstadt (bob@pooh)
* [Configure]
Added reminder to set WINEPATH, if it is not set.
* [Imakefile]
Removed #elif's
* [controls/button.c]
Added BN_CLICKED notification for owner-draw buttons.
* [if1632/kernel.spec] [memory/heap.c]
Changed Local* functions to WIN16_Local* to prevent unconcious use
of these functions.
* [if1632/relay.c]
Push old Stack16Frame on stack before setting.
* [include/atom.h] [misc/atom.c] [include/heap.h] [memory/local.c]
Added multiple local heap handling in Atom* functions.
* [include/regfunc.h] [miscemu/int21.c]
Rewrote DOS3Call() use context frame that is already on the stack.
* [misc/profile.c]
Fixed to allow leading ";" to mark comments.
* [misc/spy.c]
Fixed bugs and added support for "include" and "exclude" filters.
* [misc/user.c]
Rearranged calls in InitApp().
* [misc/font.c]
Fixed font handling to create system fonts, if they are used.
* [windows/dc.c]
If text drawn on window with no font specified, then default the
font to the system font.
Mon Mar 7 20:32:09 MET 1994 julliard@di.epfl.ch (Alexandre Julliard)
* [controls/desktop.c]
Added handling of WM_NCCREATE and WM_ERASEBKGND functions.
Implemented SetDeskPattern().
* [misc/main.c]
Added -desktop option to get a large desktop window with
everything inside it.
Added -name option.
* [misc/rect.c]
Bug fix in SubtractRect().
* [objects/*.c]
Replaced the DefaultRootWindow() macro by the rootWindow variable.
* [windows/event.c] [windows/message.c]
[windows/nonclient.c] [windows/win.c]
A few changes to accomodate the new desktop window.
Tue Mar 8 11:13:03 1994 Miguel de Icaza (miguel@xochitl.nuclecu.unam.mx)
* [toolkit/arch.c] --New file--
Routines for converting little endian data structures to
big-endian data structures, currently only BITMAP structures are
converted.
* [misc/atom.c]
When used as part of the WineLib, the code is much simpler.
Doesn't depend on alignement.
* [loader/wine.c]
Ifdefed Emulator dependent code if compiling WineLib.
* [loader/resource.c]
Moved misc/resource.c to loader/resource.c.
* [loader/dump.c,ldt.c,ldtlib.c,library,c,selector.c,signal.c]
Ifdefed whole code if compiling WINELIB.
* [include/winsock.h]
Added compilation define to allow compilation on SunOS.
* [include/wine.h]
Removed load_typeinfo and load_nameinfo prototypes, they belong
to neexe.h
* [include/neexe.h]
Added load_typeinfo and load_nameinfo prototypes.
* [include/arch.h]
Fixed some bugs in the conversion routines.
Added macros for Bitmap loading.
Tue Mar 8 12:52:05 1994 crw@maniac.mlb.semi.harris.com (Carl Williams)
* [if1632/kernel.spec] [memory/global.c]
Implemented GetFreeSpace()
* [if1632/user.spec] [loader/resource.c]
Implemented CreateIcon()
diff --git a/controls/menu.c b/controls/menu.c
index 53d9f0d..9ab0366 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -6,35 +6,44 @@
/*
#define DEBUG_MENU
-#define DEBUG_SYSMENU
*/
+#include <stdlib.h>
+#include <stdio.h>
#include "windows.h"
#include "sysmetrics.h"
+#include "prototypes.h"
#include "menu.h"
#include "heap.h"
#include "win.h"
-#define SC_ABOUTWINE SC_SCREENSAVE+1
-#define SC_SYSMENU SC_SCREENSAVE+2
-#define SC_ABOUTWINEDLG SC_SCREENSAVE+3
+#define SC_ABOUTWINE SC_SCREENSAVE+1
+#define SC_SYSMENU SC_SCREENSAVE+2
+#define SC_ABOUTWINEDLG SC_SCREENSAVE+3
extern HINSTANCE hSysRes;
HMENU hSysMenu = 0;
HBITMAP hStdCheck = 0;
HBITMAP hStdMnArrow = 0;
+static BOOL MenuHasFocus = FALSE;
LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd);
LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr);
void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
-void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
+BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y);
void StdDrawPopupMenu(HWND hwnd);
+void ResetHiliteFlags(LPPOPUPMENU lppop);
+BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop);
+void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex);
LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet);
LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet);
+BOOL ActivateMenuFocus(HWND hWnd);
+BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu);
void PopupMenuCalcSize(HWND hwnd);
void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
+LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags);
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos);
WORD GetSelectionKey(LPSTR str);
LPSTR GetShortCutString(LPSTR str);
@@ -51,491 +60,538 @@
*/
LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
{
- CREATESTRUCT *createStruct;
- WORD wRet;
- short x, y;
- WND *wndPtr;
- LPPOPUPMENU lppop, lppop2;
- LPMENUITEM lpitem, lpitem2;
- HMENU hSubMenu;
- RECT rect;
- HDC hDC;
- PAINTSTRUCT ps;
- switch(message)
- {
- case WM_CREATE:
+ CREATESTRUCT *createStruct;
+ WORD wRet;
+ short x, y;
+ WND *wndPtr;
+ LPPOPUPMENU lppop, lppop2;
+ LPMENUITEM lpitem, lpitem2;
+ HMENU hSubMenu;
+ RECT rect;
+ HDC hDC;
+ PAINTSTRUCT ps;
+ switch(message) {
+ case WM_CREATE:
#ifdef DEBUG_MENU
- printf("PopupMenu WM_CREATE lParam=%08X !\n", lParam);
+ printf("PopupMenu WM_CREATE lParam=%08X !\n", lParam);
#endif
- createStruct = (CREATESTRUCT *)lParam;
- lppop = (LPPOPUPMENU)createStruct->lpCreateParams;
- if (lppop == NULL) break;
- wndPtr = WIN_FindWndPtr(hwnd);
- *((LPPOPUPMENU *)&wndPtr->wExtra[1]) = lppop;
+ createStruct = (CREATESTRUCT *)lParam;
+ lppop = (LPPOPUPMENU)createStruct->lpCreateParams;
+ if (lppop == NULL) break;
+ wndPtr = WIN_FindWndPtr(hwnd);
+ *((LPPOPUPMENU *)&wndPtr->wExtra[1]) = lppop;
#ifdef DEBUG_MENU
- printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
+ printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
#endif
- if (hStdCheck == (HBITMAP)NULL)
- hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
- if (hStdMnArrow == (HBITMAP)NULL)
- hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
- return 0;
- case WM_DESTROY:
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (hStdCheck == (HBITMAP)NULL)
+ hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+ if (hStdMnArrow == (HBITMAP)NULL)
+ hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
+ return 0;
+ case WM_DESTROY:
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
#ifdef DEBUG_MENU
- printf("PopupMenu WM_DESTROY %lX !\n", lppop);
+ printf("PopupMenu WM_DESTROY %lX !\n", lppop);
#endif
- return 0;
- case WM_COMMAND:
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop->hWndParent != (HWND)NULL) {
- SendMessage(lppop->hWndParent, WM_COMMAND, wParam, lParam);
+ return 0;
+ case WM_COMMAND:
#ifdef DEBUG_MENU
- printf("PopupMenu // push to lower parent WM_COMMAND !\n");
+ printf("PopupMenuWndProc // WM_COMMAND received !\n");
#endif
- }
- else {
- if (lppop->SysFlag == 0) {
- SendMessage(lppop->ownerWnd, WM_COMMAND, wParam, lParam);
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+/* if (!lppop->BarFlag) ShowWindow(hwnd, SW_HIDE); */
+ if (lppop->SysFlag) {
+ MenuHasFocus = FALSE;
+ if (wParam == SC_ABOUTWINE) {
+ printf("SysMenu // Show 'About Wine ...' !\n");
+/* DialogBox(hSysRes, MAKEINTRESOURCE(SC_ABOUTWINEDLG), */
+ DialogBox(hSysRes, MAKEINTRESOURCE(2),
+ GetParent(hwnd), (FARPROC)AboutWine_Proc);
+ }
+ else
#ifdef DEBUG_MENU
- printf("PopupMenu // push to Owner WM_COMMAND !\n");
+ printf("PopupMenuWndProc // push to Owner WM_SYSCOMMAND !\n");
#endif
- }
- else {
-#ifdef DEBUG_SYSMENU
- printf("PopupMenu // push to Owner WM_SYSCOMMAND !\n");
-#endif
- SendMessage(lppop->ownerWnd, WM_SYSCOMMAND, wParam, lParam);
- }
- }
- if (lppop->BarFlags == 0) ShowWindow(hwnd, SW_HIDE);
- break;
- case WM_SHOWWINDOW:
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (wParam == 0 && lParam == 0L) {
- HideAllSubPopupMenu(lppop);
-#ifdef DEBUG_MENU
- printf("PopupMenu WM_SHOWWINDOW -> HIDE!\n");
-#endif
-/*
- UpdateWindow(lppop->ownerWnd);
-*/
- break;
- }
- lppop->FocusedItem = (WORD)-1;
- if (lppop->BarFlags == 0) {
- PopupMenuCalcSize(hwnd);
-#ifdef DEBUG_MENU
- printf("PopupMenu WM_SHOWWINDOW Width=%d Height=%d !\n",
- lppop->Width, lppop->Height);
-#endif
- SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height,
- SWP_NOZORDER | SWP_NOMOVE);
- }
- break;
- case WM_LBUTTONDOWN:
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- SetCapture(hwnd);
- MenuButtonDown(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
- break;
- case WM_LBUTTONUP:
- lppop = PopupMenuGetStorageHeader(hwnd);
- ReleaseCapture();
- MenuButtonUp(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
- break;
- case WM_MOUSEMOVE:
- lppop = PopupMenuGetStorageHeader(hwnd);
- MenuMouseMove(hwnd, lppop, wParam, LOWORD(lParam), HIWORD(lParam));
- break;
-
- case WM_KEYDOWN:
- case WM_KEYUP:
- if (lParam < 0L) break;
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop->FocusedItem == (WORD)-1) {
- if (wParam == VK_UP || wParam == VK_DOWN ||
- wParam == VK_LEFT || wParam == VK_RIGHT) {
- hDC = GetDC(hwnd);
- lppop->FocusedItem = 0;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- ReleaseDC(hwnd, hDC);
- }
- break;
- }
- switch(wParam) {
- case VK_UP:
- if (lppop->BarFlags != 0) break;
- if (lppop->FocusedItem < 1) break;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- hDC = GetDC(hwnd);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- lppop->FocusedItem--;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- ReleaseDC(hwnd, hDC);
- break;
- case VK_DOWN:
- if (lppop->BarFlags != 0) goto ProceedSPACE;
- if (lppop->FocusedItem >= lppop->nItems - 1) break;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- hDC = GetDC(hwnd);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- lppop->FocusedItem++;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- ReleaseDC(hwnd, hDC);
- break;
- case VK_LEFT:
- if (lppop->BarFlags == 0) {
- if (lppop->hWndParent != 0)
- SendMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
- break;
- }
- if (lppop->FocusedItem < 1) break;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- hDC = GetDC(hwnd);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- lppop->FocusedItem--;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- ReleaseDC(hwnd, hDC);
- break;
- case VK_RIGHT:
- if (lppop->BarFlags == 0) {
- if (lppop->hWndParent != 0)
- SendMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
- break;
- }
- if (lppop->FocusedItem >= lppop->nItems - 1) break;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- hDC = GetDC(hwnd);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- lppop->FocusedItem++;
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- ReleaseDC(hwnd, hDC);
- break;
- case VK_RETURN:
- case VK_SPACE:
-ProceedSPACE:
- printf("PopupMenu VK_SPACE !\n");
- lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- hSubMenu = (HMENU)lpitem->item_id;
- lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
- if (lppop2 == NULL) break;
- lppop2->hWndParent = hwnd;
- GetClientRect(hwnd, &rect);
- if (lppop->BarFlags != 0) {
- y = rect.bottom - rect.top;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- lpitem->rect.left, 0,
- 0, lppop->ownerWnd, (LPRECT)NULL);
+ PostMessage(lppop->ownerWnd, WM_SYSCOMMAND, wParam, lParam);
+/* PostMessage(lppop->hWndParent, WM_SYSCOMMAND, wParam, lParam); */
+ break;
}
- else {
- x = rect.right;
- GetWindowRect(hwnd, &rect);
- x += rect.left;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- x, lpitem->rect.top,
- 0, lppop->ownerWnd, (LPRECT)NULL);
- }
- GlobalUnlock(hSubMenu);
- break;
- }
- if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
- ShowWindow(lppop->hWnd, SW_HIDE);
- if (lppop->hWndParent != (HWND)NULL)
- SendMessage(lppop->hWndParent, WM_COMMAND,
- lpitem->item_id, 0L);
- else
- SendMessage(lppop->ownerWnd, WM_COMMAND,
- lpitem->item_id, 0L);
#ifdef DEBUG_MENU
- printf("PopupMenu // SendMessage WM_COMMAND wParam=%d !\n",
- lpitem->item_id);
+ printf("PopupMenuWndProc // push to Owner WM_COMMAND !\n");
#endif
- }
+ MenuHasFocus = FALSE;
+ PostMessage(lppop->hWndParent, WM_COMMAND, wParam, lParam);
+/* PostMessage(lppop->ownerWnd, WM_COMMAND, wParam, lParam); */
break;
- }
- break;
- case WM_CHAR:
- if (lParam < 0L) break;
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (wParam == VK_ESCAPE) {
- if (lppop->hWndParent != 0) {
- lppop2 = PopupMenuGetWindowAndStorage(
- lppop->hWndParent, &wndPtr);
- HideAllSubPopupMenu(lppop2);
- break;
- }
- if (lppop->FocusedItem != (WORD)-1) {
- lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
- hDC = GetDC(hwnd);
- if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem2->rect);
- }
- ReleaseDC(hwnd, hDC);
+ case WM_SHOWWINDOW:
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc // WM_SHOWWINDOW received !\n");
+#endif
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ if (wParam == 0 && lParam == 0L) {
+ HideAllSubPopupMenu(lppop);
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc hWnd=%04X WM_SHOWWINDOW -> HIDE!\n", hwnd);
+#endif
+ if (lppop->SysFlag) MenuHasFocus = FALSE;
+ SetFocus(lppop->hWndPrev);
+ break;
+ }
lppop->FocusedItem = (WORD)-1;
- }
- }
- if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A';
- lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet);
- if (lpitem != NULL) {
- printf("Found wRet=%d !\n", wRet);
- if (lppop->FocusedItem != (WORD)-1) {
- lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- hDC = GetDC(hwnd);
- if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem2->rect);
- }
- ReleaseDC(hwnd, hDC);
- }
- lppop->FocusedItem = wRet;
- goto ProceedSPACE;
- }
- break;
- case WM_PAINT:
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop->BarFlags == 0) {
- PopupMenuCalcSize(hwnd);
- StdDrawPopupMenu(hwnd);
- }
- break;
- default:
- return DefWindowProc( hwnd, message, wParam, lParam );
+ if (!lppop->BarFlag) {
+ PopupMenuCalcSize(hwnd);
+ ResetHiliteFlags(lppop);
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc hWnd=%04X WM_SHOWWINDOW Width=%d Height=%d !\n",
+ hwnd, lppop->Width, lppop->Height);
+#endif
+ SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height,
+ SWP_NOZORDER | SWP_NOMOVE);
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc // End of WM_SHOWWINDOW !\n");
+#endif
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ SetCapture(hwnd);
+ MenuButtonDown(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
+ break;
+ case WM_LBUTTONUP:
+ lppop = PopupMenuGetStorageHeader(hwnd);
+ if (lppop == NULL) break;
+ ReleaseCapture();
+ MenuButtonUp(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
+ break;
+ case WM_MOUSEMOVE:
+ lppop = PopupMenuGetStorageHeader(hwnd);
+ if (lppop == NULL) break;
+ MenuMouseMove(hwnd, lppop, wParam, LOWORD(lParam), HIWORD(lParam));
+ break;
+
+ case WM_KEYUP:
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc hWnd=%04X WM_KEYUP w=%04X l=%08X !\n",
+ hwnd, wParam, lParam);
+#endif
+ break;
+ case WM_KEYDOWN:
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc hWnd=%04X WM_KEYDOWN w=%04X l=%08X !\n",
+ hwnd, wParam, lParam);
+#endif
+ if (lParam < 0L) break;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ switch(wParam) {
+ case VK_HOME:
+ if (lppop->FocusedItem == 0) break;
+ MenuItemSelect(hwnd, lppop, 0);
+ break;
+ case VK_UP:
+ if (lppop->BarFlag) break;
+ if (lppop->FocusedItem < 1) break;
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem - 1);
+ break;
+ case VK_DOWN:
+ if (lppop->BarFlag) goto ProceedSPACE;
+ if (lppop->FocusedItem == (WORD)-1) {
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+ break;
+ }
+ if (lppop->FocusedItem >= lppop->nItems - 1) break;
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+ break;
+ case VK_LEFT:
+ if (lppop->SysFlag != 0) {
+ ShowWindow(hwnd, SW_HIDE);
+ hwnd = lppop->hWndParent;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ MenuItemSelect(hwnd, lppop, lppop->nItems - 1);
+ break;
+ }
+ if (lppop->BarFlag) {
+ if (lppop->FocusedItem < 1) {
+ MenuItemSelect(hwnd, lppop, -1);
+ NC_TrackSysMenu(hwnd);
+ break;
+ }
+ if (HideAllSubPopupMenu(lppop)) {
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem - 1);
+ goto ProceedSPACE;
+ }
+ }
+ if (lppop->hWndParent != 0) {
+ PostMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
+ break;
+ }
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem - 1);
+ break;
+ case VK_RIGHT:
+ if (lppop->SysFlag != 0) {
+ ShowWindow(hwnd, SW_HIDE);
+ hwnd = lppop->hWndParent;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ MenuItemSelect(hwnd, lppop, 0);
+ break;
+ }
+ if (lppop->BarFlag) {
+ if (lppop->FocusedItem >= lppop->nItems - 1) {
+ MenuItemSelect(hwnd, lppop, -1);
+ NC_TrackSysMenu(hwnd);
+ break;
+ }
+ if (HideAllSubPopupMenu(lppop)) {
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+ goto ProceedSPACE;
+ }
+ }
+ if (lppop->hWndParent != 0) {
+ PostMessage(lppop->hWndParent, WM_KEYDOWN, wParam, lParam);
+ break;
+ }
+ MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
+ break;
+ case VK_RETURN:
+ case VK_SPACE:
+ProceedSPACE: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ ExecFocusedMenuItem(hwnd, lppop);
+ break;
+ default:
+ break;
+ }
+ break;
+ case WM_CHAR:
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc hWnd=%04X WM_CHAR wParam=%04X !\n", hwnd, wParam);
+#endif
+ if (lParam < 0L) break;
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ if (wParam == VK_ESCAPE) {
+ if (lppop->BarFlag) {
+#ifdef DEBUG_MENU
+ printf("VK_ESCAPE // Unselect all MenuBar's Items !\n");
+#endif
+ if (lppop->FocusedItem != (WORD)-1)
+ MenuItemSelect(hwnd, lppop, -1);
+ }
+ if (lppop->SysFlag) {
+#ifdef DEBUG_MENU
+ printf("VK_ESCAPE // SysMenu !\n");
+#endif
+ ShowWindow(hwnd, SW_HIDE);
+ break;
+ }
+ if (lppop->hWndParent != 0) {
+#ifdef DEBUG_MENU
+ printf("VK_ESCAPE // Hide only SubPopup !\n");
+#endif
+ lppop2 = PopupMenuGetWindowAndStorage(lppop->hWndParent, &wndPtr);
+ if (lppop2 == NULL) break;
+ HideAllSubPopupMenu(lppop2);
+ break;
+ }
+ else {
+#ifdef DEBUG_MENU
+ printf("VK_ESCAPE // Hide Root Popup !\n");
+#endif
+ ShowWindow(hwnd, SW_HIDE);
+ MenuHasFocus = FALSE;
+ }
+ break;
+ }
+ if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A';
+ lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet);
+ if (lpitem != NULL) {
+ printf("Found wRet=%d !\n", wRet);
+ MenuItemSelect(hwnd, lppop, wRet);
+ lppop->FocusedItem = wRet;
+ goto ProceedSPACE;
+ }
+ if (lppop->hWndParent != (HWND)NULL)
+ SendMessage(lppop->hWndParent, WM_MENUCHAR, wParam,
+ MAKELONG(0, 0));
+ else
+ SendMessage(lppop->ownerWnd, WM_MENUCHAR, wParam,
+ MAKELONG(0, 0));
+ break;
+ case WM_PAINT:
+#ifdef DEBUG_MENU
+ printf("PopupMenuWndProc // WM_PAINT received !\n");
+#endif
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) break;
+ if (!lppop->BarFlag) {
+ PopupMenuCalcSize(hwnd);
+ StdDrawPopupMenu(hwnd);
+ }
+ break;
+ default:
+ return DefWindowProc(hwnd, message, wParam, lParam);
}
-return(0);
+return 0;
}
-void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
+BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop)
{
- HDC hDC;
- LPMENUITEM lpitem, lpitem2;
- RECT rect;
- HMENU hSubMenu;
- WORD wRet;
- LPPOPUPMENU lppop2;
- lpitem = MenuFindItem(lppop, x, y, &wRet);
-#ifdef DEBUG_MENU
- printf("MenuButtonDown // x=%d y=%d // wRet=%d lpitem=%08X !\n",
- x, y, wRet, lpitem);
-#endif
- if (lpitem != NULL) {
- if (lppop->FocusedItem != (WORD)-1) {
- HideAllSubPopupMenu(lppop);
- lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hDC = GetWindowDC(hWnd);
- InvertRect(hDC, &lpitem2->rect);
- ReleaseDC(hWnd, hDC);
- }
- }
- lppop->FocusedItem = wRet;
- if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hDC = GetWindowDC(hWnd);
- InvertRect(hDC, &lpitem->rect);
- ReleaseDC(hWnd, hDC);
- }
+ short x, y;
+ LPPOPUPMENU lppop2;
+ LPMENUITEM lpitem;
+ HMENU hSubMenu;
+ RECT rect;
+ lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem);
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- hSubMenu = (HMENU)lpitem->item_id;
- lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
- if (lppop2 == NULL) return;
- lppop2->hWndParent = hWnd;
- if (lppop->BarFlags != 0) {
- GetWindowRect(hWnd, &rect);
-/* y = rect.top + lppop->Height; */
- y = rect.top + lppop->rect.bottom;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- rect.left + lpitem->rect.left,
- y, 0, lppop->ownerWnd, (LPRECT)NULL);
+ hSubMenu = (HMENU)lpitem->item_id;
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL) return FALSE;
+ lppop2->hWndParent = hWnd;
+ lppop2->hWndPrev = GetFocus();
+ GetClientRect(hWnd, &rect);
+ if (lppop->BarFlag) {
+ GetWindowRect(hWnd, &rect);
+ y = rect.top + lppop->rect.bottom;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ rect.left + lpitem->rect.left,
+ y, 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ else {
+ x = lppop->rect.right;
+ GetWindowRect(hWnd, &rect);
+ x += rect.left;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ x, rect.top + lpitem->rect.top,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ GlobalUnlock(hSubMenu);
+ return TRUE;
}
- else {
- x = lppop->rect.right;
- GetWindowRect(hWnd, &rect);
- x += rect.left;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- x, rect.top + lpitem->rect.top,
- 0, lppop->ownerWnd, (LPRECT)NULL);
+ if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
+ MenuHasFocus = FALSE;
+ if (lppop->BarFlag) {
+ PostMessage(lppop->ownerWnd, WM_COMMAND, lpitem->item_id, 0L);
+ }
+ else {
+ ShowWindow(lppop->hWnd, SW_HIDE);
+ SendMessage(lppop->hWnd, WM_COMMAND, lpitem->item_id, 0L);
+ }
}
- GlobalUnlock(hSubMenu);
- }
- }
+ return TRUE;
+}
+
+
+
+BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
+{
+ HDC hDC;
+ LPMENUITEM lpitem, lpitem2;
+ RECT rect;
+ HMENU hSubMenu;
+ WORD wRet;
+ LPPOPUPMENU lppop2;
+ if (lppop == NULL) return;
+ lpitem = MenuFindItem(lppop, x, y, &wRet);
+#ifdef DEBUG_MENU
+ printf("MenuButtonDown // x=%d y=%d // wRet=%d lpitem=%08X !\n",
+ x, y, wRet, lpitem);
+#endif
+ if (lpitem != NULL) {
+ MenuItemSelect(hWnd, lppop, wRet);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ hSubMenu = (HMENU)lpitem->item_id;
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL) return;
+ lppop2->hWndParent = hWnd;
+ lppop2->hWndPrev = GetFocus();
+ if (lppop->BarFlag) {
+ GetWindowRect(hWnd, &rect);
+ y = rect.top + lppop->rect.bottom;
+ ReleaseCapture();
+ if (MenuHasFocus) {
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ rect.left + lpitem->rect.left,
+ y, 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ else {
+ MenuHasFocus = TRUE;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ rect.left + lpitem->rect.left,
+ y, 0, lppop->ownerWnd, (LPRECT)NULL);
+ MenuHasFocus = FALSE;
+ MenuFocusLoop(hWnd, lppop);
+ return TRUE;
+ }
+ }
+ else {
+ x = lppop->rect.right;
+ GetWindowRect(hWnd, &rect);
+ x += rect.left;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ x, rect.top + lpitem->rect.top,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ GlobalUnlock(hSubMenu);
+ }
+ return TRUE;
+ }
+ printf("MenuButtonDown // x=%d y=%d // Not Found !\n", x, y);
+ MenuHasFocus = FALSE;
+ ShowWindow(lppop->hWnd, SW_HIDE);
+ return FALSE;
}
void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
{
- HDC hDC;
- LPMENUITEM lpitem, lpitem2;
- RECT rect;
- HMENU hSubMenu;
- WORD wRet;
- LPPOPUPMENU lppop2;
- lpitem = MenuFindItem(lppop, x, y, &wRet);
+ HDC hDC;
+ LPMENUITEM lpitem, lpitem2;
+ RECT rect;
+ HMENU hSubMenu;
+ WORD wRet;
+ LPPOPUPMENU lppop2;
+ if (lppop == NULL) return;
+ lpitem = MenuFindItem(lppop, x, y, &wRet);
#ifdef DEBUG_MENU
- printf("MenuButtonUp // x=%d y=%d // wRet=%d lpitem=%08X !\n",
- x, y, wRet, lpitem);
+ printf("MenuButtonUp // x=%d y=%d // wRet=%d lpitem=%08X !\n",
+ x, y, wRet, lpitem);
#endif
- if (lpitem != NULL) {
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- return;
- }
- if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
- ShowWindow(lppop->hWnd, SW_HIDE);
- if (lppop->hWndParent != (HWND)NULL) {
- SendMessage(lppop->hWndParent, WM_COMMAND,
- lpitem->item_id, 0L);
-#ifdef DEBUG_MENU
- printf("MenuButtonUp // WM_COMMAND to ParentMenu wParam=%d !\n",
- lpitem->item_id);
-#endif
- }
- else {
- if (lppop->SysFlag == 0) {
-#ifdef DEBUG_MENU
- printf("PopupMenu // WM_COMMAND wParam=%d !\n",
- lpitem->item_id);
-#endif
- SendMessage(lppop->ownerWnd, WM_COMMAND,
- lpitem->item_id, 0L);
- }
- else {
- if (lpitem->item_id == SC_ABOUTWINE) {
- printf("SysMenu // Show 'About Wine ...' !\n");
-/* DialogBox(hSysRes, MAKEINTRESOURCE(SC_ABOUTWINEDLG), */
- DialogBox(hSysRes, MAKEINTRESOURCE(2),
- GetParent(hWnd), (FARPROC)AboutWine_Proc);
+ if (lpitem != NULL) {
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ return;
}
- else {
- SendMessage(lppop->ownerWnd, WM_SYSCOMMAND,
- lpitem->item_id, 0L);
-#ifdef DEBUG_SYSMENU
- printf("MenuButtonUp // WM_SYSCOMMAND wParam=%04X !\n",
- lpitem->item_id);
-#endif
+ if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
+ MenuHasFocus = FALSE;
+ if (lppop->BarFlag) {
+ PostMessage(lppop->ownerWnd, WM_COMMAND, lpitem->item_id, 0L);
+ }
+ else {
+ ShowWindow(lppop->hWnd, SW_HIDE);
+ SendMessage(lppop->hWnd, WM_COMMAND, lpitem->item_id, 0L);
+ }
+ return;
}
- }
}
-#ifdef DEBUG_MENU
- printf("MenuButtonUp // SendMessage WM_COMMAND wParam=%d !\n",
- lpitem->item_id);
-#endif
- return;
- }
- }
- if (lppop->FocusedItem != (WORD)-1) {
- HideAllSubPopupMenu(lppop);
- lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hDC = GetWindowDC(hWnd);
- InvertRect(hDC, &lpitem2->rect);
- ReleaseDC(hWnd, hDC);
- }
- }
+ if (lppop->FocusedItem != (WORD)-1) {
+ MenuItemSelect(hWnd, lppop, lppop->FocusedItem);
+ }
}
void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y)
{
- HDC hDC;
- LPMENUITEM lpitem, lpitem2;
- RECT rect;
- HMENU hSubMenu;
- WORD wRet;
- LPPOPUPMENU lppop2;
- if ((wParam & MK_LBUTTON) != 0) {
- lpitem = MenuFindItem(lppop, x, y, &wRet);
+ HDC hDC;
+ RECT rect;
+ HMENU hSubMenu;
+ LPMENUITEM lpitem, lpitem2;
+ LPPOPUPMENU lppop2;
+ WORD wRet;
+ if ((wParam & MK_LBUTTON) != 0) {
+ lpitem = MenuFindItem(lppop, x, y, &wRet);
#ifdef DEBUG_MENU
- printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n",
- x, y, wRet, lpitem);
+ printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n",
+ x, y, wRet, lpitem);
#endif
- if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
- lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
- hDC = GetWindowDC(hWnd);
- if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem2->rect);
+ if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
+ lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ hDC = GetWindowDC(hWnd);
+ if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
+ HideAllSubPopupMenu(lppop);
+ }
+ MenuItemSelect(hWnd, lppop, wRet);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ hSubMenu = (HMENU)lpitem->item_id;
+ lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+ if (lppop2 == NULL) {
+ ReleaseDC(hWnd, hDC);
+ return;
+ }
+ if (lppop->BarFlag) {
+ lppop2->hWndParent = hWnd;
+ lppop2->hWndPrev = GetFocus();
+ GetWindowRect(hWnd, &rect);
+ rect.top += lppop->rect.bottom;
+ TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
+ rect.left + lpitem->rect.left, rect.top,
+ 0, lppop->ownerWnd, (LPRECT)NULL);
+ }
+ GlobalUnlock(hSubMenu);
+ }
+ ReleaseDC(hWnd, hDC);
+ }
}
- if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
- HideAllSubPopupMenu(lppop);
- }
- lppop->FocusedItem = wRet;
- if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
- ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
- InvertRect(hDC, &lpitem->rect);
- }
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- hSubMenu = (HMENU)lpitem->item_id;
- lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
- if (lppop2 == NULL) {
- ReleaseDC(hWnd, hDC);
- return;
- }
- if (lppop->BarFlags != 0) {
- lppop2->hWndParent = hWnd;
- GetWindowRect(hWnd, &rect);
- rect.top += lppop->rect.bottom;
- TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
- rect.left + lpitem->rect.left, rect.top,
- 0, lppop->ownerWnd, (LPRECT)NULL);
- }
- GlobalUnlock(hSubMenu);
- }
- ReleaseDC(hWnd, hDC);
- }
- }
}
+void ResetHiliteFlags(LPPOPUPMENU lppop)
+{
+ HDC hDC;
+ LPMENUITEM lpitem;
+ int i;
+ if (lppop == NULL) return;
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) return;
+ lpitem->item_flags &= MF_HILITE ^ 0xFFFF;
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+}
+
+
+void MenuItemSelect0(HWND hWnd, LPPOPUPMENU lppop,
+ LPMENUITEM lpitem, WORD wIndex)
+{
+ LPMENUITEM lpprev;
+ if (lppop == NULL) return;
+ if (lppop->FocusedItem != (WORD)-1) {
+ lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
+ if (lpprev != NULL) {
+ lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
+ if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ if (lppop->BarFlag)
+ DrawMenuBar(hWnd);
+ else {
+ InvalidateRect(hWnd, &lpprev->rect, TRUE);
+ UpdateWindow(hWnd);
+ }
+ }
+ }
+ lppop->FocusedItem = wIndex;
+ if (lpitem == NULL || wIndex == (WORD)-1) {
+ ResetHiliteFlags(lppop);
+ if (lppop->BarFlag) DrawMenuBar(hWnd);
+ }
+ else {
+ lpitem->item_flags |= MF_HILITE;
+ if (lppop->BarFlag)
+ DrawMenuBar(hWnd);
+ else {
+ InvalidateRect(hWnd, &lpitem->rect, TRUE);
+ UpdateWindow(hWnd);
+ }
+ }
+ SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id,
+ MAKELONG(0, lpitem->item_flags));
+}
+
+
+void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex)
+{
+ LPMENUITEM lpitem;
+ lpitem = GetMenuItemPtr(lppop, wIndex);
+ MenuItemSelect0(hWnd, lppop, lpitem, wIndex);
+}
+
LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr)
{
@@ -543,10 +599,17 @@
LPPOPUPMENU lppop;
*(wndPtr) = Ptr = WIN_FindWndPtr(hwnd);
if (Ptr == 0) {
- printf("Bad Window handle on PopupMenu !\n");
- return 0;
+ printf("PopupMenuGetWindowAndStorage // Bad Window handle !\n");
+ return NULL;
}
lppop = *((LPPOPUPMENU *)&Ptr->wExtra[1]);
+ if (lppop == NULL) {
+ lppop = (LPPOPUPMENU) GlobalLock(Ptr->wIDmenu);
+ if (lppop == NULL) {
+ printf("PopupMenuGetWindowAndStorage // Bad Menu Handle !\n");
+ return NULL;
+ }
+ }
return lppop;
}
@@ -576,397 +639,446 @@
void StdDrawPopupMenu(HWND hwnd)
{
- WND *wndPtr;
- LPPOPUPMENU lppop;
- LPMENUITEM lpitem;
- PAINTSTRUCT ps;
- HBRUSH hBrush;
- HPEN hOldPen;
- HWND hWndParent;
- HDC hDC, hMemDC;
- RECT rect, rect2, rect3;
- DWORD OldTextColor;
- HFONT hOldFont;
- HBITMAP hBitMap;
- BITMAP bm;
- UINT i, x;
- hDC = BeginPaint( hwnd, &ps );
- if (!IsWindowVisible(hwnd)) {
- EndPaint( hwnd, &ps );
- return;
- }
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop == NULL) goto EndOfPaint;
- hBrush = GetStockObject(WHITE_BRUSH);
- GetClientRect(hwnd, &rect);
- GetClientRect(hwnd, &rect2);
- FillRect(hDC, &rect, hBrush);
- FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
- if (lppop->nItems == 0) goto EndOfPaint;
- lpitem = lppop->firstItem;
- if (lpitem == NULL) goto EndOfPaint;
- for(i = 0; i < lppop->nItems; i++) {
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ PAINTSTRUCT ps;
+ HBRUSH hBrush;
+ HPEN hOldPen;
+ HWND hWndParent;
+ HDC hDC, hMemDC;
+ RECT rect, rect2, rect3;
+ DWORD OldTextColor;
+ int OldBkMode;
+ HFONT hOldFont;
+ HBITMAP hBitMap;
+ BITMAP bm;
+ UINT i, x;
+ hDC = BeginPaint(hwnd, &ps);
+ if (!IsWindowVisible(hwnd)) {
+ EndPaint(hwnd, &ps);
+ return;
+ }
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) goto EndOfPaint;
+ hBrush = GetStockObject(WHITE_BRUSH);
+ GetClientRect(hwnd, &rect);
+ GetClientRect(hwnd, &rect2);
+ FillRect(hDC, &rect, hBrush);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+ if (lppop->nItems == 0) goto EndOfPaint;
+ lpitem = lppop->firstItem;
+ if (lpitem == NULL) goto EndOfPaint;
+ for(i = 0; i < lppop->nItems; i++) {
CopyRect(&rect2, &lpitem->rect);
if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
- hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
- MoveTo(hDC, rect2.left, rect2.top + 1);
- LineTo(hDC, rect2.right, rect2.top + 1);
- SelectObject(hDC, hOldPen);
- }
+ hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
+ MoveTo(hDC, rect2.left, rect2.top + 1);
+ LineTo(hDC, rect2.right, rect2.top + 1);
+ SelectObject(hDC, hOldPen);
+ }
if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- hMemDC = CreateCompatibleDC(hDC);
- if (lpitem->hCheckBit == 0) {
- SelectObject(hMemDC, hStdCheck);
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- }
- else {
- SelectObject(hMemDC, lpitem->hCheckBit);
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- }
- BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, lpitem->hUnCheckBit);
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ if (lpitem->hCheckBit == 0) {
+ SelectObject(hMemDC, hStdCheck);
+ GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+ }
+ else {
+ SelectObject(hMemDC, lpitem->hCheckBit);
+ GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ }
BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
}
- }
+ else {
+ if (lpitem->hUnCheckBit != 0) {
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, lpitem->hUnCheckBit);
+ GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect2.left, rect2.top + 1,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ }
if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- rect2.left += lppop->CheckWidth;
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect2.left, rect2.top,
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ rect2.left += lppop->CheckWidth;
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hBitMap);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect2.left, rect2.top,
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
+ DeleteDC(hMemDC);
+ if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+ InvertRect(hDC, &lpitem->rect);
+ }
if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
- OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+ ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ OldBkMode = SetBkMode(hDC, TRANSPARENT);
+ if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
+ OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+ else {
+ if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+ OldTextColor = SetTextColor(hDC, 0x00FFFFFFL);
+ else
+ OldTextColor = SetTextColor(hDC, 0x00000000L);
+ }
+ CopyRect(&rect3, &lpitem->rect);
+ if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+ FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH));
+ InflateRect(&rect3, 0, -2);
+ rect3.left += lppop->CheckWidth;
+ if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
+ DrawText(hDC, lpitem->item_text, x, &rect3,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+ DrawText(hDC, &lpitem->item_text[x], -1, &rect3,
+ DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
+ }
else
- OldTextColor = SetTextColor(hDC, 0x00000000L);
- CopyRect(&rect3, &lpitem->rect);
- InflateRect(&rect3, 0, -2);
- rect3.left += lppop->CheckWidth;
- if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
- DrawText(hDC, lpitem->item_text, x, &rect3,
- DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- DrawText(hDC, &lpitem->item_text[x], -1, &rect3,
- DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
- }
- else
- DrawText(hDC, lpitem->item_text, -1, &rect3,
- DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- SetTextColor(hDC, OldTextColor);
- SelectObject(hDC, hOldFont);
- CopyRect(&rect2, &lpitem->rect);
- }
+ DrawText(hDC, lpitem->item_text, -1, &rect3,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+ SetTextColor(hDC, OldTextColor);
+ SetBkMode(hDC, OldBkMode);
+ SelectObject(hDC, hOldFont);
+ CopyRect(&rect2, &lpitem->rect);
+ }
if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- CopyRect(&rect3, &lpitem->rect);
- rect3.left = rect3.right - lppop->PopWidth;
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hStdMnArrow);
- GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect3.left, rect3.top + 1,
+ CopyRect(&rect3, &lpitem->rect);
+ rect3.left = rect3.right - lppop->PopWidth;
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hStdMnArrow);
+ GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect3.left, rect3.top + 1,
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
+ DeleteDC(hMemDC);
+ }
if (lpitem->next == NULL) goto EndOfPaint;
lpitem = (LPMENUITEM)lpitem->next;
- }
+ }
EndOfPaint:
- EndPaint( hwnd, &ps );
+ EndPaint( hwnd, &ps );
}
void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
{
- LPMENUITEM lpitem;
- HBRUSH hBrush;
- HPEN hOldPen;
- HDC hMemDC;
- RECT rect, rect2, rect3;
- HFONT hOldFont;
- DWORD OldTextColor;
- HBITMAP hBitMap;
- BITMAP bm;
- UINT i, textwidth;
- if (lppop == NULL || lprect == NULL) return;
+ LPMENUITEM lpitem;
+ HBRUSH hBrush;
+ HPEN hOldPen;
+ HDC hMemDC;
+ RECT rect, rect2, rect3;
+ HFONT hOldFont;
+ DWORD OldTextColor;
+ int OldBkMode;
+ HBITMAP hBitMap;
+ BITMAP bm;
+ UINT i, textwidth;
+ if (lppop == NULL || lprect == NULL) return;
#ifdef DEBUG_MENU
- printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
+ printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
#endif
- MenuBarCalcSize(hDC, lprect, lppop);
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- hBrush = GetStockObject(WHITE_BRUSH);
- CopyRect(&rect, lprect);
- FillRect(hDC, &rect, hBrush);
- FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
- if (lppop->nItems == 0) goto EndOfPaint;
- lpitem = lppop->firstItem;
- if (lpitem == NULL) goto EndOfPaint;
- for(i = 0; i < lppop->nItems; i++) {
- CopyRect(&rect2, &lpitem->rect);
- if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- hMemDC = CreateCompatibleDC(hDC);
- if (lpitem->hCheckBit == 0) {
- SelectObject(hMemDC, hStdCheck);
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- }
- else {
- SelectObject(hMemDC, lpitem->hCheckBit);
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- }
- BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, lpitem->hUnCheckBit);
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect2.left, rect2.top + 1,
+ MenuBarCalcSize(hDC, lprect, lppop);
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ hBrush = GetStockObject(WHITE_BRUSH);
+ CopyRect(&rect, lprect);
+ FillRect(hDC, &rect, hBrush);
+ FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
+ if (lppop->nItems == 0) goto EndOfPaint;
+ lpitem = lppop->firstItem;
+ if (lpitem == NULL) goto EndOfPaint;
+ for(i = 0; i < lppop->nItems; i++) {
+ CopyRect(&rect2, &lpitem->rect);
+ if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+ hMemDC = CreateCompatibleDC(hDC);
+ if (lpitem->hCheckBit == 0) {
+ SelectObject(hMemDC, hStdCheck);
+ GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+ }
+ else {
+ SelectObject(hMemDC, lpitem->hCheckBit);
+ GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ }
+ BitBlt(hDC, rect2.left, rect2.top + 1,
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
+ DeleteDC(hMemDC);
+ }
+ else {
+ if (lpitem->hUnCheckBit != 0) {
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, lpitem->hUnCheckBit);
+ GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect2.left, rect2.top + 1,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ }
+ if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ hMemDC = CreateCompatibleDC(hDC);
+ SelectObject(hMemDC, hBitMap);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ BitBlt(hDC, rect2.left, rect2.top,
+ bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+ DeleteDC(hMemDC);
+ }
+ if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+ ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ OldBkMode = SetBkMode(hDC, TRANSPARENT);
+ if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
+ OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+ else {
+ if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+ OldTextColor = SetTextColor(hDC, 0x00FFFFFFL);
+ else
+ OldTextColor = SetTextColor(hDC, 0x00000000L);
+ }
+ if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
+ FillRect(hDC, &rect2, GetStockObject(BLACK_BRUSH));
+ DrawText(hDC, lpitem->item_text, -1, &rect2,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+ SetTextColor(hDC, OldTextColor);
+ SetBkMode(hDC, OldBkMode);
+ SelectObject(hDC, hOldFont);
+ }
+ if (lpitem->next == NULL) goto EndOfPaint;
+ lpitem = (LPMENUITEM)lpitem->next;
}
- }
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect2.left, rect2.top,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
- OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
- else
- OldTextColor = SetTextColor(hDC, 0x00000000L);
- DrawText(hDC, lpitem->item_text, -1, &rect2,
- DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- SetTextColor(hDC, OldTextColor);
- SelectObject(hDC, hOldFont);
- }
- if (lpitem->next == NULL) goto EndOfPaint;
- lpitem = (LPMENUITEM)lpitem->next;
- }
EndOfPaint:
- SelectObject(hDC, hOldFont);
+ SelectObject(hDC, hOldFont);
}
LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet)
{
- LPMENUITEM lpitem;
- UINT i;
- if (lpRet != NULL) *lpRet = 0;
- if (lppop == NULL) return NULL;
- if (lppop->nItems == 0) return NULL;
- lpitem = lppop->firstItem;
- for(i = 0; i < lppop->nItems; i++) {
- if (lpitem == NULL) return NULL;
+ LPMENUITEM lpitem;
+ UINT i;
+ if (lpRet != NULL) *lpRet = 0;
+ if (lppop == NULL) return NULL;
+ if (lppop->nItems == 0) return NULL;
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) return NULL;
#ifdef DEBUG_MENUFINDITEM
- printf("FindItem // left=%d top=%d right=%d bottom=%d\n",
+ printf("FindItem // left=%d top=%d right=%d bottom=%d\n",
lpitem->rect.left, lpitem->rect.top,
lpitem->rect.right, lpitem->rect.bottom);
#endif
- if (x > lpitem->rect.left && x < lpitem->rect.right &&
- y > lpitem->rect.top && y < lpitem->rect.bottom) {
- if (lpRet != NULL) *lpRet = i;
- return lpitem;
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- return NULL;
+ if (x > lpitem->rect.left && x < lpitem->rect.right &&
+ y > lpitem->rect.top && y < lpitem->rect.bottom) {
+ if (lpRet != NULL) *lpRet = i;
+ return lpitem;
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return NULL;
}
LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet)
{
- LPMENUITEM lpitem;
- UINT i;
- if (lppop == NULL) return NULL;
- if (lppop->nItems == 0) return NULL;
- lpitem = lppop->firstItem;
- for(i = 0; i < lppop->nItems; i++) {
- if (lpitem == NULL) return NULL;
+ LPMENUITEM lpitem;
+ UINT i;
+ if (lppop == NULL) return NULL;
+ if (lppop->nItems == 0) return NULL;
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) return NULL;
#ifdef DEBUG_MENUFINDITEM
- printf("FindItemBySelKey // key=%d lpitem->sel_key=%d\n",
- key, lpitem->sel_key);
+ printf("FindItemBySelKey // key=%d lpitem->sel_key=%d\n",
+ key, lpitem->sel_key);
#endif
- if (key == lpitem->sel_key) {
- if (lpRet != NULL) *lpRet = i;
- return lpitem;
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- return NULL;
+ if (key == lpitem->sel_key) {
+ if (lpRet != NULL) *lpRet = i;
+ return lpitem;
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return NULL;
}
void PopupMenuCalcSize(HWND hwnd)
{
- WND *wndPtr;
- LPPOPUPMENU lppop;
- LPMENUITEM lpitem;
- HDC hDC;
- RECT rect;
- HBITMAP hBitMap;
- BITMAP bm;
- HFONT hOldFont;
- UINT i, OldWidth, TempWidth;
- DWORD dwRet;
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ HDC hDC;
+ RECT rect;
+ HBITMAP hBitMap;
+ BITMAP bm;
+ HFONT hOldFont;
+ UINT i, OldWidth, TempWidth;
+ DWORD dwRet;
#ifdef DEBUG_MENUCALC
printf("PopupMenuCalcSize hWnd=%04X !\n", hWnd);
#endif
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop == NULL) return;
- if (lppop->nItems == 0) return;
- hDC = GetDC(hwnd);
- lppop->Width = 20;
- lppop->CheckWidth = lppop->PopWidth = 0;
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ if (lppop == NULL) return;
+ if (lppop->nItems == 0) return;
+ hDC = GetDC(hwnd);
+ lppop->Width = 20;
+ lppop->CheckWidth = lppop->PopWidth = 0;
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
CalcAGAIN:
- OldWidth = lppop->Width;
- SetRect(&rect, 1, 1, OldWidth, 0);
- lpitem = lppop->firstItem;
- for(i = 0; i < lppop->nItems; i++) {
- if (lpitem == NULL) break;
+ OldWidth = lppop->Width;
+ SetRect(&rect, 1, 1, OldWidth, 0);
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) break;
#ifdef DEBUG_MENUCALC
- printf("PopupMenuCalcSize item #%d !\n", i);
+ printf("PopupMenuCalcSize item #%d !\n", i);
#endif
- rect.right = rect.left + lppop->Width;
- if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- if (lpitem->hCheckBit != 0)
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- else
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+ rect.right = rect.left + lppop->Width;
+ if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+ if (lpitem->hCheckBit != 0)
+ GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ else
+ GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+ lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+ }
+ else {
+ if (lpitem->hUnCheckBit != 0) {
+ GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+ lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+ }
+ }
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
+ lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth);
+ }
+ if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
+ rect.bottom = rect.top + 3;
+ }
+ if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ rect.bottom = rect.top + bm.bmHeight;
+ lppop->Width = max(lppop->Width, bm.bmWidth);
+ }
+ if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+ ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
+ strlen((char *)lpitem->item_text));
+ rect.bottom = rect.top + HIWORD(dwRet);
+ InflateRect(&rect, 0, 2);
+ TempWidth = LOWORD(dwRet);
+ if (GetShortCutPos(lpitem->item_text) != (WORD)-1)
+ TempWidth += 15;
+ TempWidth += lppop->CheckWidth;
+ TempWidth += lppop->PopWidth;
+ lppop->Width = max(lppop->Width, TempWidth);
+ }
+ CopyRect(&lpitem->rect, &rect);
+ rect.top = rect.bottom;
+ lpitem = (LPMENUITEM)lpitem->next;
}
- }
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
- lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth);
- }
- if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
- rect.bottom = rect.top + 3;
- }
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- rect.bottom = rect.top + bm.bmHeight;
- lppop->Width = max(lppop->Width, bm.bmWidth);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
- strlen((char *)lpitem->item_text));
- rect.bottom = rect.top + HIWORD(dwRet);
- InflateRect(&rect, 0, 2);
- TempWidth = LOWORD(dwRet);
- if (GetShortCutPos(lpitem->item_text) != (WORD)-1)
- TempWidth += 15;
- TempWidth += lppop->CheckWidth;
- TempWidth += lppop->PopWidth;
- lppop->Width = max(lppop->Width, TempWidth);
- }
- CopyRect(&lpitem->rect, &rect);
- rect.top = rect.bottom;
- lpitem = (LPMENUITEM)lpitem->next;
- }
- if (OldWidth < lppop->Width) goto CalcAGAIN;
- lppop->Height = rect.bottom;
- SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
+ if (OldWidth < lppop->Width) goto CalcAGAIN;
+ lppop->Height = rect.bottom;
+ SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
#ifdef DEBUG_MENUCALC
- printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
+ printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
#endif
- SelectObject(hDC, hOldFont);
- ReleaseDC(hwnd, hDC);
+ SelectObject(hDC, hOldFont);
+ ReleaseDC(hwnd, hDC);
}
void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
{
- LPMENUITEM lpitem;
- RECT rect;
- HBITMAP hBitMap;
- BITMAP bm;
- HFONT hOldFont;
- UINT i, OldHeight;
- DWORD dwRet;
- if (lppop == NULL) return;
- if (lppop->nItems == 0) return;
+ LPMENUITEM lpitem;
+ RECT rect;
+ HBITMAP hBitMap;
+ BITMAP bm;
+ HFONT hOldFont;
+ UINT i, OldHeight;
+ DWORD dwRet;
+ if (lppop == NULL) return;
+ if (lppop->nItems == 0) return;
#ifdef DEBUG_MENUCALC
- printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n",
- lprect->left, lprect->top, lprect->right, lprect->bottom);
+ printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n",
+ lprect->left, lprect->top, lprect->right, lprect->bottom);
#endif
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- lppop->Height = lprect->bottom - lprect->top;
+ hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+ lppop->Height = lprect->bottom - lprect->top;
CalcAGAIN:
- OldHeight = lppop->Height;
- SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + OldHeight);
- lpitem = lppop->firstItem;
- for(i = 0; i < lppop->nItems; i++) {
- if (lpitem == NULL) break;
- rect.bottom = lprect->top + lppop->Height;
- if (rect.right > lprect->right)
- SetRect(&rect, lprect->left, rect.bottom,
- 0, rect.bottom + SYSMETRICS_CYMENU);
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- rect.right = rect.left + bm.bmWidth;
- lppop->Height = max(lppop->Height, bm.bmHeight);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
- strlen((char *)lpitem->item_text));
- rect.right = rect.left + LOWORD(dwRet) + 10;
- lppop->Height = max(lppop->Height, HIWORD(dwRet) + 10);
- }
- CopyRect(&lpitem->rect, &rect);
- rect.left = rect.right;
- lpitem = (LPMENUITEM)lpitem->next;
- }
- if (OldHeight < lppop->Height) goto CalcAGAIN;
- lppop->Width = rect.right;
- lprect->bottom = lprect->top + lppop->Height;
- CopyRect(&lppop->rect, lprect);
+ OldHeight = lppop->Height;
+ SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + OldHeight);
+ lpitem = lppop->firstItem;
+ for(i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) break;
+ rect.bottom = lprect->top + lppop->Height;
+ if (rect.right > lprect->right)
+ SetRect(&rect, lprect->left, rect.bottom,
+ 0, rect.bottom + SYSMETRICS_CYMENU);
+ if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
+ hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+ rect.right = rect.left + bm.bmWidth;
+ lppop->Height = max(lppop->Height, bm.bmHeight);
+ }
+ if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
+ ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+ ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+ dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
+ strlen((char *)lpitem->item_text));
+ rect.right = rect.left + LOWORD(dwRet) + 10;
+ dwRet = max(SYSMETRICS_CYMENU, (HIWORD(dwRet) + 6));
+ lppop->Height = max(lppop->Height, (WORD)dwRet);
+ }
+ CopyRect(&lpitem->rect, &rect);
+ rect.left = rect.right;
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ if (OldHeight < lppop->Height) goto CalcAGAIN;
+ lppop->Width = rect.right;
+ lprect->bottom = lprect->top + lppop->Height;
+ CopyRect(&lppop->rect, lprect);
#ifdef DEBUG_MENUCALC
- printf("MenuBarCalcSize w=%d h=%d !\n",
- lppop->Width, lppop->Height);
+ printf("MenuBarCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
#endif
- SelectObject(hDC, hOldFont);
+ SelectObject(hDC, hOldFont);
}
+/***********************************************************************
+ * FindMenuItem
+ */
+LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags)
+{
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) {
+ GlobalUnlock(hMenu);
+ return FALSE;
+ }
+ lpitem = menu->firstItem;
+ if (wFlags & MF_BYPOSITION) {
+ for (i = 0; i < nPos; i++, lpitem = lpitem->next)
+ if (lpitem == NULL) return NULL;
+ }
+ else {
+ for (i = 0; i < menu->nItems && lpitem != NULL; i++) {
+ if (lpitem->item_id == nPos) return lpitem;
+ lpitem = lpitem->next;
+ }
+ return NULL;
+ }
+ return lpitem;
+}
+
+
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos)
{
LPMENUITEM lpitem;
@@ -984,92 +1096,89 @@
WORD GetSelectionKey(LPSTR str)
{
- int i;
- WORD sel_key;
- for (i = 0; i < strlen(str); i++) {
- if (str[i] == '&' && str[i + 1] != '&')
- {
- sel_key = str[i + 1];
- if (sel_key >= 'a' && sel_key <= 'z') sel_key -= 'a' - 'A';
+ int i;
+ WORD sel_key;
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == '&' && str[i + 1] != '&') {
+ sel_key = str[i + 1];
+ if (sel_key >= 'a' && sel_key <= 'z') sel_key -= 'a' - 'A';
#ifdef DEBUG_MENU
- printf("GetSelectionKey // %04X\n", sel_key);
+ printf("GetSelectionKey // %04X\n", sel_key);
#endif
- return sel_key;
- }
- }
+ return sel_key;
+ }
+ }
#ifdef DEBUG_MENU
- printf("GetSelectionKey NULL \n");
+ printf("GetSelectionKey NULL \n");
#endif
- return 0;
+ return 0;
}
LPSTR GetShortCutString(LPSTR str)
{
- int i;
- LPSTR str2;
- for (i = 0; i < strlen(str); i++) {
- if (str[i] == '\t' && str[i + 1] != '\t')
- {
- str2 = &str[i + 1];
+ int i;
+ LPSTR str2;
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == '\t' && str[i + 1] != '\t') {
+ str2 = &str[i + 1];
#ifdef DEBUG_MENUSHORTCUT
- printf("GetShortCutString // '%s' \n", str2);
+ printf("GetShortCutString // '%s' \n", str2);
#endif
- return str2;
- }
- }
+ return str2;
+ }
+ }
#ifdef DEBUG_MENUSHORTCUT
- printf("GetShortCutString NULL \n");
+ printf("GetShortCutString NULL \n");
#endif
- return NULL;
+ return NULL;
}
WORD GetShortCutPos(LPSTR str)
{
- int i;
- for (i = 0; i < strlen(str); i++) {
- if (str[i] == '\t' && str[i + 1] != '\t')
- {
+ int i;
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == '\t' && str[i + 1] != '\t') {
#ifdef DEBUG_MENUSHORTCUT
- printf("GetShortCutPos = %d \n", i);
+ printf("GetShortCutPos = %d \n", i);
#endif
- return i;
- }
- }
+ return i;
+ }
+ }
#ifdef DEBUG_MENUSHORTCUT
- printf("GetShortCutString NULL \n");
+ printf("GetShortCutString NULL \n");
#endif
- return -1;
+ return -1;
}
BOOL HideAllSubPopupMenu(LPPOPUPMENU menu)
{
- LPPOPUPMENU submenu;
- LPMENUITEM lpitem;
- BOOL someClosed = FALSE;
- int i;
- if (menu == NULL) return;
- lpitem = menu->firstItem;
- for (i = 0; i < menu->nItems; i++) {
- if (lpitem == NULL) return;
- if (lpitem->item_flags & MF_POPUP) {
- submenu = (LPPOPUPMENU) GlobalLock((HMENU)lpitem->item_id);
- if (submenu != NULL) {
- if (IsWindowVisible(submenu->hWnd)) {
- ShowWindow(submenu->hWnd, SW_HIDE);
- someClosed = TRUE;
- }
- GlobalUnlock((HMENU)lpitem->item_id);
- }
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- return someClosed;
+ LPPOPUPMENU submenu;
+ LPMENUITEM lpitem;
+ BOOL someClosed = FALSE;
+ int i;
+ if (menu == NULL) return;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) return;
+ if (lpitem->item_flags & MF_POPUP) {
+ submenu = (LPPOPUPMENU) GlobalLock((HMENU)lpitem->item_id);
+ if (submenu != NULL) {
+ if (IsWindowVisible(submenu->hWnd)) {
+ ShowWindow(submenu->hWnd, SW_HIDE);
+ someClosed = TRUE;
+ }
+ GlobalUnlock((HMENU)lpitem->item_id);
+ }
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return someClosed;
}
@@ -1081,22 +1190,17 @@
BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem,
WORD wItemID, WORD wFlags)
{
- if (wFlags & MF_APPEND) {
- return AppendMenu(hMenu, wFlags, wItemID, lpNewItem);
- }
- if (wFlags & MF_DELETE) {
- return DeleteMenu(hMenu, wItemID, wFlags);
- }
- if (wFlags & MF_INSERT) {
- return InsertMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
- }
- if (wFlags & MF_CHANGE) {
- return ModifyMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
- }
- if (wFlags & MF_REMOVE) {
- return RemoveMenu(hMenu, wItemID, wFlags);
- }
- return FALSE;
+ if (wFlags & MF_APPEND)
+ return AppendMenu(hMenu, wFlags, wItemID, lpNewItem);
+ if (wFlags & MF_DELETE)
+ return DeleteMenu(hMenu, wItemID, wFlags);
+ if (wFlags & MF_INSERT)
+ return InsertMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
+ if (wFlags & MF_CHANGE)
+ return ModifyMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
+ if (wFlags & MF_REMOVE)
+ return RemoveMenu(hMenu, wItemID, wFlags);
+ return FALSE;
}
@@ -1105,30 +1209,30 @@
*/
BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
- WND *wndPtr;
- LPPOPUPMENU menu;
- LPMENUITEM lpitem;
- int i;
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
- printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+ printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
#endif
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) return FALSE;
- lpitem = menu->firstItem;
- for (i = 0; i < menu->nItems; i++) {
- if (lpitem == NULL) break;
- if (i == wItemID) {
- if (wFlags && MF_CHECKED)
- lpitem->item_flags |= MF_CHECKED;
- else
- lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
- GlobalUnlock(hMenu);
- return(TRUE);
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- GlobalUnlock(hMenu);
- return FALSE;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == wItemID) {
+ if (wFlags && MF_CHECKED)
+ lpitem->item_flags |= MF_CHECKED;
+ else
+ lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
+ GlobalUnlock(hMenu);
+ return(TRUE);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ GlobalUnlock(hMenu);
+ return FALSE;
}
@@ -1137,30 +1241,30 @@
*/
BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
- WND *wndPtr;
- LPPOPUPMENU menu;
- LPMENUITEM lpitem;
- int i;
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
- printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+ printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
#endif
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) return FALSE;
- lpitem = menu->firstItem;
- for (i = 0; i < menu->nItems; i++) {
- if (lpitem == NULL) break;
- if (i == wItemID) {
- if (wFlags && MF_DISABLED)
- lpitem->item_flags |= MF_DISABLED;
- else
- lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
- GlobalUnlock(hMenu);
- return(TRUE);
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- GlobalUnlock(hMenu);
- return FALSE;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == wItemID) {
+ if (wFlags && MF_DISABLED)
+ lpitem->item_flags |= MF_DISABLED;
+ else
+ lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
+ GlobalUnlock(hMenu);
+ return(TRUE);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ GlobalUnlock(hMenu);
+ return FALSE;
}
@@ -1169,61 +1273,56 @@
*/
BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
{
- WND *wndPtr;
- LPPOPUPMENU menu;
- HANDLE hNewItem;
- LPMENUITEM lpitem, lpitem2;
- int i;
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ HANDLE hNewItem;
+ LPMENUITEM lpitem, lpitem2;
+ int i;
#ifdef DEBUG_MENU
- if (wFlags & MF_STRING)
- printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
- hMenu, wFlags, wItemID, lpNewItem);
- else
- printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
- hMenu, nPos, wFlags, wItemID, lpNewItem);
+ if (wFlags & MF_STRING)
+ printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
+ hMenu, wFlags, wItemID, lpNewItem);
+ else
+ printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
+ hMenu, nPos, wFlags, wItemID, lpNewItem);
#endif
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) return FALSE;
- lpitem = menu->firstItem;
- for (i = 0; i < menu->nItems; i++) {
- if (lpitem == NULL) break;
- if (i == nPos) break;
- lpitem = (LPMENUITEM)lpitem->next;
- printf("InsertMenu // during loop items !\n");
- }
- printf("InsertMenu // after loop items !\n");
- hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
- if (hNewItem == 0) {
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = FindMenuItem(hMenu, nPos, wFlags);
+ hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
+ if (hNewItem == 0) {
+ GlobalUnlock(hMenu);
+ return FALSE;
+ }
+ lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
+ if (lpitem2 == NULL) {
+ GlobalFree(hNewItem);
+ GlobalUnlock(hMenu);
+ return FALSE;
+ }
+ lpitem2->item_flags = wFlags;
+ lpitem2->item_id = wItemID;
+ if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
+ MF_MENUBREAK | MF_SEPARATOR))) {
+ lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1);
+ strcpy(lpitem2->item_text, lpNewItem);
+ lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
+ }
+ else {
+ lpitem2->item_text = lpNewItem;
+ }
+
+ lpitem2->prev = lpitem;
+ if (lpitem->next != NULL)
+ lpitem2->next = lpitem->next;
+ else
+ lpitem2->next = NULL;
+ lpitem->next = lpitem2;
+ lpitem2->child = NULL;
+ lpitem2->parent = NULL;
+ menu->nItems++;
GlobalUnlock(hMenu);
- return FALSE;
- }
- lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
- if (lpitem2 == NULL) {
- GlobalFree(hNewItem);
- GlobalUnlock(hMenu);
- return FALSE;
- }
- lpitem2->item_flags = wFlags;
- lpitem2->item_id = wItemID;
- if (((wFlags & MF_BITMAP) != MF_BITMAP) &&
- ((wFlags & MF_MENUBREAK) != MF_MENUBREAK) &&
- ((wFlags & MF_STRING) != MF_SEPARATOR)) {
- lpitem2->item_text = lpNewItem;
- lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
- }
- else
- lpitem2->item_text = lpNewItem;
- lpitem2->prev = lpitem;
- if (lpitem->next != NULL)
- lpitem2->next = lpitem->next;
- else
- lpitem2->next = NULL;
- lpitem->next = lpitem2;
- lpitem2->child = NULL;
- lpitem2->parent = NULL;
- menu->nItems++;
- GlobalUnlock(hMenu);
- return TRUE;
+ return TRUE;
}
@@ -1232,61 +1331,62 @@
*/
BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
{
- WND *wndPtr;
- LPPOPUPMENU menu;
- HANDLE hNewItem;
- LPMENUITEM lpitem, lpitem2;
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ HANDLE hNewItem;
+ LPMENUITEM lpitem, lpitem2;
#ifdef DEBUG_MENU
- if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
- printf("AppendMenu (%04X, %04X, %04X, '%s') !\n",
- hMenu, wFlags, wItemID, lpNewItem);
- else
- printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
- hMenu, wFlags, wItemID, lpNewItem);
+ if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
+ printf("AppendMenu (%04X, %04X, %04X, '%s') !\n",
+ hMenu, wFlags, wItemID, lpNewItem);
+ else
+ printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
+ hMenu, wFlags, wItemID, lpNewItem);
#endif
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) return FALSE;
- lpitem = menu->firstItem;
- if (lpitem != NULL) {
- while (lpitem->next != NULL) {
- lpitem = (LPMENUITEM)lpitem->next;
- }
- }
- hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
- if (hNewItem == 0) {
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ if (lpitem != NULL) {
+ while (lpitem->next != NULL) {
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ }
+ hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
+ if (hNewItem == 0) {
+ GlobalUnlock(hMenu);
+ return FALSE;
+ }
+ lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
+ if (lpitem2 == NULL) {
+ GlobalFree(hNewItem);
+ GlobalUnlock(hMenu);
+ return FALSE;
+ }
+ lpitem2->item_flags = wFlags;
+ lpitem2->item_id = wItemID;
+ if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
+ MF_MENUBREAK | MF_SEPARATOR))) {
+ lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1);
+ strcpy(lpitem2->item_text, lpNewItem);
+ lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
+ }
+ else {
+ lpitem2->item_text = lpNewItem;
+ }
+
+ if (lpitem == NULL)
+ menu->firstItem = lpitem2;
+ else
+ lpitem->next = lpitem2;
+ lpitem2->prev = lpitem;
+ lpitem2->next = NULL;
+ lpitem2->child = NULL;
+ lpitem2->parent = NULL;
+ lpitem2->hCheckBit = (HBITMAP)NULL;
+ lpitem2->hUnCheckBit = (HBITMAP)NULL;
+ menu->nItems++;
GlobalUnlock(hMenu);
- return FALSE;
- }
- lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
- if (lpitem2 == NULL) {
- GlobalFree(hNewItem);
- GlobalUnlock(hMenu);
- return FALSE;
- }
- lpitem2->item_flags = wFlags;
- lpitem2->item_id = wItemID;
- if (((wFlags & MF_BITMAP) != MF_BITMAP) &&
- ((wFlags & MF_MENUBREAK) != MF_MENUBREAK) &&
- ((wFlags & MF_STRING) != MF_SEPARATOR)) {
- lpitem2->item_text = lpNewItem;
- lpitem2->sel_key = GetSelectionKey(lpitem2->item_text);
- lpitem2->shortcut = GetShortCutString(lpitem2->item_text);
- }
- else
- lpitem2->item_text = lpNewItem;
- if (lpitem == NULL)
- menu->firstItem = lpitem2;
- else
- lpitem->next = lpitem2;
- lpitem2->prev = lpitem;
- lpitem2->next = NULL;
- lpitem2->child = NULL;
- lpitem2->parent = NULL;
- lpitem2->hCheckBit = (HBITMAP)NULL;
- lpitem2->hUnCheckBit = (HBITMAP)NULL;
- menu->nItems++;
- GlobalUnlock(hMenu);
- return TRUE;
+ return TRUE;
}
@@ -1295,31 +1395,36 @@
*/
BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
{
- WND *wndPtr;
- LPPOPUPMENU menu;
- LPMENUITEM lpitem;
- int i;
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
- printf("RemoveMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
+ printf("RemoveMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
#endif
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) return FALSE;
- lpitem = menu->firstItem;
- for (i = 0; i < menu->nItems; i++) {
- if (lpitem == NULL) break;
- if (i == nPos) {
- lpitem->prev->next = lpitem->next;
- lpitem->next->prev = lpitem->prev;
- GlobalFree(HIWORD(lpitem));
- GlobalUnlock(hMenu);
- return(TRUE);
- }
- lpitem = (LPMENUITEM)lpitem->next;
- printf("RemoveMenu // during loop items !\n");
- }
- printf("RemoveMenu // after loop items !\n");
- GlobalUnlock(hMenu);
- return FALSE;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == nPos) {
+ lpitem->prev->next = lpitem->next;
+ lpitem->next->prev = lpitem->prev;
+ if (!(lpitem->item_flags &
+ (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
+ MF_MENUBREAK | MF_SEPARATOR))) {
+ GlobalFree(lpitem->item_text);
+ }
+ GlobalFree(lpitem);
+ GlobalUnlock(hMenu);
+ return TRUE;
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ printf("RemoveMenu // during loop items !\n");
+ }
+ printf("RemoveMenu // after loop items !\n");
+ GlobalUnlock(hMenu);
+ return FALSE;
}
@@ -1328,10 +1433,42 @@
*/
BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags)
{
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
printf("DeleteMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags);
#endif
- return TRUE;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL)
+ {
+ GlobalUnlock(hMenu);
+ return FALSE;
+ }
+
+ lpitem = FindMenuItem(hMenu, nPos, wFlags);
+ if (lpitem != NULL)
+ {
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ DestroyMenu((HMENU)lpitem->item_id);
+
+ if (!(lpitem->item_flags &
+ (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
+ MF_MENUBREAK | MF_SEPARATOR)))
+ {
+ GlobalFree(lpitem->item_text);
+ }
+ if (lpitem->prev)
+ lpitem->prev->next = lpitem->next;
+ if (lpitem->next)
+ lpitem->next->prev = lpitem->prev;
+ GlobalFree(lpitem);
+ GlobalUnlock(hMenu);
+ return TRUE;
+ }
+
+ GlobalUnlock(hMenu);
+ return FALSE;
}
@@ -1356,7 +1493,16 @@
if (i == nPos) {
lpitem->item_flags = wFlags;
lpitem->item_id = wItemID;
- lpitem->item_text = lpNewItem;
+ if (!(lpitem->item_flags &
+ (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK |
+ MF_MENUBREAK | MF_SEPARATOR))) {
+ lpitem->item_text = GlobalReAlloc(lpitem->item_text,
+ strlen(lpNewItem) + 1,
+ GLOBAL_FLAGS_MOVEABLE);
+ strcpy(lpitem->item_text, lpNewItem);
+ }
+ else
+ lpitem->item_text = lpNewItem;
GlobalUnlock(hMenu);
return(TRUE);
}
@@ -1372,30 +1518,32 @@
*/
HMENU CreatePopupMenu()
{
- HANDLE hItem;
- HMENU hMenu;
- LPPOPUPMENU menu;
+ HANDLE hItem;
+ HMENU hMenu;
+ LPPOPUPMENU menu;
#ifdef DEBUG_MENU
- printf("CreatePopupMenu !\n");
+ printf("CreatePopupMenu !\n");
#endif
- hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) {
- GlobalFree(hMenu);
- return 0;
- }
- menu->nItems = 0;
- menu->firstItem = NULL;
- menu->ownerWnd = 0;
- menu->hWnd = 0;
- menu->hWndParent = 0;
- menu->MouseFlags = 0;
- menu->BarFlags = 0;
- menu->SysFlag = FALSE;
- menu->Width = 100;
- menu->Height = 0;
- GlobalUnlock(hMenu);
- return hMenu;
+ hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) {
+ GlobalFree(hMenu);
+ return 0;
+ }
+ menu->nItems = 0;
+ menu->firstItem = NULL;
+ menu->ownerWnd = 0;
+ menu->hWndPrev = 0;
+ menu->hWnd = 0;
+ menu->hWndParent = 0;
+ menu->MouseFlags = 0;
+ menu->BarFlag = FALSE;
+ menu->SysFlag = FALSE;
+ menu->ChildFlag = TRUE;
+ menu->Width = 100;
+ menu->Height = 0;
+ GlobalUnlock(hMenu);
+ return hMenu;
}
@@ -1405,36 +1553,112 @@
BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y,
short nReserved, HWND hWnd, LPRECT lpRect)
{
- WND *wndPtr;
- LPPOPUPMENU lppop;
- RECT rect;
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ RECT rect;
#ifdef DEBUG_MENU
- printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
- hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
+ printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
+ hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
#endif
- lppop = (LPPOPUPMENU) GlobalLock(hMenu);
- if (lppop == NULL) return FALSE;
+ lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (lppop == NULL) return FALSE;
+ wndPtr = WIN_FindWndPtr(hWnd);
+ lppop->ownerWnd = hWnd;
+ if (lppop->hWnd == (HWND)NULL) {
+ lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE,
+ x, y, lppop->Width, lppop->Height, (HWND)NULL, 0,
+ wndPtr->hInstance, (LPSTR)lppop);
+ }
+ else {
+ ShowWindow(lppop->hWnd, SW_SHOW);
+ }
+ if (!lppop->BarFlag) {
+ PopupMenuCalcSize(lppop->hWnd);
+#ifdef DEBUG_MENU
+ printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n",
+ x, y, lppop->Width, lppop->Height);
+#endif
+ SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height,
+ SWP_NOZORDER);
+ }
+ if (!MenuHasFocus) {
+#ifdef DEBUG_MENU
+ printf("TrackPopupMenu // before MenuFocusLoop !\n");
+#endif
+ MenuFocusLoop(hWnd, NULL);
+/* ActivateMenuFocus(hWnd); */
+#ifdef DEBUG_MENU
+ printf("TrackPopupMenu // after MenuFocusLoop !\n");
+#endif
+ }
+ GlobalUnlock(hMenu);
+ return TRUE;
+}
+
+
+BOOL ActivateMenuFocus(HWND hWnd)
+{
+ WND *wndPtr;
+ LPPOPUPMENU lpmenu;
+ BOOL bRet;
+ MSG msg;
+ if (MenuHasFocus) return FALSE;
wndPtr = WIN_FindWndPtr(hWnd);
- lppop->ownerWnd = hWnd;
- if (lppop->hWnd == (HWND)NULL) {
- lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE,
- x, y, lppop->Width, lppop->Height, (HWND)NULL, 0,
- wndPtr->hInstance, (LPSTR)lppop);
- }
- else {
- ShowWindow(lppop->hWnd, SW_SHOW);
- }
- if (lppop->BarFlags == 0) {
- PopupMenuCalcSize(lppop->hWnd);
+ if (wndPtr == NULL) return FALSE;
#ifdef DEBUG_MENU
- printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n",
- x, y, lppop->Width, lppop->Height);
+ printf("ActivateMenuFocus (%04X) !\n", hWnd);
#endif
- SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height,
- SWP_NOZORDER);
- }
- GlobalUnlock(hMenu);
- return TRUE;
+ if ((wndPtr->dwStyle & WS_CHILD) == 0 && wndPtr->wIDmenu != 0) {
+ lpmenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
+ MenuItemSelect(hWnd, lpmenu, 0);
+ bRet = MenuFocusLoop(hWnd, lpmenu);
+ if (lpmenu != NULL) GlobalUnlock(wndPtr->wIDmenu);
+ return bRet;
+ }
+ return FALSE;
+}
+
+
+BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu)
+{
+ WND *wndPtr;
+ MSG msg;
+#ifdef DEBUG_MENU
+ printf("Enter in Menu Focus Loop !\n");
+#endif
+ MenuHasFocus = TRUE;
+ while(TRUE) {
+ if (!MenuHasFocus) break;
+ if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
+ TranslateMessage(&msg);
+ if (hWnd == msg.hwnd && lpmenu != NULL) {
+ if ((msg.message == WM_SYSKEYDOWN && msg.wParam == VK_MENU) ||
+ (msg.message == WM_CHAR && msg.wParam == VK_ESCAPE)) {
+ HideAllSubPopupMenu(lpmenu);
+ break;
+ }
+ switch(msg.message) {
+ case WM_KEYDOWN:
+ case WM_KEYUP:
+ case WM_CHAR:
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ case WM_MOUSEMOVE:
+ PopupMenuWndProc(hWnd, msg.message, msg.wParam, msg.lParam);
+ default:
+ DispatchMessage(&msg);
+ }
+ }
+ else
+ DispatchMessage(&msg);
+ }
+EndOfFocus:
+ MenuHasFocus = FALSE;
+ if (lpmenu != NULL) MenuItemSelect(hWnd, lpmenu, -1);
+#ifdef DEBUG_MENU
+ printf("End of Menu Focus Loop !\n");
+#endif
+ return TRUE;
}
@@ -1443,36 +1667,56 @@
*/
void NC_TrackSysMenu(HWND hWnd)
{
- RECT rect;
- LPPOPUPMENU lpsys;
- WND *wndPtr = WIN_FindWndPtr(hWnd);
+ RECT rect;
+ LPPOPUPMENU lpsys;
+ WND *wndPtr = WIN_FindWndPtr(hWnd);
#ifdef DEBUG_MENU
- printf("NC_TrackSysMenu hWnd=%04X !\n", hWnd);
+ printf("NC_TrackSysMenu hWnd=%04X !\n", hWnd);
#endif
- if (!wndPtr) return;
- lpsys = (LPPOPUPMENU)GlobalLock(wndPtr->hSysMenu);
+ if (!wndPtr) return;
+ lpsys = (LPPOPUPMENU)GlobalLock(wndPtr->hSysMenu);
#ifdef DEBUG_MENU
- printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
+ printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
#endif
- if (lpsys == NULL) return;
+ if (lpsys == NULL) return;
#ifdef DEBUG_MENU
- printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
+ printf("NC_TrackSysMenu wndPtr->hSysMenu=%04X !\n", wndPtr->hSysMenu);
#endif
- lpsys->BarFlags = FALSE;
- lpsys->SysFlag = TRUE;
- if (!IsWindowVisible(lpsys->hWnd)) {
- GetWindowRect(hWnd, &rect);
+ lpsys->BarFlag = FALSE;
+ lpsys->SysFlag = TRUE;
+ lpsys->ChildFlag = FALSE;
+ lpsys->hWndParent = hWnd;
+ if (!IsWindowVisible(lpsys->hWnd)) {
+ GetWindowRect(hWnd, &rect);
+ lpsys->hWndPrev = GetFocus();
#ifdef DEBUG_MENU
- printf("NC_TrackSysMenu lpsys->hWnd=%04X !\n", lpsys->hWnd);
+ printf("NC_TrackSysMenu lpsys->hWnd=%04X !\n", lpsys->hWnd);
#endif
- TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON,
- rect.left, rect.top + SYSMETRICS_CYSIZE,
- 0, hWnd, (LPRECT)NULL);
- }
- else {
- ShowWindow(lpsys->hWnd, SW_HIDE);
- }
- GlobalUnlock(wndPtr->hSysMenu);
+ if (MenuHasFocus) {
+ TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON,
+ rect.left, rect.top + SYSMETRICS_CYSIZE,
+ 0, hWnd, (LPRECT)NULL);
+ }
+ else {
+ MenuHasFocus = TRUE;
+ TrackPopupMenu(wndPtr->hSysMenu, TPM_LEFTBUTTON,
+ rect.left, rect.top + SYSMETRICS_CYSIZE,
+ 0, hWnd, (LPRECT)NULL);
+ MenuHasFocus = FALSE;
+#ifdef DEBUG_MENU
+ printf("NC_TrackSysMenu // before MenuFocusLoop !\n");
+#endif
+ MenuFocusLoop(hWnd, NULL);
+/* ActivateMenuFocus(hWnd); */
+#ifdef DEBUG_MENU
+ printf("NC_TrackSysMenu // after MenuFocusLoop !\n");
+#endif
+ }
+ }
+ else {
+ ShowWindow(lpsys->hWnd, SW_HIDE);
+ }
+ GlobalUnlock(wndPtr->hSysMenu);
}
@@ -1495,29 +1739,29 @@
BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
HBITMAP hNewCheck, HBITMAP hNewUnCheck)
{
- WND *wndPtr;
- LPPOPUPMENU menu;
- LPMENUITEM lpitem;
- int i;
+ WND *wndPtr;
+ LPPOPUPMENU menu;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
- printf("SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
- hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
+ printf("SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
+ hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
#endif
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) return FALSE;
- lpitem = menu->firstItem;
- for (i = 0; i < menu->nItems; i++) {
- if (lpitem == NULL) break;
- if (i == nPos) {
- lpitem->hCheckBit = hNewCheck;
- lpitem->hUnCheckBit = hNewUnCheck;
- GlobalUnlock(hMenu);
- return TRUE;
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- GlobalUnlock(hMenu);
- return FALSE;
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) return FALSE;
+ lpitem = menu->firstItem;
+ for (i = 0; i < menu->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == nPos) {
+ lpitem->hCheckBit = hNewCheck;
+ lpitem->hUnCheckBit = hNewUnCheck;
+ GlobalUnlock(hMenu);
+ return TRUE;
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ GlobalUnlock(hMenu);
+ return FALSE;
}
@@ -1526,30 +1770,32 @@
*/
HMENU CreateMenu()
{
- HANDLE hItem;
- HMENU hMenu;
- LPPOPUPMENU menu;
+ HANDLE hItem;
+ HMENU hMenu;
+ LPPOPUPMENU menu;
#ifdef DEBUG_MENU
- printf("CreatePopupMenu !\n");
+ printf("CreatePopupMenu !\n");
#endif
- hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (menu == NULL) {
- GlobalFree(hMenu);
- return 0;
- }
- menu->nItems = 0;
- menu->firstItem = NULL;
- menu->ownerWnd = 0;
- menu->hWnd = 0;
- menu->hWndParent = 0;
- menu->MouseFlags = 0;
- menu->BarFlags = TRUE;
- menu->SysFlag = FALSE;
- menu->Width = 100;
- menu->Height = 0;
- GlobalUnlock(hMenu);
- return hMenu;
+ hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (menu == NULL) {
+ GlobalFree(hMenu);
+ return 0;
+ }
+ menu->nItems = 0;
+ menu->firstItem = NULL;
+ menu->hWndPrev = 0;
+ menu->ownerWnd = 0;
+ menu->hWnd = 0;
+ menu->hWndParent = 0;
+ menu->MouseFlags = 0;
+ menu->BarFlag = TRUE;
+ menu->SysFlag = FALSE;
+ menu->ChildFlag = TRUE;
+ menu->Width = 100;
+ menu->Height = 0;
+ GlobalUnlock(hMenu);
+ return hMenu;
}
@@ -1558,31 +1804,31 @@
*/
BOOL DestroyMenu(HMENU hMenu)
{
- LPPOPUPMENU lppop;
- LPMENUITEM lpitem, lpitem2;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem, lpitem2;
#ifdef DEBUG_MENU
- printf("DestroyMenu (%04X) !\n", hMenu);
+ printf("DestroyMenu (%04X) !\n", hMenu);
#endif
- if (hMenu == 0) return FALSE;
- lppop = (LPPOPUPMENU) GlobalLock(hMenu);
- if (lppop == NULL) return FALSE;
- if (lppop->hWnd) DestroyWindow (lppop->hWnd);
- lpitem = lppop->firstItem;
- while (lpitem != NULL) {
+ if (hMenu == 0) return FALSE;
+ lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (lppop == NULL) return FALSE;
+ if (lppop->hWnd) DestroyWindow (lppop->hWnd);
+ lpitem = lppop->firstItem;
+ while (lpitem != NULL) {
#ifdef DEBUG_MENU
- printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
+ printf("DestroyMenu (%04X) // during loop items !\n", hMenu);
#endif
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- DestroyMenu((HMENU)lpitem->item_id);
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- GlobalUnlock(hMenu);
- GlobalFree(hMenu);
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+ DestroyMenu((HMENU)lpitem->item_id);
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ GlobalUnlock(hMenu);
+ GlobalFree(hMenu);
#ifdef DEBUG_MENU
- printf("DestroyMenu (%04X) // End !\n", hMenu);
+ printf("DestroyMenu (%04X) // End !\n", hMenu);
#endif
- return TRUE;
+ return TRUE;
}
@@ -1591,29 +1837,23 @@
*/
HMENU LoadMenu(HINSTANCE instance, char *menu_name)
{
- HMENU hMenu;
- HANDLE hMenu_desc;
- MENU_HEADER *menu_desc;
+ HMENU hMenu;
+ HANDLE hMenu_desc;
+ MENU_HEADER *menu_desc;
#ifdef DEBUG_MENU
- if ((LONG)menu_name & 0xFFFF0000L)
- printf("LoadMenu: instance %02x, menu '%s'\n", instance, menu_name);
- else
- printf("LoadMenu: instance %02x, menu '%04X'\n", instance, menu_name);
+ if ((LONG)menu_name & 0xFFFF0000L)
+ printf("LoadMenu: instance %02x, menu '%s'\n", instance, menu_name);
+ else
+ printf("LoadMenu: instance %02x, menu '%04X'\n", instance, menu_name);
#endif
- if (instance == (HANDLE)NULL) instance = hSysRes;
- if (menu_name == NULL ||
- (hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
- (menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL) {
- return 0;
- }
- hMenu = LoadMenuIndirect((LPSTR)menu_desc);
-/*
- hMenu = CreateMenu();
- ParseMenuResource((WORD *) (menu_desc + 1), 0, hMenu);
- GlobalUnlock(hMenu_desc);
- GlobalFree(hMenu_desc);
-*/
- return hMenu;
+ if (instance == (HANDLE)NULL) instance = hSysRes;
+ if (menu_name == NULL ||
+ (hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
+ (menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL) {
+ return 0;
+ }
+ hMenu = LoadMenuIndirect((LPSTR)menu_desc);
+ return hMenu;
}
@@ -1622,16 +1862,16 @@
*/
HMENU GetSystemMenu(HWND hWnd, BOOL bRevert)
{
- WND *wndPtr;
- wndPtr = WIN_FindWndPtr(hWnd);
- if (!bRevert) {
+ WND *wndPtr;
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (!bRevert) {
+ return wndPtr->hSysMenu;
+ }
+ else {
+ DestroyMenu(wndPtr->hSysMenu);
+ wndPtr->hSysMenu = CopySysMenu();
+ }
return wndPtr->hSysMenu;
- }
- else {
- DestroyMenu(wndPtr->hSysMenu);
- wndPtr->hSysMenu = CopySysMenu();
- }
- return wndPtr->hSysMenu;
}
@@ -1640,9 +1880,9 @@
*/
HMENU GetMenu(HWND hWnd)
{
- WND * wndPtr = WIN_FindWndPtr(hWnd);
- if (wndPtr == NULL) return 0;
- return wndPtr->wIDmenu;
+ WND * wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == NULL) return 0;
+ return wndPtr->wIDmenu;
}
/**********************************************************************
@@ -1650,19 +1890,20 @@
*/
BOOL SetMenu(HWND hWnd, HMENU hMenu)
{
- LPPOPUPMENU lppop;
- WND * wndPtr = WIN_FindWndPtr(hWnd);
- if (wndPtr == NULL) return FALSE;
+ LPPOPUPMENU lppop;
+ WND * wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr == NULL) return FALSE;
#ifdef DEBUG_MENU
- printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
+ printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
#endif
- wndPtr->wIDmenu = hMenu;
- if (hMenu == 0) return TRUE;
- lppop = (LPPOPUPMENU) GlobalLock(hMenu);
- if (lppop == NULL) return FALSE;
- lppop->ownerWnd = hWnd;
- GlobalUnlock(hMenu);
- return TRUE;
+ wndPtr->wIDmenu = hMenu;
+ if (hMenu == 0) return TRUE;
+ lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (lppop == NULL) return FALSE;
+ lppop->ownerWnd = hWnd;
+ ResetHiliteFlags(lppop);
+ GlobalUnlock(hMenu);
+ return TRUE;
}
@@ -1671,28 +1912,31 @@
*/
HMENU GetSubMenu(HMENU hMenu, short nPos)
{
- HMENU hSubMenu;
- LPPOPUPMENU lppop;
- LPMENUITEM lpitem;
- int i;
+ HMENU hSubMenu;
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem;
+ int i;
#ifdef DEBUG_MENU
- printf("GetSubMenu (%04X, %04X) !\n", hMenu, nPos);
+ printf("GetSubMenu (%04X, %04X) !\n", hMenu, nPos);
#endif
- if (hMenu == 0) return 0;
- lppop = (LPPOPUPMENU) GlobalLock(hMenu);
- if (lppop == NULL) return 0;
- lpitem = lppop->firstItem;
- for (i = 0; i < lppop->nItems; i++) {
- if (lpitem == NULL) break;
- if (i == nPos) {
- if (lpitem->item_flags & MF_POPUP)
- return hSubMenu;
- else
- return 0;
- }
- lpitem = (LPMENUITEM)lpitem->next;
- }
- return 0;
+ if (hMenu == 0) return 0;
+ lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (lppop == NULL) return 0;
+ lpitem = lppop->firstItem;
+ for (i = 0; i < lppop->nItems; i++) {
+ if (lpitem == NULL) break;
+ if (i == nPos) {
+#ifdef DEBUG_MENU
+ printf(" found %04x\n", lpitem->item_id);
+#endif
+ if (lpitem->item_flags & MF_POPUP)
+ return lpitem->item_id;
+ else
+ return 0;
+ }
+ lpitem = (LPMENUITEM)lpitem->next;
+ }
+ return 0;
}
@@ -1701,17 +1945,29 @@
*/
void DrawMenuBar(HWND hWnd)
{
- WND *wndPtr;
+ WND *wndPtr;
+ LPPOPUPMENU lppop;
+ HDC hDC;
#ifdef DEBUG_MENU
- printf("DrawMenuBar (%04X)\n", hWnd);
+ printf("DrawMenuBar (%04X)\n", hWnd);
#endif
- wndPtr = WIN_FindWndPtr(hWnd);
- if (wndPtr != NULL && wndPtr->wIDmenu != 0) {
+ wndPtr = WIN_FindWndPtr(hWnd);
+ if (wndPtr != NULL && (wndPtr->dwStyle & WS_CHILD) == 0 &&
+ wndPtr->wIDmenu != 0) {
#ifdef DEBUG_MENU
- printf("DrawMenuBar wIDmenu=%04X \n", wndPtr->wIDmenu);
+ printf("DrawMenuBar wIDmenu=%04X \n", wndPtr->wIDmenu);
#endif
- SendMessage(hWnd, WM_NCPAINT, 1, 0L);
- }
+ lppop = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
+ if (lppop == NULL) return;
+ if ((lppop->rect.bottom - lppop->rect.top) != 0) {
+ hDC = GetWindowDC(hWnd);
+ StdDrawMenuBar(hDC, &lppop->rect, lppop);
+ ReleaseDC(hWnd, hDC);
+ }
+ else
+ SendMessage(hWnd, WM_NCPAINT, 1, 0L);
+ GlobalUnlock(wndPtr->wIDmenu);
+ }
}
@@ -1720,15 +1976,19 @@
*/
HMENU LoadMenuIndirect(LPSTR menu_template)
{
- HMENU hMenu;
- MENU_HEADER *menu_desc;
+ HMENU hMenu;
+ MENU_HEADER *menu_desc;
+ LPPOPUPMENU lppop;
#ifdef DEBUG_MENU
- printf("LoadMenuIndirect: menu_template '%08X'\n", menu_template);
+ printf("LoadMenuIndirect: menu_template '%08X'\n", menu_template);
#endif
- hMenu = CreateMenu();
- menu_desc = (MENU_HEADER *)menu_template;
- ParseMenuResource((WORD *)(menu_desc + 1), 0, hMenu);
- return hMenu;
+ hMenu = CreateMenu();
+ menu_desc = (MENU_HEADER *)menu_template;
+ ParseMenuResource((WORD *)(menu_desc + 1), 0, hMenu);
+ lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+ ResetHiliteFlags(lppop);
+ GlobalUnlock(hMenu);
+ return hMenu;
}
@@ -1737,46 +1997,47 @@
*/
HMENU CopySysMenu()
{
- HMENU hMenu;
- LPPOPUPMENU menu;
- LPPOPUPMENU sysmenu;
+ HMENU hMenu;
+ LPPOPUPMENU menu;
+ LPPOPUPMENU sysmenu;
#ifdef DEBUG_MENU
- printf("CopySysMenu entry !\n");
+ printf("CopySysMenu entry !\n");
#endif
- if (hSysMenu == 0) {
- hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(1));
-/* hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(SC_SYSMENU));*/
-/* hSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU"); */
if (hSysMenu == 0) {
- printf("SysMenu not found in system resources !\n");
- return (HMENU)NULL;
- }
+ hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(1));
+/* hSysMenu = LoadMenu((HINSTANCE)NULL, MAKEINTRESOURCE(SC_SYSMENU));*/
+/* hSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU"); */
+ if (hSysMenu == 0) {
+ printf("SysMenu not found in system resources !\n");
+ return (HMENU)NULL;
+ }
#ifdef DEBUG_MENU
- else
- printf("SysMenu loaded from system resources %04X !\n", hSysMenu);
+ else
+ printf("SysMenu loaded from system resources %04X !\n", hSysMenu);
#endif
- }
- hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
- menu = (LPPOPUPMENU) GlobalLock(hMenu);
- sysmenu = (LPPOPUPMENU) GlobalLock(hSysMenu);
- if (menu != NULL && sysmenu != NULL) {
- sysmenu->BarFlags = FALSE;
- memcpy(menu, sysmenu, sizeof(POPUPMENU));
- }
- else {
- printf("CopySysMenu // Bad SysMenu pointers !\n");
- if (menu != NULL) {
- GlobalUnlock(hMenu);
- GlobalFree(hMenu);
- }
- return (HMENU)NULL;
- }
- GlobalUnlock(hMenu);
- GlobalUnlock(hSysMenu);
+ }
+ hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
+ menu = (LPPOPUPMENU) GlobalLock(hMenu);
+ sysmenu = (LPPOPUPMENU) GlobalLock(hSysMenu);
+ if (menu != NULL && sysmenu != NULL) {
+ sysmenu->BarFlag = FALSE;
+ sysmenu->SysFlag = TRUE;
+ memcpy(menu, sysmenu, sizeof(POPUPMENU));
+ }
+ else {
+ printf("CopySysMenu // Bad SysMenu pointers !\n");
+ if (menu != NULL) {
+ GlobalUnlock(hMenu);
+ GlobalFree(hMenu);
+ }
+ return (HMENU)NULL;
+ }
+ GlobalUnlock(hMenu);
+ GlobalUnlock(hSysMenu);
#ifdef DEBUG_MENU
- printf("CopySysMenu hMenu=%04X !\n", hMenu);
+ printf("CopySysMenu hMenu=%04X !\n", hMenu);
#endif
- return hMenu;
+ return hMenu;
}
@@ -1806,11 +2067,13 @@
hSubMenu, popup_item->item_text);
}
else {
- MENUITEMTEMPLATE *normal_item = (MENUITEMTEMPLATE *) item;
- next_item = (WORD *) (normal_item->item_text +
- strlen(normal_item->item_text) + 1);
- AppendMenu(hMenu, normal_item->item_flags,
- normal_item->item_id, normal_item->item_text);
+ MENUITEMTEMPLATE *normal_item = (MENUITEMTEMPLATE *) item;
+ next_item = (WORD *) (normal_item->item_text +
+ strlen(normal_item->item_text) + 1);
+ if (strlen(normal_item->item_text) == 0 && normal_item->item_id == 0)
+ normal_item->item_flags |= MF_SEPARATOR;
+ AppendMenu(hMenu, normal_item->item_flags,
+ normal_item->item_id, normal_item->item_text);
}
}
while (!(*item & MF_END));