在窗口显示文字和绘制图形

qt之图形图像操作 文章目录1. 绘制文字2. 绘制线条3. 绘制椭圆4. 显示静态图像5.显示动态图像6. 图片移动7. 图片翻转8. 图片缩放 1. 绘制文字 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public 阅读详情

昨天和大家谈了如何建立一个带有窗口的Windows程序,今天和大家说说如何在窗口中显示文字吧!!

先说说相关的基础知识

(1).绘制和更新

在Windows中,只能在窗口的显示区域绘制文字和图形,而且不能确保在显示区域内显示的内容会一直保留到程序下一次有意地改写它时还保留在那里。例如,使用者可能会在屏幕上移动另一个程序的窗口,这样就可能覆盖您的应用程序窗口的一部分。Windows不会保存您的窗口中被其它程序覆盖的区域,当程序移开后,Windows会要求您的程序更新显示区域的这个部分, Windows通过发送WM_PAINT消息通知窗口消息处理程序,窗口的部分显示区域需要绘制。

(2).WM_PAINT消息

大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要呼叫函数UpdateWindow。Windows利用这个机会给窗口消息处理程序发送第一个WM_PAINT消息。这个消息通知窗口消息处理程序:必须绘制显示区域。此后,窗口消息处理程序应在任何时刻都准备好处理其它WM_PAINT消息,必要的话,甚至重新绘制窗口的整个显示区域。

 

(3).有效矩形和无效矩形

Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」。如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。

窗口消息处理程序可以通过呼叫InvalidateRect使显示区域内的矩形无效。如果消息队列中已经包含一个WM_PAINT消息,Windows将计算出新的无效矩形。否则,它将一个新的WM_PAINT消息放入消息队列中。在接收到WM_PAINT消息时,窗口消息处理程序可以取得无效矩形的坐标(我们马上就会看到这一点)。通过呼叫GetUpdateRect,可以在任何时候取得这些坐标。

在处理WM_PAINT消息处理期间,窗口消息处理程序在呼叫了BeginPaint之后,整个显示区域即变为有效。程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除

GDI相关的内容

要在窗口的显示区域绘图,可以使用Windows的图形设备接口(GDI)函数

(1). 设备内容

句柄只不过是一个数值,Windows以它在内部使用对象。程序写作者从Windows取得句柄,然后在其它函数中使用该句柄。设备内容句柄是GDI函数的窗口「通行证」,有了这种设备内容句柄,程序写作者就能自如地在显示区域上绘图,使图形如自己所愿地变得好看或者难看。

设备内容(简称为「DC」)实际上是GDI内部保存的数据结构。设备内容与特定的显示设备(如视讯显示器或打印机)相关。对于视讯显示器,设备内容总是与显示器上的特定窗口相关。

设备内容中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。例如,对于TextOut,设备内容的属性确定了文字的颜色、文字的背景色、x坐标和y坐标映像到窗口的显示区域的方式,以及显示文字时Windows使用的字体。

当程序需要绘图时,它必须先取得设备内容句柄。在取得了该句柄后,Windows用内定的属性值填入内部设备内容结构。在后面的章节中您会看到,可以通过呼叫不同的GDI函数改变这些默认值。利用其它的GDI函数可以取得这些属性的目前值。当然,还有其它的GDI函数能够在窗口的显示区域真正地绘图。

当程序在显示区域绘图完毕后,它必须释放设备内容句柄。句柄被程序释放后就不再有效,且不能再被使用。程序必须在处理单个消息处理期间取得和释放句柄。除了呼叫CreateDC()建立的设备内容之外,程序不能在两个消息之间保存其它设备内容句柄

(2) 取得设备内容句柄的方法:

方法一:

caseWM_PAINT:

       

  hdc = BeginPaint (hwnd, &ps) ;

       

         使用GDI函数

       

  EndPaint (hwnd, &ps) ;

       

  return 0 ;

 

在处理WM_PAINT消息时,使用这种方法。它涉及BeginPaint和EndPaint两个函数,这两个函数需要窗口句柄(作为参数传给窗口消息处理程序)和PAINTSTRUCT结构的变量(在WINUSER.H表头文件中定义)的地址为参数

在处理WM_PAINT消息时,窗口消息处理程序首先呼叫BeginPaint。BeginPaint函数一般在准备绘制时导致无效区域的背景被擦除。该函数也填入ps结构的字段。BeginPaint传回的值是设备内容句柄,这一传回值通常被保存在叫做hdc的变量中

HDC数据型态定义为32位的无正负号整数。然后,程序就可以使用需要设备内容句柄的TextOut等GDI函数。呼叫EndPaint即可释放设备内容句柄。

方法二:

hdc = GetDC (hwnd) ;

       

使用GDI函数

       

ReleaseDC (hwnd, hdc) ;

 

主要用来处理非WM_PAINT消息处理期间绘制显示区域的某个部分的;

主要步骤如下:

(1). 得到窗口显示区域的设备内容句柄,可以呼叫GetDC来取得句柄,在使用完后呼叫ReleaseDC;

注意:

与从BeginPaint传回设备内容句柄不同,GetDC传回的设备内容句柄具有一个剪取矩形,它等于整个显示区域。可以在显示区域的某一部分绘图,而不只是在无效矩形上绘图(如果确实存在无效矩形)。与BeginPaint不同,GetDC不会使任何无效区域变为有效。如果需要使整个显示区域有效,可以呼叫

ValidateRect (hwnd, NULL) ;

       

一般可以呼叫GetDC和ReleaseDC来对键盘消息(如在字处理程序中)和鼠标消息(如在画图程序中)作出反应。此时,程序可以立刻根据使用者的键盘或鼠标输入来更新显示区域,而不需要考虑为了窗口的无效区域而使用WM_PAINT消息。不过,一旦确实收到了WM_PAINT消息,程序就必须要收集足够的信息后才能更新显示。

与GetDC相似的函数是GetWindowDC。GetDC传回用于写入窗口显示区域的设备内容句柄,而GetWindowDC传回写入整个窗口的设备内容句柄。例如,您的程序可以使用从GetWindowDC传回的设备内容句柄在窗口的标题列上写入文字。然而,程序同样也应该处理WM_NCPAINT (「非显示区域绘制」)消息

 

下面请看具体的示例(注意,其中的实现窗口部分的代码是重复前面的代码的,以后再说的时候就不全部写了,请大家参考前面的代码)

#include <windows.h>

#include <math.h>

 

#define NUM     1000

#define myTWOPI  (2*3.14159)

 

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

 

 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)

{

    static TCHAR szAppName[]=TEXT("SinWave");

 

    HWND hwnd;

 

    MSG msg;

 

    WNDCLASS wndclass;

 

    wndclass.style=CS_HREDRAW | CS_VREDRAW;

 

    wndclass.lpfnWndProc=WndProc;

 

    wndclass.cbClsExtra=0;

    wndclass.cbWndExtra=0;

 

    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

 

    wndclass.lpszMenuName=NULL;

 

   

 

    wndclass.hInstance=hInstance;

 

    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

 

    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

 

    wndclass.lpszClassName=szAppName;

 

    if(!RegisterClass(&wndclass))

    {

        MessageBox(NULL,TEXT("This program requires Windows NT!!"),szAppName,MB_ICONERROR);

        return 0;  

    }

 

    hwnd=CreateWindow(szAppName,

        TEXT("Draw Sine Wave Using Polyline"),

        WS_OVERLAPPEDWINDOW,

        CW_USEDEFAULT,

        CW_USEDEFAULT,

        CW_USEDEFAULT,

        CW_USEDEFAULT,

        NULL,

        NULL,

        hInstance,

        NULL);

 

    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 cxClient,cyClient;

 

    HDC hdc;

 

    int i;

 

    PAINTSTRUCT ps;

 

    POINT apt[NUM];                                                     //定义1000组数据

    TCHAR szBuffer[40];

    HPEN hPen;

    switch(message)

    {

    //处理WM_SIZE消息

    case WM_SIZE:

       

        cxClient=LOWORD(lParam);

        cyClient=HIWORD(lParam);

 

        return 0;

 

    case WM_PAINT:

       

        hdc=BeginPaint(hwnd,&ps);

       

    //  TCHAR szBuffer[40];注意此行要把szBuffer的定义放在消息处编译理的前面,不然编译会报错的;

   

 

       

        SetTextColor(hdc,RGB(255,0,0));

        //设置文字的背景色

        SetBkColor(hdc,RGB(0,255,255));

 

        /*

        SetTextColor的MSDN文档

 

            COLORREF SetTextColor(

              HDC hdc,           // handle to device context

              COLORREF crColor   // text color

            );

 

        COLORREF的文档

        When specifying an explicit RGB color, the COLORREF value has the following hexadecimal form:

        0x00bbggrr

        The low-order byte contains a value for the relative intensity of red; the second byte contains a value for green; and the third byte contains a value for blue. The high-order byte must be zero. The maximum value for a single byte is 0xFF

       

        The RGB macro selects a red, green, blue (RGB) color based on the arguments supplied and the color capabilities of the output device.

 

        COLORREF RGB(

          BYTE bRed,    // red component of color

          BYTE bGreen,  // green component of color

          BYTE bBlue    // blue component of color

        );

       

        COLORREF SetBkColor(

          HDC hdc,           // handle of device context

          COLORREF crColor   // background color value

        );

 

        */

 

 

        TextOut(hdc,20,20,szBuffer,

                wsprintf(szBuffer,TEXT("luliuyan!!!"))

                );

       

        /*

        看看MSDN的文档

        int wsprintf(

          LPTSTR lpOut,    // pointer to buffer for output

          LPCTSTR lpFmt,   // pointer to format-control string

          ...              // optional arguments

        );

        返回的是字符串的长度;

       

        BOOL TextOut(

            HDC hdc,           // handle to device context

            int nXStart,       // x-coordinate of starting position

            int nYStart,       // y-coordinate of starting position

            LPCTSTR lpString,  // pointer to string

            int cbString       // number of characters in string

        );

        */

       

        //创建画笔

        hPen=CreatePen(PS_SOLID,3,RGB(255,0,0));

        //把画笔选入设备环境

        SelectObject(hdc,hPen);

 

        /*

        HPEN CreatePen(

          int fnPenStyle,    // pen style

          int nWidth,        // pen width

          COLORREF crColor   // pen color

        );

 

         

        */

        //画x方向的横线

        MoveToEx(hdc,0,cyClient/2,NULL);

        LineTo(hdc,cxClient,cyClient/2);

       

        //画y方向的横线

        MoveToEx(hdc,0,0,NULL);

        LineTo(hdc,0,cyClient);

       

        for(i=0;i<NUM;i++)

        {

            //把横坐标等分成1000个点

            apt[i].x=i*cxClient/NUM;                   

           

            //根据横坐标计算纵坐标

            apt[i].y=(int)(cyClient/2*(1-sin(myTWOPI*i/NUM)));

               

        }

        Polyline(hdc,apt,NUM);

        //不要忘了清除画笔对象;

 

        DeleteObject(hPen);

        return 0;

    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    }

 

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

 

}

 

程序运行的结果:

 

 

 

屏幕写字易语言源码 可以在易语言主窗口屏幕上面写字。起到宣传作用 立即下载

相关推荐

VisionPro脚本显示文本、创建标签

本资源主要介绍VisionPro脚本简单实现文本显示以及创建标签的功能。

visionpro 窗口显示文字

代码让visionpro在窗口显示数据 /// <summary> /// 显示label到窗口 /// </summary> /// <param name="cogDisplay1">显示控件</param> /// <param name="x">显示的位置X</param> /// <param name="y">显示的位置Y</

weixin_39899255的博客 4531

C# 新手实例:在窗体上显示图片和文字

C# 新手实例:在窗体上显示图片和文字 C#新手实例:在窗体上显示图片和文字,超简单,本来不想放出来的,不过多看些实例有好处的。

Visionpro视觉CogDisplay [ 图像显示窗体控件 ]的调用和显示文字

CoordinateAxes) :意思是创建一个匹配工具的结果图层,这个图层是用来显示一中心坐。image 图片变量 (类型为 ICogImage)附:CogPMAlignTool1 匹配工具。

m0_72763096的博客 2254

易语言D3D菜单绘制实例,游戏绘制实例!

用于FPS游戏的外部绘制,绘制菜单 文字 骨骼 血条 方框 等!

基于Ultralytics RT-DETR的工业缺陷检测实战:从NEU-DET数据集准备到模型部署

本文详细介绍了基于Ultralytics框架和RT-DETR模型进行工业缺陷检测的完整实战流程。内容涵盖从NEU-DET数据集准备、YOLO格式转换、环境配置,到模型训练、关键参数调优、性能验证与可视化分析,最后提供了ONNX等格式的模型部署方案,为工业质检场景提供了一套高效、可落地的AI解决方案。

weixin_29168393的博客 339

VisionPro脚本入门之显示文本、标签

在上一篇输入输出部分简单介绍了一下ToolBlock脚本的输入输出,并且实现了简单的计算距离功能,但是一个项目中光实现功能是不够的,还需要我们把结果更加直观的展示给客户。本文就简单介绍一下在脚本中如何实现文本显示以及对特定目标进行特别标记。主要涉及CogGraphicLabel类、CogPointMarker类。例如下图对圆进行坐标半径显示,并且标记出圆心。 主要代码如下: 结果图片: 以...

qq_34123546的博客 2万+

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1860

pygame图形、色彩、文字绘制机制

色彩表达 最后一个表示十六进制 倒数第二个的 a 参数如下 常用颜色   色彩表达   图形绘制 可以绘制的图形 以矩形为例 import pygame,sys pygame.init() screen = pygame.display.set_mode((600,400)) pygame.display.set_caption('图形绘制') go...

木下瞳的博客 1632

对称加密和非对称加密,数字签名和证书

在对称加密中,任何人都可以使用公钥进行加密。在数字签名中,任何人都可以使用公钥验证签名。数字签名,其实就是将非对称加密反过来使用。公钥私钥非对称加密发送者加密时使用接收者解密时使用数字签名验证者验证签名时使用签名者生成签名时使用谁持有密钥?只要有需要,任何人都可以持有个人持有既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密。公钥负责加密,私钥负责解密。既然是签名,那肯定是不希望有人冒充我发消息,所以只有我才能签名。私钥负责签名,公钥负责验签。

m0_70432049的博客 1409

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 538

pygame显示图片的方法_day10-pygame图片、文字的显示,图形的绘制

1.pygame1.1初始化pygame.init()1.2.创建窗口set_mode((宽度,高度))screen = pygame.display.set_mode((600,400))1.3.游戏循环while True:#检测窗口上的按钮是否被点击for event in pygame.event.get():if event.type ==pygame.QUITcolse()2、显示文字...

weixin_31955465的博客 544

用Playwright MCP让AI帮你完成所有浏览器自动化

Playwright MCP(Model Context Protocol)是微软基于 Playwright 框架推出的 AI 浏览器自动化新协议。它通过结构化快照数据和自然语言指令结合大型语言模型(如 GPT),实现无需编码的网页交互。无论你是要测试登录流程、抓取价格数据,还是用 AI 远程控制浏览器,Playwright MCP 都能大幅降低门槛,让“说人话”也能驱动自动化脚本。本篇将从功能介绍、技术架构、使用方法到实际场景,带你全面理解这一自动化革命。

todoitbo的博客 3万+

java图形界面文字输出_java图形化Swing教程(一)

与多线程、泛型等不同,Swing主要在于使用。下面主要放代码和注释,少说话。(一)基本框架package Swing;import java.awt.*;import javax.swing.*;/**** @author QuinnNorris* 基本框架*/public class FrameTest {/*** @param args*/public static void main(Str...

weixin_42443533的博客 2583

Android16 RK3576修改亮度调节为线性调节

文章摘要: 本文分析了Android系统中亮度调节的非线性问题,并提供了线性化改造方案。首先通过追踪Settings和SystemUI代码,发现亮度调节使用了BrightnessUtils类中的非线性Gamma空间转换算法。然后重点修改了BrightnessUtils类,将原有的Hybrid Log Gamma(HLG)算法替换为简单的线性映射公式。最后在自定义工具窗口中实现了基于系统标准接口的亮度调节功能,通过SeekBar的0-100%百分比值线性映射到1-255的系统亮度值。改造后的亮度调节更加直观,

tzj1058756809的博客 75

手把手教你学 MATLAB 实战训练(6.5):基础实战实例

MATLAB 是一款强大的数学软件,广泛应用于工程计算、信号处理、控制系统设计、图像处理等领域。学习 MATLAB 不仅可以提高你的编程技能,还能帮助你解决实际的数学和工程问题。下面我将通过几个实战训练实例来教你如何使用 MATLAB。

xiaoheshang_123的博客 366

windows 上的C语言 图形界面设计函数 ( easyx 插件 )

windows 上的C语言 图形界面设计函数 ( easyx 插件 )

she666666的博客 3193

C++笔记之emplace_back(),push_back()性能比较i++ 、 ++i

操作是否需要临时对象/拷贝性能需要(构造临时对象)较慢不需要(直接构造)较快i++需要(保存旧值)对于内置类型无影响,但对于自定义类型(如迭代器、大对象)会有拷贝开销++i不需要相对更快(尤其是自定义类型)都存在"是否需要额外的临时对象/拷贝"这一性能差异点和++i都是更高效的版本(避免临时对象/拷贝)和i++都可能产生额外的临时对象(前者构造临时对象,后者保存旧值)对于内置类型(如int),i++和++i性能几乎没有差异(编译器会优化);但对于自定义类型(尤其是迭代器等重量级对象),

小勇博客 95

EasyX入门笔记

写在前面的话 这是刚学C的本蒟蒻第一次挑战控制台程序以外的 什么是EasyX EasyX是一个适合像我这样的蒟蒻编程初学者操作的图形渲染库。 本质上,EasyX是将Windows繁琐的图形绘制操作封装在头文件中,从而实现用函数简单的调用。 使用EasyX 百度EasyX官网,从官网中即可下载安装程序。它可以将EasyX直接安装在VS中。 使用EasyX需要在程序中添加头文件 include<graphics.h> 。 EasyX帮助文档:EasyX在线文档 EasyX中的坐标和设备 坐标 和数学

Nico_Anzio的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Halcon学习(七)图像中显示文字

在图像中显示文字,数字等文本。 * ball.hdev: Inspection of Ball Bonding dev_update_window ('off') dev_close_window () dev_open_window (0, 0, 728, 512, 'black', WindowID) read_image (Bond, 'die/die_03') dev_disp

机器视觉之家 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

windows程序设计第2章 输出文字

输出文字   

Just Do It 2147

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

学习c语言游戏设计

c语言游戏设计笔记

m0_62031951的博客 3469

C/C++/EasyX——入门图形编程(3)

C/C++/EasyX 学习编程,做游戏,快速入门图形编程,这个easyx开发软件能让编程的学习不再乏味,也不难,是个很有意思的软件,大家可以当一个课外乐趣,去学习了解一下,,平时也可以做一个简易游戏,比如扫雷,五子棋,飞机大战等等。总而言之是个非常不错的选择。

wcj_______的博客 1076

EasyX 图形库入门,使用C/C++语言快速上手图形和游戏编程。

内容大纲为B站up主“c语言Plus”的视频内容所记录的笔记,感兴趣的小伙伴可前去了解更多小游戏的开发教程。 目录 导读 EasyX 是针对 C/C++ 的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程。 比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。 原理 基于Winwods图形编程,将Windows下的复杂程序过程进行封装,将Windows下的编程过程隐藏,..

weixin_60895836的博客 7767

告别黑框框,EasyX教你重识C语言

接下里还有一个东西就是坐标,在数学中我们知道横坐标为X,纵坐标为Y,他们的起点坐标也就是(0,0)那么在EasyX中也同样是这样的,不同的是,比如说我话一个正方形,X,Y的坐标是从这个正方形开始画的那个地方为(0,0)出发的。例如这是我们的一个界面一面装着我们画出来的矩形,要把文字放入中间的话我们先拿到界面宽度的一半,在拿到文字的一般,用界面宽度的一半减去文字宽度的一半就得到起点到文字开始的距离,再用从起点加到文字的这段距离就得到我们居中的起点位置,从这里开始放文字就能恰好把文字放入中心点。

Trustmeican的博客 2403
上一篇: 创建你的第一个带有窗口的Windows程序
下一篇: XML数据的底层结构之DTD(理论部分)
Cpp_Java_Man
博客等级 码龄21年 26粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值