首页 > 代码库 > [C语言](二)01 获取Windows图形构件大小信息

[C语言](二)01 获取Windows图形构件大小信息

SYSMETS.c

#include <windows.h>

#include "SYSMETS.H"//自定义的单元,所以用"",不是用<>

//消息循环处理函数,Windows回调函数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//Windows程序的入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int ICmdShow) {
    static TCHAR szAppName[] = TEXT("windowOfC");

    HWND hwnd;//窗体句柄变量
    MSG msg;//消息变量
    WNDCLASS wndclass;//窗口类变量

    //配置窗口类结构
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;//设置处理消息循环的函数
    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_WINDOW;
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    //注册窗口类
    if (!RegisterClass(&wndclass)) {
        MessageBox(NULL, TEXT("注册窗口类失败!"), szAppName, MB_ICONERROR);
        return 0;
    }

    //创建窗口
    hwnd = CreateWindow(szAppName,
        TEXT("获取Windows图形构件大小信息"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    //显示窗口
    ShowWindow(hwnd, ICmdShow);
    //更新窗口内容
    UpdateWindow(hwnd);

    //得到Windows消息
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
};

//消息处理方法,windows操作系统的回调函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    HDC hdc;//图形设备描述表变量
    PAINTSTRUCT ps;

    static int cxChar, cxCaps, cyChar;//文字大小的变量
    int i;//循环显示构件信息的变量
    TCHAR szBuffer[10];//输出构建大小的变量
    TEXTMETRIC tm;//字体信息结构

    int iSysments;//系统返回的Windows构件大小

    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++) {
            //输出ID
            TextOut(hdc, 0, cyChar*i, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));

            //输出原来的英文描述信息
            TextOut(hdc, 22 * cxCaps, cyChar*i, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));
            //设置文字对齐方式
            SetTextAlign(hdc, TA_RIGHT | TA_TOP);

            //得到当前Windows构件大小
            iSysments = GetSystemMetrics(sysmetrics[i].iIndex);
            TextOut(hdc, 22 * cxCaps + 40 * cxChar, cyChar*i, szBuffer, wsprintf(szBuffer, TEXT("%5d"), iSysments));
            //设置文字对齐方式
            SetTextAlign(hdc, TA_LEFT | TA_TOP);

            //输出原来的英文描述信息
            TextOut(hdc, 22 * cxCaps + 60 * cxChar, cyChar*i, sysmetrics[i].szCnDesc, lstrlen(sysmetrics[i].szCnDesc));
            //设置文字对齐方式
            SetTextAlign(hdc, TA_LEFT | TA_TOP);
        }

        //释放设备描述表
        EndPaint(hwnd, &ps);

        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);

        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
};

SYSMETS.h

#pragma once //保证相同内容只编译一次

#include <windows.h>

//宏定义(NUMLINES在预编译时候,直接被后面内容替换掉)
#define NUMLINES ((int)(sizeof sysmetrics/ sizeof sysmetrics[0]))

struct
{
    int iIndex;
    TCHAR * szLabel;
    TCHAR * szDesc;
    TCHAR * szCnDesc;//这是我增加的内容,显示中文描述信息,对上面英文描述信息的翻译文字
}
/*
1,这是一个结构数组,数组中的每个结构描述当前获取的windows构件
2,数组中的结构元素被我修改了一下,每个结构元素外围都增加了"{}",这样程序可读性应该是更好了,原代码没有"{}"
*/
sysmetrics[] = {
    {
    SM_CXSCREEN,TEXT("SM_CXSCREEN"),TEXT("Screen width in pixels"),TEXT("屏幕宽度(单位:像素)")
    },
    {
    SM_CYSCREEN,TEXT("SM_CYSCREEN"),TEXT("Screen height in pixels"),TEXT("屏幕高度(单位:像素)")
    }
    //还有很多,待续
};

 

[C语言](二)01 获取Windows图形构件大小信息