#include <windows.h>
#include <string.h>
#define IDT_TIMER 101
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,
LPSTR lpCmdLine, int nCmdShow)
{
char *szClassName = "MainWClass";
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); //背景灰色
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
wndclass.hIconSm = NULL;
::RegisterClassEx(&wndclass);
HWND hwnd = ::CreateWindowEx(WS_EX_CLIENTEDGE, szClassName, "Memory Information",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300,
230, NULL, NULL, hInstance, NULL);
if (hwnd == NULL)
{
::MessageBox(NULL, "Create Error!", "error", MB_OK);
return -1;
}
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0))
{
::TranslateMessage(&msg);
::DispatchMessageW(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
char m_szText[1024];
RECT m_rcInfo;
::GetClientRect(hwnd, &m_rcInfo);
m_rcInfo.left = 30;
m_rcInfo.top = 20;
m_rcInfo.right = m_rcInfo.right - 30;
m_rcInfo.bottom = m_rcInfo.bottom - 20;
HDC hdc = GetDC(hwnd);
char szBuff[128];
MEMORYSTATUS ms;
::GlobalMemoryStatus(&ms);
m_szText[0] = '\0';
wsprintf(szBuff, "\n 物理内存总量: %-7d MB", ms.dwTotalPhys / (1024*1024));
strcat(m_szText, szBuff);
wsprintf(szBuff, "\n 可用物理内存: %-7d MB", ms.dwAvailPhys / (1024*1024));
strcat(m_szText, szBuff);
wsprintf(szBuff, "\n 已用物理内存: %-7d MB", (ms.dwTotalPhys - ms.dwAvailPhys) / (1024*1024));
strcat(m_szText, szBuff);
wsprintf(szBuff, "\n\n 虚拟内存总量: %-7d MB", ms.dwTotalVirtual / (1024*1024));
strcat(m_szText, szBuff);
wsprintf(szBuff, "\n 可用虚拟内存: %-7d MB", ms.dwAvailVirtual / (1024*1024));
strcat(m_szText, szBuff);
wsprintf(szBuff, "\n 已用虚拟内存: %-7d MB", (ms.dwTotalVirtual - ms.dwAvailVirtual) / (1024*1024));
strcat(m_szText, szBuff);
wsprintf(szBuff, "\n\n 内存使用率: %7d%% ", ms.dwMemoryLoad);
strcat(m_szText, szBuff);
switch (message)
{
case WM_CREATE:
{
//安装定时器
::SetTimer(hwnd, IDT_TIMER, 500, NULL);
//将窗口提到最顶层
::SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE);
return TRUE;
}
break;
case WM_TIMER:
if(wParam = IDT_TIMER)
{
//无效显示文本的区域,以迫使系统发送WM_PAINT消息,更新显示信息
::InvalidateRect(hwnd, &m_rcInfo, TRUE);
}
break;
case WM_PAINT:
{ //设置显示文本所在方框的大小
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(hwnd, &ps);
//创建字体
HFONT hFont = ::CreateFont(12, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET,
OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH|FF_SWISS, "MS Sans Serif");
//创建画刷
HBRUSH hBrush = ::CreateSolidBrush(RGB(0xa0, 0xa0, 0xa0));
//将它们选入到设备环境中
HFONT hOldFont = (HFONT)::SelectObject(hdc, hFont);
HBRUSH hOldBrush = (HBRUSH)::SelectObject(hdc, hBrush);
//设置文本颜色
::SetTextColor(hdc, RGB(0x32, 0x32, 0xfa));
//设置背景为透明模式
::SetBkMode(hdc, TRANSPARENT);
//画一个圆角矩形
::RoundRect(hdc, m_rcInfo.left, m_rcInfo.top, m_rcInfo.right, m_rcInfo.bottom, 5, 5);
//绘制文本
::DrawText(hdc, m_szText, strlen(m_szText), &m_rcInfo, 0);
//清除资源
::DeleteObject(::SelectObject(hdc, hOldFont));
::DeleteObject(::SelectObject(hdc, hOldBrush));
::EndPaint(hwnd, &ps);
} break;
case WM_CLOSE:
::KillTimer(hwnd, IDT_TIMER);
break;
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
}
return ::DefWindowProc(hwnd, message, wParam, lParam);
}