
windows程序设计(4):文本输出
发布日期:2021-05-06 15:37:22
浏览次数:9
分类:技术文章
本文共 7336 字,大约阅读时间需要 24 分钟。
1 绘制和重绘
1.1 WM_PAINT消息
1.2 有效矩形和无效矩形
2 GDI简介(图形设备接口(GDI :Graphics Device Interface)
2.1 设备环境
2.2 方式1:BeginPaint
注意:在调用BeginPaint后,整个客户区会变成有效的。
2.3 绘制信息结构
typedef struct tagPAINTSTRUCT { HDC hdc; //设备环境句柄 BOOL fErase; //大多数情况,被被设置为FALSE RECT rcPaint; //定义了无效矩形的边界 BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
2.4 获取设备环境句柄:方法二 GetDC
2.5 TEXTOUT函数详解
WINGDIAPI BOOL WINAPI TextOutA( _In_ HDC hdc, _In_ int x, _In_ int y, _In_reads_(c) LPCSTR lpString, _In_ int c);WINGDIAPI BOOL WINAPI TextOutW( _In_ HDC hdc, _In_ int x, _In_ int y, _In_reads_(c) LPCWSTR lpString, _In_ int c);#ifdef UNICODE#define DrawText DrawTextW#else#define DrawText DrawTextA#endif // !UNICODE
2.6 系统字体
2.7 字符大小
2.8 文本尺寸的度量
2.9 文本的格式化
如果要在视窗中显示字体,就必须首先取得字元的高度和宽度,可以在开始定义两个变量来保存平均字元的宽度和总的字元高度,如下:
cxChar = tm.tmAveCharWidth ; cyChar = tm.tmHeight + tm.tmExternalLeading ;
可以看到在计算cyChar时包括了tmExternalLeading 栏位来确保可读性。
要显示格式化的字符串必须要使用sprintf和wsprintf函数来显示,从 sprintf 和 wsprintf 传回的值就是字串的长度。2.10 综合使用
/*------------------------------------- SYSMETS.H -- System metrics display structure---------------------------------------*/#include#include #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) struct { int index; TCHAR * szLable; TCHAR * szDesc;}sysmetrics[] = { SM_CXSCREEN, TEXT("SM_CXSCREEN"), TEXT("Screen width in pixels"), SM_CYSCREEN, TEXT("SM_CYSCREEN"),TEXT("Screen height in pixels"), SM_CXVSCROLL, TEXT("SM_CXVSCROLL"), TEXT("Vertical scroll width"), SM_CYHSCROLL, TEXT("SM_CYHSCROLL"), TEXT("Horizontal scroll height"), SM_CYCAPTION, TEXT("SM_CYCAPTION"), TEXT("Caption bar height"), SM_CXBORDER, TEXT("SM_CXBORDER"), TEXT("Window border width"), SM_CYBORDER, TEXT("SM_CYBORDER"), TEXT("Window border height"), SM_CXFIXEDFRAME, TEXT("SM_CXFIXEDFRAME"), TEXT("Dialog window frame width"), SM_CYFIXEDFRAME, TEXT("SM_CYFIXEDFRAME"), TEXT("Dialog window frame height"), SM_CYVTHUMB, TEXT("SM_CYVTHUMB"), TEXT("Vertical scroll thumb height"), SM_CXHTHUMB, TEXT("SM_CXHTHUMB"), TEXT("Horizontal scroll thumb width"), SM_CXICON, TEXT("SM_CXICON"), TEXT("Icon width"), SM_CYICON, TEXT("SM_CYICON"), TEXT("Icon height"), SM_CXCURSOR, TEXT("SM_CXCURSOR"), TEXT("Cursor width"), SM_CYCURSOR, TEXT("SM_CYCURSOR"), TEXT("Cursor height"), SM_CYMENU, TEXT("SM_CYMENU"), TEXT("Menu bar height"), SM_CXFULLSCREEN, TEXT("SM_CXFULLSCREEN"), TEXT("Full screen client area width"), SM_CYFULLSCREEN, TEXT("SM_CYFULLSCREEN"), TEXT("Full screen client area height"), SM_CYKANJIWINDOW, TEXT("SM_CYKANJIWINDOW"), TEXT("Kanji window height"), SM_MOUSEPRESENT, TEXT("SM_MOUSEPRESENT"), TEXT("Mouse present flag"), SM_CYVSCROLL, TEXT("SM_CYVSCROLL"), TEXT("Vertical scroll arrow height"), SM_CXHSCROLL, TEXT("SM_CXHSCROLL"), TEXT("Horizontal scroll arrow width"), SM_DEBUG, TEXT("SM_DEBUG"), TEXT("Debug version flag"), SM_SWAPBUTTON, TEXT("SM_SWAPBUTTON"), TEXT("Mouse buttons swapped flag"), SM_CXMIN, TEXT("SM_CXMIN"), TEXT("Minimum window width"), SM_CYMIN, TEXT("SM_CYMIN"), TEXT("Minimum window height"), SM_CXSIZE, TEXT("SM_CXSIZE"), TEXT("Min/Max/Close button width"), SM_CYSIZE, TEXT("SM_CYSIZE"), TEXT("Min/Max/Close button height"), SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME"), TEXT("Window sizing frame width"), SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME"), TEXT("Window sizing frame height"), SM_CXMINTRACK, TEXT("SM_CXMINTRACK"), TEXT("Minimum window tracking width"), SM_CYMINTRACK, TEXT("SM_CYMINTRACK"), TEXT("Minimum window tracking height"), SM_CXDOUBLECLK, TEXT("SM_CXDOUBLECLK"), TEXT("Double click x tolerance"), SM_CYDOUBLECLK, TEXT("SM_CYDOUBLECLK"), TEXT("Double click y tolerance"), SM_CXICONSPACING,TEXT("SM_CXICONSPACING"), TEXT("Horizontal icon spacing"), SM_CYICONSPACING,TEXT("SM_CYICONSPACING"), TEXT("Vertical icon spacing"), SM_MENUDROPALIGNMENT, TEXT("SM_MENUDROPALIGNMENT"), TEXT("Left or right menu drop"), SM_PENWINDOWS, TEXT("SM_PENWINDOWS"), TEXT("Pen extensions installed"), SM_DBCSENABLED, TEXT("SM_DBCSENABLED"), TEXT("Double-Byte Char Set enabled"), SM_CMOUSEBUTTONS, TEXT("SM_CMOUSEBUTTONS"), TEXT("Number of mouse buttons"), SM_SECURE, TEXT("SM_SECURE"), TEXT("Security present flag"), SM_CXEDGE, TEXT("SM_CXEDGE"), TEXT("3-D border width"), SM_CYEDGE, TEXT("SM_CYEDGE"), TEXT("3-D border height"),};
/*------------------------------------- 将SYSMETS.H中的结构体显示到视窗上面 ---------------------------------------*/#include#include "SYSTEMS.h"LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR sCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("SysMets1"); HWND hwnd; MSG msg; WNDCLASSEX wndclass; wndclass.cbSize = sizeof(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)::GetStockObject(WHITE_BRUSH);//使用白色背景画刷 wndclass.lpszMenuName = NULL; //不指定菜单 wndclass.lpszClassName = szAppName; //窗口类的名称 wndclass.hIconSm = NULL; //没有类的小图标 if (!RegisterClassEx(&wndclass)) { MessageBox(NULL, TEXT("Can't funcitom"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindowEx( 0, //dwExStyle, 扩展样式 szAppName, //lpClassName,类名 "WindowsName", //lpWindowName窗口名称 WS_OVERLAPPEDWINDOW, //dwStyle, 窗口风格 CW_USEDEFAULT, //X,初始X坐标 CW_USEDEFAULT, //Y,初始Y坐标 CW_USEDEFAULT, //nWight, 宽度 CW_USEDEFAULT, //nHight, 高度 NULL, //hWndParent, 父窗口句柄 NULL, //hMenu, 菜单句柄 hInstance, //hInstance, 程序实例句柄 NULL //ipParam,用户数据 ); ::ShowWindow(hwnd, iCmdShow); ::UpdateWindow(hwnd); while (::GetMessage(&msg, NULL, 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; HDC hdc; int i; PAINTSTRUCT ps; TCHAR szBuff[10]; 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 (int i = 0; i < NUMLINES; i++) { TextOut(hdc, 0, cyChar * i, sysmetrics[i].szLable, lstrlen(sysmetrics[i].szLable)); TextOut(hdc, 22 * cxCaps, cyChar * i, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc)); SetTextAlign(hdc, TA_RIGHT | TA_TOP); TextOut(hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuff, wsprintf(szBuff, TEXT("%5d"), GetSystemMetrics(sysmetrics[i].index))); SetTextAlign(hdc, TA_LEFT | TA_TOP); } EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam);}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月03日 01时14分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
视觉SLAML1作业
2019-03-01
【一只蒟蒻的刷题历程】 【HDU-1276】 士兵队列训练问题
2019-03-01
【 UVA - 572 】 Oil Deposits (DFS水题)
2019-03-01
【Linux】 Linux实操 --- 开机、重启和用户登录注销
2019-03-01
约瑟夫环问题
2019-03-01
CF #716 (Div. 2) B. AND 0, Sum Big(思维+数学)
2019-03-01
Java 設計模式 - 建造者模式
2019-03-01
ES6 JavaScript 重新認識 Promise
2019-03-01
2020-07-16:如何获得一个链表的倒数第n个元素?
2019-03-01
2021-01-21:java中,HashMap的读流程是什么?
2019-03-01
Imagination官方信息速递2021年光线追踪专刊
2019-03-01
计算机视觉中的双目立体视觉和体积度量
2019-03-01
什么是数据中心,它们是如何变化的?
2019-03-01
webpack01 -- webpack安装和配置
2019-03-01
分享九款不同页面404源码html
2019-03-01
404页圈小猫游戏代码
2019-03-01
好看清新卡通人物404单页网站源码
2019-03-01
简洁仿t猫404页html源码
2019-03-01