Graphic知识点摘记

本文介绍了绘图操作中的关键函数,如SetPixel和StretchBlt的使用方法,以及颜色和字体选择对话框的设计与定制过程。此外还涉及了设备上下文转换、位图结构、图元文件创建等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于程序的绘图操作,现将知识点摘记如下。


1.COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);该函数将指定坐标处的像素设为指定的颜色。

变形函数:public final void setPixel( Point pt, Color color )


2.CColorDialog 对象是具有用于显示系统定义颜色的列表的对话框。

数据成员:CColorDialog::m_cc
CHOOSECOLOR m_cc;
用于的结构自定义对话框的设置。
在构造 CColorDialog 对象之后,可以使用 m_cc 在调用 DoModal 成员函数之前设置对话框的各个方面。

构造函数:CColorDialog::CColorDialog
CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL );
构造 CColorDialog 对象。

参数

lrInit 默认颜色选择。 如果未指定任何值,则默认值为RGB (0,0,0) (黑色)。

dwFlags 自定义对话框的功能和外观的设置标志。 有关更多信息,请参见 Windows SDK的CHOOSECOLOR 结构。

pParentWnd 指针到对话框的父级或所有者窗口。


3.CHOOSECOLOR 结构。该结构包含了ChooseColor函数用于初始化颜色对话框的信息。在用户关闭对话框之后,系统返回关于用户选择的颜色信息。

typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HWND hInstance;
COLORREF rgbResult;
COLORREF *lpCustColors;
DWORD Flags;
LPARAM lCustData;
LPCCHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} CHOOSECOLOR, *LPCHOOSECOLOR;

成员
lStructSize指定结构的长度(字节)

hwndOwner拥有对话框的窗口的句柄。该成员可以是任意有效的窗口句柄,或在对话框没有所有者时,可为NULL

hInstance
如果Flag成员设置了CC_ENABLETEMPLATEHANDLE标识符时,该成员是一个包含了对话框模板的内存对象的句柄。如果 CC_ENABLETEMPLATE 标识符被设置时,该成员是一个包含了对话框的模块句柄。如果上述两个标识符都未被设置,则该成员被忽略。

rgbResult
如果CC_RGBINIT标识符被设置时,该成员指定了对话框打开时默认的选择颜色。如果指定的颜色值不在有效的范围内,系统会自动选择最近的颜色值。如果该成员为0或CC_RGBINIT未被设置,初始颜色是黑色。如果用户单击OK按钮,该成员指定了用户选择的颜色。

lpCustColors
指向一个包含16个值的数组,该数组包含了对话框中自定义颜色的红、绿、蓝(RGB)值。如果用户修改这些颜色,系统将用新的颜色值更新这个数组。如果要在多个ChooseColor函数中保存这个新的数组,你应该为该数组分配静态内存空间。

Flags一个可以让你初始化颜色对话框的位集。当对话框返回时,它用来这些标识符来标识用户的输入。该成员可以为下列标识符的任意组合。

CC_ANYCOLOR对话框显示所有可用的基于基本颜色的颜色。

CC_ENABLEHOOK激活由lpfnHook成员指定的钩子程序。该标识仅用于初始化对话框时。

CC_ENABLETEMPLATE表示利用由hInstance 和 lpTemplateName 成员指定的对话框模板。该标识符仅用于初始化对话框。

CC_ENABLETEMPLATEHANDLE
表示hInstance成员标识一个包含了预加载的对话框模板的数据块。如果该标识被指定,系统会忽略 lpTemplateName 成员。该标识符仅用于初始化对话框。

CC_FULLOPEN让对话框显示额外的控件以使用户创建自定义的颜色。如果该标识未设置,用户必须点击【自定义颜色】按钮才能显示自定颜色控件。

CC_PREVENTFULLOPEN使自定义颜色按钮失效。

CC_RGBINIT让对话框默认使用由rgbResult成员指定的颜色

CC_SHOWHELP让对话框显示帮助按钮。hwndOwner成员必须在用户点击【帮助】按钮时发送HELPMSGSTRING消息的窗口

CC_SOLIDCOLOR让对话框仅显示基本颜色组成的纯色。

lCustData
指定应用程序自定义的数据,该数据会被系统发送给钩子程序。当系统的发送WM_INITDIALOG消息给钩子程序时,消息的lParam参数是一个指向CHOOSECOLOR结构的指针。钩子程序可以利用该指针获得该成员的值。

lpfnHook
指向CCHookProc钩子程序的指针,该钩子可以处理发送给对话框的消息。该成员只在CC_ENABLEHOOK标识被设定的情况下才可用,否则该成员会被忽略。

lpTemplateName指向一个NULL结尾的字符串,该字符串是对话框模板资源的名字。


4.CFontDialog可以使你向应用添加一个字体选择对话框。一个CFontDialog对象是一个带有当前安装到系统的字体列表对话框,用户可从列表中选择一种字体并将选择传递给应用。
数据成员
m_cf
一个用于定制CFontDialog对象的结构

构造函数

CFontDialog 构造一个CFontDialog对象操作。
构造函数原型如下:
CFontDialog::CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );
构造一个对象,其中参数lplfInitial指向一个LOGFONG结构.如果该参数设置为NULL表示不设置初始字体。pdcPrinter指向一个代表打印机设备环境的DC对象,若设置该参数则选择的字体就为打印机所用。pParentWnd用于指定父窗口。通过调用DoModal()创建对话框,在返回后通过调用以下函数来得到用户选择:

操作

DoModal 显示对话框并使用用户选择。
GetCurrentFont 获取当前选定字体的名字。
GetFaceName 返回选择字体的字样名称。
GetStyleName 返回选择字体的风格名称。
GetSize 返回选择字体的点大小。
GetColor 返回选择字体的颜色。
GetWeight 返回选择字体的磅数。
IsStrikeOut 判断字体是否突出。
IsUnDerline 判断字体是否有下划线。
IsBold 判断字体是否是黑体。
IsItalic 判断字体是否是斜体。


5.CHOOSEFONT结构体
typedef struct {
    DWORD lStructSize;
    HWND hwndOwner;
    HDC hDC;
    LPLOGFONT lpLogFont;
    INT iPointSize;
    DWORD Flags;
    COLORREF rgbColors;
    LPARAM lCustData;
    LPCFHOOKPROC lpfnHook;
    LPCTSTR lpTemplateName;
    HINSTANCE hInstance;
    LPTSTR lpszStyle;
    WORD nFontType;
    INT nSizeMin;
    INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;

CHOOSEFON结构体中有个成员lpLogFont,它是指向LOGFONT结构体变量的指针,就像上面所说,LOGFONT中包含了字体特征,例如,我们可以通过LOGFONT的lfFaceName得知字体名。


6.LOGFONT结构体
typedef struct tagLOGFONT {
    LONG lfHeight;
    LONG lfWidth;
    LONG lfEscapement;
    LONG lfOrientation;
    LONG lfWeight;
    BYTE lfItalic;
    BYTE lfUnderline;
    BYTE lfStrikeOut;
    BYTE lfCharSet;
    BYTE lfOutPrecision;
    BYTE lfClipPrecision;
    BYTE lfQuality;
    BYTE lfPitchAndFamily;
    TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;


7.ScreenToClient也就是Screen(屏幕坐标) 到 Client(客户区坐标)的转换。也就是说这个函数可以把你在屏幕上鼠标的位置转换为你打开的程序的客户区的坐标(位置)。
函数功能:该函数把屏幕上指定点的屏幕 坐标转换成用户坐标。
函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
BOOL ScreenToClient(HWND hWnd ,// handle to window, LPPOINT lpPoint// screen coordinates );

hWnd
指向窗口的 句柄,此窗口的 用户空间将被用来转换。

lpPoint

指向POINT结构 指针,该结构含有要转换的屏幕坐标。

返回值

如果 函数调用成功,返回值为非零值,否则为零。

Windows NT

若想获得更多错误信息,请调用 GetLastError函数。

注释

该函数应用 hWnd参数标识的窗口和POINT结构给定的屏幕坐标来计算用户坐标,然后以用户坐标来替代屏幕坐标,新坐标是相对于指定窗口的领域的左上角。


8.UpdateData() 是 MFC窗口函数,用来 刷新数据的。

总的来说:操作系统会调用这个函数来初始化对话框中的数据,或者检索或者验证对话框中的数据。
简单说就是:如果Updatedata(TRUE) == 将控件的值赋值给成员变量;Updatedata(FALSE) == 将成员变量的值赋值给控件。
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
参数说明
bSaveAndValidate:标明那对话框是初始化(FALSE)还是数据恢复(TRUE)。


9.StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

hdcDest:指向目标设备环境的句柄。
nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。
nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。
hdcSrc:指向源设备环境的句柄。
nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。
nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。
nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。
nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。
dwRop:指定要进行的光栅操作。光栅 操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源 位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。


10.typedef    struct    tagBITMAP    {    
   
           LONG    bmType;                //必需为0  
           LONG    bmWidth;              //位图的宽度( 搜索以像素为单位)  
           LONG    bmHeight;            //位图的高度(以像素为单位)  
   
           /*指定每条光栅所占字节数。此值必须取偶数,  
              因为图形设备接口(GDI)默认为一个位图的位值组成一个2字节的整数数组。*/  
           LONG    bmWidthBytes;    
   
           WORD    bmPlanes;            //    位图调色板颜色数  
   
           WORD    bmBitsPixel;      //    一个点在每个调色板上接近的颜色位数  
   
           LPVOID    bmBits;            //   指向存储像素阵列的数组  
   
   }    BITMAP;


11.SetWorldTransform 该函数为指定的设备环境设置全局空间和页面空间之间的二维的线性转变,此转换可用于输出缩放、旋转、倾斜变换或平移变换的图形。
函数原型:
BOOL SetWorldTransform(
HDC hdc , // 设备上下文句柄
CONST XFORM*lpXform// 变换数据
);
hdc:指向设备环境的句柄。
lpxform:指向XFORM结构的 指针,此结构含有转换数据。
返回值:如果 函数调用成功,返回值为非零值,否则为零。



12.CMetaFileDC  Windows图元文件包含了一序列 图形设备接口(GDI)命令,可以用来创建需要的图像或文本。
为了实现Windows 图元文件,首先要创建一个CMetaFileDC 对象。调用CMetaFileDC 构造函数,然后调用Create成员函数,以创建Windows图元文件 设备上下文,并将它附加给CMetaFileDC 对象。
下一步将希望重复的CDC GDI命令序列发送给CMetaFileDC 对象。仅仅那些能够创建输出的GDI命令,例如MoveTo或LineTo,才能够使用。
在给 图元文件发送了期待的命令后,调用Close成员函数,它将关闭图元文件 设备上下文,并返回图元文件的句柄。之后就可以处理CMetaFileDC 对象。
CDC::PlayMetaFile能够使用 图元文件的句柄,来重复播放图元文件。这个 图元文件也可以由Windows函数,如 CopyMetaFile进行操作,它将把图元文件拷贝到磁盘中。
当不再需要 图元文件时,使用DeleteMetaFile Windows函数将其从内存中删除。
也可以实现CMetaFileDC 对象,以便它能够处理输出调用及GDI属性调用,如 GetTextExtent。这样, 图元文件就有更多的弹性,并能够更容易重新使用一般的GDI代码,它经常包含了输出和属性调用的混合。CMetaFileDC类从CDC继承了两个 设备上下文,m_hDC和m_hAttribDC。m_hDC 设备上下文处理所有的CDC GDI输出调用,而m_hAttribDC设备上下文处理所有的CDC GDI属性调用。一般而言,这两个 设备上下文属于同一个设备。在CMetaFileDC情形下,属性DC缺省时设置为NULL。
另创建一个 设备上下文,以指向屏幕、打印机或不同于 图元文件的其它设备,然后可以调用SetAttribDC成员函数,将新设备上下文与m_hAttribDC相关联。GDI调用的信息将直接发送到新的m_hAttribDC值中,而输出GDI调用也将送给代表 图元文件的m_hDC值。







<think>嗯,用户想了解如何使用ECharts的graphic组件来实现标注点。首先,我需要回忆一下ECharts的文档,特别是关于graphic的部分。记得graphic组件是用来在图表中添加自定义图形的,比如矩形、圆形、文本等。而标注点通常是在图表中突出显示某个数据点,可能需要用图形元素来标记。 首先,用户可能需要知道graphic的基本用法,比如如何配置graphic选项。ECharts的graphic支持多种图形类型,比如circle、rect、text等,每种图形都有自己的配置参数。例如,圆形的位置可以用x和y来指定,或者通过left、right、top、bottom等相对定位。 然后,可能需要举一个具体的例子,展示如何添加一个红色的圆形标注点。这时候需要说明在option中如何设置graphic数组,每个元素的type、位置、样式等属性。比如,type设为'circle',position设为对应的坐标点,可能还需要调整半径和颜色。 接下来,用户可能想知道如何让标注点与数据关联,比如根据数据的某个值动态显示标注。这时候需要提到ECharts的API,比如使用convertToPixel方法将数据坐标转换为像素坐标,或者使用事件处理函数在点击数据点时动态添加graphic元素。 另外,可能需要考虑不同场景下的应用,比如静态标注和动态标注的区别。静态标注可以直接在配置中写好,而动态标注可能需要结合事件和回调函数来实现。例如,在图表初始化后,通过myChart.on监听点击事件,然后更新graphic配置。 还需要注意一些常见问题,比如坐标系的转换。ECharts有多种坐标系,比如笛卡尔坐标系、极坐标系等,标注点的位置需要正确转换。比如,在折线图中,数据点的坐标可能需要通过convertToPixel转换成容器的像素位置,才能正确放置graphic元素。 另外,样式的调整也很重要,比如颜色、大小、边框等,这些都可以在graphic元素的style属性中设置。可能还需要使用动画效果,让标注点更明显,比如添加闪烁动画,这可以通过ECharts的动画配置来实现。 还要考虑兼容性和性能问题,如果添加大量的graphic元素是否会影响渲染性能。可能需要建议用户合理使用,避免过多的图形元素导致页面卡顿。 最后,可能需要总结一下graphic实现标注点的步骤:配置graphic数组,选择合适的图形类型,定位到正确的位置,设置样式,处理动态交互等。同时,提供参考链接到ECharts的官方文档,方便用户深入查阅。 在整理回答时,需要结构清晰,分步骤说明,并给出代码示例,这样用户能够逐步理解和实践。同时,确保代码语法正确,特别是JSON格式的配置项,避免常见的拼写错误或格式错误。</think>在 ECharts 中,使用 `graphic` 组件实现标注点可分为以下步骤: --- ### 一、核心原理 `graphic` 是 ECharts 的原生图形组件,可直接在画布上绘制图形(如圆形、矩形、文本等)。通过精准定位,可将其作为数据点的标注工具。 --- ### 二、基础实现代码 ```javascript option = { // 数据部分(示例折线图) xAxis: { type: 'category', data: ['A', 'B', 'C'] }, yAxis: { type: 'value' }, series: [{ data: [10, 20, 30], type: 'line' }], // 关键:graphic 标注配置 graphic: [{ type: 'circle', // 图形类型 position: [100, 150], // 坐标位置 [x, y](需根据坐标系转换) shape: { r: 6 }, // 形状参数(此处半径6px) style: { fill: '#FF0000', // 填充色 stroke: '#FFF', // 描边色 lineWidth: 2 // 描边宽度 } }] }; ``` --- ### 三、动态定位技巧 #### 场景:在数据点 `(xIndex, yValue)` 处添加标注 需通过 `convertToPixel` 转换坐标系: ```javascript const point = myChart.convertToPixel({ xAxisIndex: 0 }, [xIndex, yValue]); myChart.setOption({ graphic: [{ type: 'circle', position: point, shape: { r: 8 }, style: { fill: '#00FF00' } }] }); ``` --- ### 四、高级功能扩展 1. **复合标注**:组合多个图形(如圆形+文字) ```javascript graphic: [{ type: 'circle', position: [200, 100], shape: { r: 10 }, style: { fill: 'rgba(255,0,0,0.3)' } }, { type: 'text', left: 210, top: 90, style: { text: '重点区域', fill: '#333', fontSize: 14 } }] ``` 2. **动画标注**:通过 `keyframeAnimation` 实现闪烁效果 ```javascript graphic: [{ type: 'circle', // ...其他配置... keyframeAnimation: [{ duration: 1000, loop: true, keyframes: [ { scale: 1, style: { opacity: 1 } }, { scale: 1.5, style: { opacity: 0.5 } } ] }] }] ``` --- ### 五、注意事项 1. **坐标系适配**:使用 `grid` 或 `polar` 时需调整定位逻辑 2. **响应式处理**:窗口缩放时需重新计算 `position` 3. **性能优化**:避免大规模图形影响渲染效率 --- ### 官方文档参考 - [ECharts Graphic 配置项](https://echarts.apache.org/zh/option.html#graphic) - [坐标转换 API](https://echarts.apache.org/zh/api.html#echartsInstance.convertToPixel)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值