[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("屏幕高度(单位:像素)") } //还有很多,待续 };