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

📄 ftmem.c

📁 字体缩放显示
💻 C
字号:
/*                                                                     *//*           ** This is part of the FreeType/2 project! **             *//* A small utility to display online memory usage stats for FreeType/2 *//*                                                                     *//* The method used to keep the window float on top may be completely   *//* stupid but I found no other way (except putting WinSetWindowPos()   *//* in the timer code which looks odd).                                 *//*                                                                     *//*                Copyright (C) 1998 by M. Necasek                     */#define INCL_DOSMISC#define INCL_WINTIMER#define INCL_PM#include <os2.h>#include <stdio.h>#define ID_TIMER  42#define IDM_FLOAT 155/* name of shared memory used for memory usage reporting  */#define MEM_NAME  "\\sharemem\\freetype"typedef struct _INFOSTRUCT {  ULONG  signature;      /* signature (0x46524545, 'FREE') */  ULONG  used;           /* bytes actually used */  ULONG  maxused;        /* maximum amount ever used */  ULONG  num_err;        /* number of (de)allocation errors */} INFOSTRUCT, *PINFOSTRUCT;/* structure (in named shared memory) pointing to the above struct */typedef struct _INFOPTR {  PINFOSTRUCT  address;        /* pointer to actual memory info  */} INFOPTR, *PINFOPTR;HAB          hab;HWND         hwndFrame;PINFOSTRUCT  meminfo;PINFOPTR     memptr;ULONG        bFloat = TRUE;HWND         hwndSysSubmenu;VOID AddFloat(HWND hwndFrame) {   MENUITEM  mi;   HWND      hwndSysMenu;   SHORT     sMenuID;   /* add Float option to system menu */   hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);   sMenuID = (SHORT)WinSendMsg(hwndSysMenu, MM_ITEMIDFROMPOSITION,                               MPFROMSHORT(0), MPVOID);   WinSendMsg(hwndSysMenu, MM_QUERYITEM, MPFROMSHORT(sMenuID),              MPFROMP(&mi));   hwndSysSubmenu = mi.hwndSubMenu;   mi.iPosition = MIT_END;   mi.afStyle = MIS_SEPARATOR;   mi.afAttribute = 0;   mi.id = -1;   mi.hwndSubMenu = 0;   mi.hItem = 0;   WinSendMsg(hwndSysSubmenu, MM_INSERTITEM, MPFROMP (&mi), NULL);   mi.afStyle = MIS_TEXT;   mi.afAttribute = MIA_CHECKED;   mi.id = IDM_FLOAT;   WinSendMsg(hwndSysSubmenu, MM_INSERTITEM, MPFROMP (&mi), "~Float on top");}MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2){   HPS      hps;   RECTL    rcl;   static ULONG    i = 1;   ULONG    ulMem;   char     szBuf[200];   switch (msg) {      case WM_CREATE:         /* use smaller text */         WinSetPresParam(hwnd, PP_FONTNAMESIZE, 7, (PVOID)"8.Helv");         /* start the timer (ticks each 0.5 sec.) */         AddFloat(WinQueryWindow(hwnd, QW_PARENT));         WinStartTimer(hab, hwnd, ID_TIMER, 500);         break;      /* make window always stay on top (if desired) */      case WM_VRNENABLED:         if (bFloat)            WinSetWindowPos(hwndFrame, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER);         break;      case WM_COMMAND:  /* why doesn't WM_SYSCOMMAND work? */         if (LOUSHORT(mp1) == IDM_FLOAT) {            bFloat = !bFloat;            WinCheckMenuItem(hwndSysSubmenu, IDM_FLOAT, bFloat);         }         break;      case WM_TIMER:         if (++i > 13)            i = 1;         WinInvalidateRect(hwnd, NULL, FALSE);         return FALSE;      case WM_PAINT:         hps = WinBeginPaint(hwnd, NULLHANDLE, &rcl);         /* necessary to avoid incorrectly repainting window */         WinQueryWindowRect(hwnd, &rcl);/*         sprintf(szBuf, " Current use %dK  Maximum ever used %dK  Errors %d",                 meminfo->used / 1024,                 meminfo->maxused / 1024, meminfo->num_err);*/         sprintf(szBuf, " Current use %dB  Maximum ever used %dK  Errors %d",                 meminfo->used,                 meminfo->maxused / 1024, meminfo->num_err);         WinDrawText(hps, -1, szBuf, &rcl, CLR_BLACK, CLR_WHITE,                     DT_CENTER | DT_VCENTER | DT_ERASERECT);         WinEndPaint(hps);         break;   }   return WinDefWindowProc(hwnd, msg, mp1, mp2);}void main (void){   QMSG  qmsg;   HMQ   hmq;   HWND  hwndClient;   ULONG flFrameFlags;   WinInitialize(0);   hmq = WinCreateMsgQueue(hab, 0);   /* get access to shared memory */   DosGetNamedSharedMem((PVOID*)&memptr, MEM_NAME, PAG_READ);   if (!memptr)      WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,                    "  FreeType/2 is not running!",                    "Error", 0, MB_OK | MB_ERROR);   else {      meminfo = memptr->address;      if (meminfo->signature != 0x46524545)         WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,                       "  FreeType/2 is not running!",                       "Error", 0, MB_OK | MB_ERROR);      else {         flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |                        FCF_TASKLIST ;         WinRegisterClass(hab, "MyClass",                          (PFNWP) ClientWndProc,                          CS_SIZEREDRAW, 0);         hwndFrame = WinCreateStdWindow(HWND_DESKTOP,                                        WS_VISIBLE,                                        &flFrameFlags,                                        "MyClass", "FreeType/2 Heap Usage",                                        0, (HMODULE) NULL,                                        0, &hwndClient);         WinSetVisibleRegionNotify(hwndClient, TRUE);         /* make titlebar text look better */         WinSetPresParam(WinWindowFromID(hwndFrame, FID_TITLEBAR),                         PP_FONTNAMESIZE, 9, (PVOID)"8.Helv");         WinSetWindowPos(hwndFrame, NULLHANDLE, 0, 0, 350, 42,                         SWP_MOVE | SWP_SIZE | SWP_SHOW);         while (WinGetMsg(hab, &qmsg, (HWND) NULL, 0, 0))            WinDispatchMsg(hab, &qmsg);         WinSetVisibleRegionNotify(hwndClient, FALSE);      }   }   /* free shared memory block */   DosFreeMem(memptr);   WinDestroyWindow(hwndFrame);   WinDestroyMsgQueue(hmq);   WinTerminate(hab);}

⌨️ 快捷键说明

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