⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 在ecos 下mingui 的移植开发
💻 C
📖 第 1 页 / 共 5 页
字号:
// $Id: menu.c,v 1.17 2000/11/17 07:02:01 ymwei Exp $//// menu.c: The Menu module.//// Copyright (C) 1999, Mr. Wei Yongming.//// Current maintainer: Wei Yongming./***  This library is free software; you can redistribute it and/or**  modify it under the terms of the GNU Library General Public**  License as published by the Free Software Foundation; either**  version 2 of the License, or (at your option) any later version.****  This library is distributed in the hope that it will be useful,**  but WITHOUT ANY WARRANTY; without even the implied warranty of**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU**  Library General Public License for more details.****  You should have received a copy of the GNU Library General Public**  License along with this library; if not, write to the Free**  Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,**  MA 02111-1307, USA*/// Create date: 1999.04.09//// Used abbreviations:// Menu: mnu// Popup: ppp// Identifier: id// Mnemonic: mnic// Normal: nml// Item: itm// Modify records:////  Who             When        Where       For What                Status//-----------------------------------------------------------------------------//  WEI Yongming    2000/2/21   Wudaokou    MSG_ACTIVEMENU message  Done//// TODO:// #include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <semaphore.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "cliprect.h"#include "gal.h"#include "internals.h"#include "menu.h"#ifndef lintstatic char fileid[] = "$Id: menu.c,v 1.17 2000/11/17 07:02:01 ymwei Exp $";#endifBOOL InitMenu(void);void TerminateMenu(void);static FREEMILIST FreeMIList;static FREEMBLIST FreeMBList;static FREETMILIST FreeTMIList;/************************* MENUBAR allocation ********************************/static BOOL InitFreeMBList(void){    if( !(FreeMBList.heap = calloc (SIZE_MB_HEAP, sizeof(MENUBAR))))         return FALSE;            FreeMBList.free = 0;    pthread_mutex_init (&FreeMBList.lock, NULL);    FreeMBList.head = FreeMBList.tail = NULL;    FreeMBList.nr = 0;    return TRUE;}static PMENUBAR MenuBarAlloc(void){    PMENUBAR pmb;    pthread_mutex_lock (&FreeMBList.lock);    if (FreeMBList.head) {        pmb = FreeMBList.head;        FreeMBList.head = pmb->next;        FreeMBList.nr --;    }    else {        if (FreeMBList.free < SIZE_MB_HEAP) {            pmb = FreeMBList.heap + FreeMBList.free;            pmb->fromheap = TRUE;            FreeMBList.free ++;        }        else {            pmb = malloc (sizeof(MENUBAR));            if (pmb == NULL)                fprintf (stderr, "MENU error: alloc menu bar failure!\n");            else                pmb->fromheap = FALSE;        }    }    pthread_mutex_unlock (&FreeMBList.lock);    return pmb;}static void FreeMenuBar(PMENUBAR pmb){    pthread_mutex_lock (&FreeMBList.lock);    pmb->next = NULL;    if (FreeMBList.head) {        FreeMBList.tail->next = pmb;        FreeMBList.tail = pmb;    }    else {        FreeMBList.head = FreeMBList.tail = pmb;     }    FreeMBList.nr++;    pthread_mutex_unlock (&FreeMBList.lock);}static void EmptyFreeMBList(void){    PMENUBAR pmb, pTemp;    pthread_mutex_lock (&FreeMBList.lock);    pmb = FreeMBList.head;    while (pmb) {        pTemp = pmb->next;                if (!pmb->fromheap)            free (pmb);        pmb = pTemp;    }    FreeMBList.head = FreeMBList.tail = NULL;    FreeMBList.nr = 0;    FreeMBList.free = 0;    pthread_mutex_unlock (&FreeMBList.lock);}static void DestroyFreeMBList(void){    EmptyFreeMBList ();    free (FreeMBList.heap);}/************************* MENUITEM allocation *******************************/static BOOL InitFreeMIList(void){    if( !(FreeMIList.heap = calloc (SIZE_MI_HEAP, sizeof(MENUITEM))))         return FALSE;            FreeMIList.free = 0;    pthread_mutex_init (&FreeMIList.lock, NULL);    FreeMIList.head = FreeMIList.tail = NULL;    FreeMIList.nr = 0;    return TRUE;}static PMENUITEM MenuItemAlloc(void){    PMENUITEM pmi;    pthread_mutex_lock (&FreeMIList.lock);    if (FreeMIList.head) {        pmi = FreeMIList.head;        FreeMIList.head = pmi->next;        FreeMIList.nr --;    }    else {        if (FreeMIList.free < SIZE_MI_HEAP) {            pmi = FreeMIList.heap + FreeMIList.free;            pmi->fromheap = TRUE;            FreeMIList.free ++;        }        else {            pmi = malloc (sizeof(MENUITEM));            if (pmi == NULL)                fprintf (stderr, "MENU error: alloc menu item failure!\n");            else                pmi->fromheap = FALSE;        }    }    pthread_mutex_unlock (&FreeMIList.lock);    return pmi;}static void FreeMenuItem(MENUITEM* pmi){    pthread_mutex_lock (&FreeMIList.lock);    pmi->next = NULL;    if (FreeMIList.head) {        FreeMIList.tail->next = pmi;        FreeMIList.tail = pmi;    }    else {        FreeMIList.head = FreeMIList.tail = pmi;    }    FreeMIList.nr++;    pthread_mutex_unlock (&FreeMIList.lock);}static void EmptyFreeMIList(void){    PMENUITEM pmi, pTemp;    pthread_mutex_lock (&FreeMIList.lock);    pmi = FreeMIList.head;    while (pmi) {        pTemp = pmi->next;                if (!pmi->fromheap)            free (pmi);        pmi = pTemp;    }    FreeMIList.head = FreeMIList.tail = NULL;    FreeMIList.nr = 0;    FreeMIList.free = 0;    pthread_mutex_unlock (&FreeMIList.lock);}static void DestroyFreeMIList(void){    EmptyFreeMIList ();    free (FreeMIList.heap);}/************************* TRACKMENUITEM heap *******************************/static BOOL InitFreeTMIList(void){    if( !(FreeTMIList.heap = calloc (SIZE_TMI_HEAP, sizeof(TRACKMENUINFO))))         return FALSE;            FreeTMIList.free = 0;    pthread_mutex_init (&FreeTMIList.lock, NULL);    FreeTMIList.head = FreeTMIList.tail = NULL;    FreeTMIList.nr = 0;    return TRUE;}static PTRACKMENUINFO TrackMenuInfoAlloc(void){    PTRACKMENUINFO ptmi;    pthread_mutex_lock (&FreeTMIList.lock);    if (FreeTMIList.head) {        ptmi = FreeTMIList.head;        FreeTMIList.head = ptmi->next;        FreeTMIList.nr --;    }    else {        if (FreeTMIList.free < SIZE_TMI_HEAP) {            ptmi = FreeTMIList.heap + FreeTMIList.free;            ptmi->fromheap = TRUE;            FreeTMIList.free ++;        }        else {            ptmi = malloc (sizeof(TRACKMENUINFO));            if (ptmi == NULL)                fprintf (stderr, "MENU error: alloc tmi failure!\n");            else                ptmi->fromheap = FALSE;        }    }    pthread_mutex_unlock (&FreeTMIList.lock);    return ptmi;}static void FreeTrackMenuInfo(TRACKMENUINFO* ptmi){    pthread_mutex_lock (&FreeTMIList.lock);    ptmi->next = NULL;    if (FreeTMIList.head) {        FreeTMIList.tail->next = ptmi;        FreeTMIList.tail = ptmi;    }    else {        FreeTMIList.head = FreeTMIList.tail = ptmi;    }    FreeTMIList.nr++;    pthread_mutex_unlock (&FreeTMIList.lock);}static void EmptyFreeTMIList(void){    PTRACKMENUINFO ptmi, pTemp;    pthread_mutex_lock (&FreeTMIList.lock);    ptmi = FreeTMIList.head;    while (ptmi) {        pTemp = ptmi->next;                if (!ptmi->fromheap)            free (ptmi);        ptmi = pTemp;    }    FreeTMIList.head = FreeTMIList.tail = NULL;    FreeTMIList.nr = 0;    FreeTMIList.free = 0;    pthread_mutex_unlock (&FreeTMIList.lock);}static void DestroyFreeTMIList(void){    EmptyFreeTMIList ();    free (FreeTMIList.heap);}/************************* Module initialization *****************************/// this function defined in Desktop moduleBOOL LoadSystemBitmap (PBITMAP pBitmap, const char* szItemName);#define BKC_MENUBAR_NORMAL      PIXEL_lightgray#define FGC_MENUBAR_NORMAL      PIXEL_black#define BKC_MENUBAR_HILITE      PIXEL_darkblue#define FGC_MENUBAR_HILITE      PIXEL_lightwhite#define FGC_MENUBAR_DISABLED    PIXEL_darkgray#define BKC_MENUITEM_NORMAL     PIXEL_lightgray#define FGC_MENUITEM_NORMAL     PIXEL_black#define BKC_MENUITEM_HILITE     PIXEL_darkblue#define FGC_MENUITEM_HILITE     PIXEL_lightwhite#define FGC_MENUITEM_DISABLED   PIXEL_darkgray#define BKC_PPPMENUTITLE        PIXEL_lightgray#define FGC_PPPMENUTITLE        PIXEL_blue// default bitmap on menu.static BITMAP bmpSubMenu[4]; // normal, normal hilite, disabled, disable hilitestatic BITMAP bmpCheck[4];static BITMAP bmpRadio[4];BOOL mnuLoadBitmap (void){    if (!LoadSystemBitmap (bmpSubMenu,     "submenu1")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpSubMenu, PIXEL_green, BKC_MENUITEM_NORMAL);        if (!LoadSystemBitmap (bmpSubMenu + 1, "submenu2")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpSubMenu + 1, PIXEL_green, BKC_MENUITEM_HILITE);        if (!LoadSystemBitmap (bmpSubMenu + 2, "submenu3")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpSubMenu + 2, PIXEL_green, BKC_MENUITEM_NORMAL);        if (!LoadSystemBitmap (bmpSubMenu + 3, "submenu3")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpSubMenu + 3, PIXEL_green, BKC_MENUITEM_HILITE);    if (!LoadSystemBitmap (bmpCheck,     "check1")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpCheck, PIXEL_green, BKC_MENUITEM_NORMAL);    if (!LoadSystemBitmap (bmpCheck + 1, "check2")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpCheck + 1, PIXEL_green, BKC_MENUITEM_HILITE);    if (!LoadSystemBitmap (bmpCheck + 2, "check3")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpCheck + 2, PIXEL_green, BKC_MENUITEM_NORMAL);        if (!LoadSystemBitmap (bmpCheck + 3, "check3")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpCheck + 3, PIXEL_green, BKC_MENUITEM_HILITE);        if (!LoadSystemBitmap (bmpRadio,     "radio1")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpRadio, PIXEL_green, BKC_MENUITEM_NORMAL);    if (!LoadSystemBitmap (bmpRadio + 1, "radio2")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpRadio + 1, PIXEL_green, BKC_MENUITEM_HILITE);    if (!LoadSystemBitmap (bmpRadio + 2, "radio3")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpRadio + 2, PIXEL_green, BKC_MENUITEM_NORMAL);    if (!LoadSystemBitmap (bmpRadio + 3, "radio3")) return FALSE;    ReplaceBitmapColor(HDC_SCREEN, bmpRadio + 3, PIXEL_green, BKC_MENUITEM_HILITE);    return TRUE;}BOOL InitMenu (void){    if (!InitFreeMBList ()) return FALSE;    if (!InitFreeMIList ()) return FALSE;    if (!InitFreeTMIList ()) return FALSE;    return mnuLoadBitmap ();}/************************* Module termination *******************************/void TerminateMenu (void){    int i;        DestroyFreeTMIList ();    DestroyFreeMBList ();    DestroyFreeMIList ();    for (i=0; i<4; i++) {        UnloadBitmap (bmpSubMenu + i);        UnloadBitmap (bmpCheck + i);        UnloadBitmap (bmpRadio + i);    }}/***************************** Menu creation *******************************/HMENU GUIAPI LoadMenuFromFile (const char* filename, int id){    return 0;}HMENU GUIAPI CreateMenu (void){    PMENUBAR pmb;    if (!(pmb = MenuBarAlloc ()))        return 0;        pmb->class = TYPE_HMENU;    pmb->type = TYPE_MENUBAR;    pmb->head = NULL;    return (HMENU)pmb;}HMENU GUIAPI CreatePopupMenu (PMENUITEMINFO pmii){    PMENUITEM pmi;        if (!(pmi = MenuItemAlloc ()))        return 0;       pmi->class = TYPE_HMENU;    pmi->type = TYPE_PPPMENU;    pmi->next = NULL;    pmi->submenu = NULL;    pmi->mnutype         = pmii->type;    pmi->mnustate        = pmii->state;    pmi->id              = pmii->id;    pmi->hbmpChecked     = pmii->hbmpChecked;    pmi->hbmpUnchecked   = pmii->hbmpUnchecked;    pmi->itemdata        = pmii->itemdata;    // copy string.    if (pmii->type == MFT_STRING) {        pmi->typedata = (DWORD)FixStrAlloc (strlen ((char*)pmii->typedata));        strcpy ((char*)pmi->typedata, (char*)pmii->typedata);    }    else        pmi->typedata = pmii->typedata;    return (HMENU)pmi;}HMENU GUIAPI CreateSystemMenu (HWND hwnd, DWORD dwStyle){    HMENU hmnu;    MENUITEMINFO mii;    memset (&mii, 0, sizeof(MENUITEMINFO));    mii.type        = MFT_STRING;    mii.id          = 0;    mii.typedata    = (DWORD)GetSysText(SysText[5]);    hmnu = CreatePopupMenu (&mii);    memset (&mii, 0, sizeof(MENUITEMINFO));    if (dwStyle & WS_MINIMIZEBOX) {        mii.type        = MFT_STRING;        mii.state       = 0;        mii.id          = SC_MINIMIZE;        mii.typedata    = (DWORD)GetSysText(SysText[6]);        InsertMenuItem(hmnu, 0, TRUE, &mii);    }    if (dwStyle & WS_MAXIMIZEBOX) {        mii.type        = MFT_STRING;        if (dwStyle & WS_MAXIMIZE)            mii.state   = MFS_DISABLED;        else            mii.state   = 0;        mii.id          = SC_MAXIMIZE;        mii.typedata    = (DWORD)GetSysText(SysText[7]);        InsertMenuItem(hmnu, 1, TRUE, &mii);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -