Windows Mobile 编程 (Win32) - 获取设备能力

《Windows 程序设计》第五章重点讲述图形基础。首先一个示例代码是获取设备描述表信息。代码与Windows Mobile 编程 (Win32) - 输出文本中的代码类似。

#include <windows.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, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    static TCHAR szAppName[] = TEXT("DevCaps1");
    HWND     hwnd;
    MSG      msg;
    WNDCLASS wc;

    ZeroMemory(&wc, sizeof(wc));
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = szAppName;

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, TEXT("RegisterClass() failed!"), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName, TEXT("Device Capabilities"),
        WS_OVERLAPPED | WS_SYSMENU,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);
    
    if (hwnd == NULL)
    {
        MessageBox(NULL, TEXT("CreateWindow() failed!"), szAppName, MB_ICONERROR);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int  cxChar, cxCaps, cyChar;
    TCHAR       szBuffer[10];
    HDC         hdc;
    int         i;
    PAINTSTRUCT ps;
    TEXTMETRIC  tm;

    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++)
        {
            ExtTextOut(hdc, 0, cyChar * i, 0, NULL,
                devcaps[i].szDesc,
                lstrlen(devcaps[i].szDesc),
                NULL);

            SetTextAlign(hdc, TA_RIGHT | TA_TOP);

            ExtTextOut(hdc, cxChar * 47, cyChar * i, 0, NULL,
                szBuffer,
                wsprintf(szBuffer, TEXT("%5d"), GetDeviceCaps(hdc, devcaps[i].iIndex)),
                NULL);

            SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
        }

        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0 ;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}
posted @ 2009-03-12 15:54  可乐罐  阅读(573)  评论(0编辑  收藏  举报