|
|
#include "ddemlp.h"
#include "heapwach.h"
#ifdef WATCHHEAPS
extern char FAR SZHEAPWATCHCLASS[]; #define MAX_WINDOWS 20
typedef struct { WORD sel; HWND hwnd; } SELWND;
char szT[30];
SELWND sw[MAX_WINDOWS]; int cHwnds = 0;
VOID LogAlloc( DWORD lpstr, WORD cb, DWORD color, HANDLE hInstance) { int i; HWND hwnd; WORD sel; WORD off; int mj, mn, cl; HDC hdc; RECT rc, rcClient; HBRUSH hbr;
sel = HIWORD(lpstr); hwnd = NULL; for (i = 0; i < cHwnds; i++) { if (sel == sw[i].sel) { hwnd = sw[i].hwnd; if (!IsWindow(hwnd)) { // this must have been destroyed and we are now reusing the sel.
sw[i] = sw[--cHwnds]; hwnd = NULL; } break; } } if (!hwnd && cHwnds < MAX_WINDOWS) { itoa((int)sel, szT, 16); sw[cHwnds].sel = sel; sw[cHwnds].hwnd = hwnd = CreateWindow(SZHEAPWATCHCLASS, szT, WS_POPUP | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 64, 64, NULL, NULL, hInstance, NULL); if (hwnd) { cHwnds++; GetWindowRect(hwnd, &rc); GetClientRect(hwnd, &rcClient); rc.bottom += 128 - (rcClient.bottom - rcClient.top); rc.right += 128 - (rcClient.right - rcClient.left); MoveWindow(hwnd, 0, 0, rc.right - rc.left, rc.bottom - rc.top, FALSE); ShowWindow(hwnd, SW_SHOWNORMAL); } } if (!hwnd) { return; } off = LOWORD(lpstr) >> 2; mj = off >> 7; mn = off & 0x7f; cl = cb >> 2; hdc = GetDC(hwnd); hbr = CreateSolidBrush(color); rc.top = mj; rc.bottom = rc.top + 1; rc.left = (int)mn; rc.right = min(127, mn + cl); FillRect(hdc, &rc, hbr); cl -= (int)(rc.right - rc.left); if (cl > 127) { rc.top++; rc.bottom = rc.top + cl / 128; rc.left = 0; rc.right = 127; FillRect(hdc, &rc, hbr); cl -= 128 * (cl / 128); } if (cl > 0) { rc.top = rc.bottom; rc.bottom++; rc.left = 0; rc.right = cl; FillRect(hdc, &rc, hbr); } DeleteObject(hbr); ReleaseDC(hwnd, hdc); }
VOID CloseHeapWatch() { int i;
for (i = 0; i < cHwnds; i++) { DestroyWindow(sw[i].hwnd); } cHwnds = 0; }
#endif
|