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);}

 

上一篇:1-webrtc 原理
下一篇:windows程序设计(3):窗口

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月03日 01时14分34秒