• [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("屏幕高度(单位:像素)")
        }
        //还有很多,待续
    };
  • 相关阅读:
    2808 SCI中断发送
    头文件定义全局变量的几个问题
    关于多文件引用头文件变量重复定义的解决办法【BCB2010环境】
    程序中代码实现的图标,Marlett字体的对应关系
    C++ builder报错
    华硕A43系列笔记本卡解决办法
    磁盘对齐4k
    编译指令#pragma详解
    ASCII码表控制字符的确切含义
    win7无损分区轻松实现,不使用工具实现无损分区
  • 原文地址:https://www.cnblogs.com/sunylat/p/6235431.html
Copyright © 2020-2023  润新知