#include <windows.h>
#include <tchar.h>
#include "resource.h"
#define NUMLINES ((int) (sizeof devcaps / sizeof devcaps [0]))
struct
{
int iIndex ;
TCHAR * szLabel ;
TCHAR * szDesc ;
}
devcaps [] =
{
HORZSIZE, TEXT ("HORZSIZE"), TEXT ("Width in millimeters:"),
VERTSIZE, TEXT ("VERTSIZE"), TEXT ("Height in millimeters:"),
HORZRES, TEXT ("HORZRES"), TEXT ("Width in pixels:"),
VERTRES, TEXT ("VERTRES"), TEXT ("Height in raster lines:"),
BITSPIXEL, TEXT ("BITSPIXEL"), TEXT ("Color bits per pixel:"),
PLANES, TEXT ("PLANES"), TEXT ("Number of color planes:"),
NUMBRUSHES, TEXT ("NUMBRUSHES"), TEXT ("Number of device brushes:"),
NUMPENS, TEXT ("NUMPENS"), TEXT ("Number of device pens:"),
NUMMARKERS, TEXT ("NUMMARKERS"), TEXT ("Number of device markers:"),
NUMFONTS, TEXT ("NUMFONTS"), TEXT ("Number of device fonts:"),
NUMCOLORS, TEXT ("NUMCOLORS"), TEXT ("Number of device colors:"),
PDEVICESIZE, TEXT ("PDEVICESIZE"), TEXT ("Size of device structure:"),
ASPECTX, TEXT ("ASPECTX"), TEXT ("Relative width of pixel:"),
ASPECTY, TEXT ("ASPECTY"), TEXT ("Relative height of pixel:"),
ASPECTXY, TEXT ("ASPECTXY"), TEXT ("Relative diagonal of pixel:"),
LOGPIXELSX, TEXT ("LOGPIXELSX"), TEXT ("Horizontal dots per inch:"),
LOGPIXELSY, TEXT ("LOGPIXELSY"), TEXT ("Vertical dots per inch:"),
SIZEPALETTE, TEXT ("SIZEPALETTE"), TEXT ("Number of palette entries:"),
NUMRESERVED, TEXT ("NUMRESERVED"), TEXT ("Reserved palette entries:"),
COLORRES, TEXT ("COLORRES"), TEXT ("Actual color resolution:")
} ;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void DrawRectangle(HWND hwnd);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{
TCHAR szAppName[] = _T("DevCaps");
HWND hwnd = NULL;
MSG msg = {0};
WNDCLASS wndclass = {0};
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
wndclass.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
if (!::RegisterClass(&wndclass))
{
::MessageBox(NULL, _T("this programe require Win NT!"), szAppName, MB_ICONERROR);
return 0;
}
HMENU hMenu = NULL;
hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
hwnd = ::CreateWindow(szAppName, _T("Device Capture"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL);
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);
while (true)
{
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
break;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
DrawRectangle(hwnd);
}
}
return msg.wParam;
}
void DrawRectangle(HWND hwnd)
{
HBRUSH hBrush = NULL;
HDC hdc = NULL;
RECT rect = {0};
int cxClient = 0;
int cyClient = 0;
::GetClientRect(hwnd, &rect);
cxClient = rect.right - rect.left;
cyClient = rect.bottom - rect.top;
::SetRect(&rect, rand() % cxClient, rand() % cyClient, rand() % cxClient, rand() % cyClient);
hBrush = ::CreateSolidBrush(RGB(rand() % 256, rand() % 256, rand() % 256));
hdc = ::GetDC(hwnd);
::FillRect(hdc, &rect, hBrush);
::ReleaseDC(hwnd, hdc);
::DeleteObject(hBrush);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar = 0;
static int cxCaps = 0;
static int cyChar = 0;
int i = 0;
TCHAR szBuff[10] = _T("/0");
HDC hdc = NULL;
PAINTSTRUCT ps = {0};
TEXTMETRIC tm = {0};
switch (message)
{
case WM_CREATE:
{
hdc = ::GetDC(hwnd);
::GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
::ReleaseDC(hwnd, hdc);
}
return 0;
case WM_PAINT:
{
hdc = ::BeginPaint(hwnd, &ps);
for (i = 0; i < NUMLINES; i++)
{
::TextOut(hdc, 0, cyChar * i, devcaps[i].szLabel, lstrlen(devcaps[i].szLabel));
::TextOut(hdc, 14 * cxCaps, cyChar * i, devcaps[i].szDesc, lstrlen(devcaps[i].szDesc));
::SetTextAlign(hdc, TA_RIGHT | TA_TOP);
::TextOut(hdc, 14 * cxCaps + 35 * cxChar, cyChar * i, szBuff, wsprintf(szBuff, _T("%5d"), ::GetDeviceCaps(hdc, devcaps[i].iIndex)));
::SetTextAlign(hdc, TA_LEFT | TA_TOP);
}
::SelectObject(hdc, ::GetStockObject(NULL_BRUSH));
::Rectangle(hdc, 0, 0, 100, 50);
RECT rect;
rect.left = 0;
rect.top = 60;
rect.bottom = 120;
rect.right = 200;
//::SelectObject(hdc, ::GetStockObject(GRAY_BRUSH));
::FrameRect(hdc, &rect, (HBRUSH)::GetStockObject(GRAY_BRUSH));
rect.left = 0;
rect.top = 130;
rect.bottom = 200;
rect.right = 400;
//::FillRect(hdc, &rect, (HBRUSH)::GetStockObject(WHITE_BRUSH));
::InvertRect(hdc, &rect);
::EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
{
::PostQuitMessage(0);
}
return 0;
default:
break;
}
return ::DefWindowProc(hwnd, message, wParam, lParam);
}