插入符与路径(VC_MFC)
目录
(本章节中例子都是用 VS2005 编译调试的)
插入符
CWnd 插入符相关函数:
- 创建图像插入符: CreateCaret
- 创建插入符: CreateSolidCaret
- 显示插入符: ShowCaret
- 获得 / 设置插入符的位置: GetCaretPos / SetCaretPos
编写步骤:
代码示例:
这里以在对话框里添加插入符为例子,而创建与显示插入符操作相关实现添加在初始化对话框函数中(即 OnInitDialog 函数),代码如下:
View Code
//创建插入符 CreateSolidCaret(5,30); //显示插入符 ShowCaret(); //修改插入符位置 POINT point; point.x = 20; point.y = 20; SetCaretPos(point);
运行结果:
绘制路径
相关函数:
- 开始路径: BeginPath
- 结束路径: EndPath
- 取消路径: AbortPath
- 填充路径: FillPath
- 为路径在设备资源中创建区域: PathToRegion
- 以后绘图和路径中图形的合并方式: SelectClipPath
编写步骤:
代码示例:
首先我们在对话框中的重绘函数(即 OnPaint 函数)中进行绘图操作,具体实现代码如下:
View Code
void CtestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { /* 绘图操作 ******************************************/ //获得资源 DC CClientDC pDC(this); //输出文本 This is test! CString str; str="This is test!"; pDC.TextOut(50,50,str); //绘制线条 for(int i=0;i<150;i+=10) { pDC.MoveTo(0,i); pDC.LineTo(150,i); pDC.MoveTo(i,0); pDC.LineTo(i,150); } CDialog::OnPaint(); } }
运行结果:
然后然后在绘制线条前给字符串绘制路径,让线条不会绘制在字符串上面.实现效果还是添加在对话框中的重绘函数(即 OnPaint 函数)中.具体实现如下:
View Code
void CtestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { /* 绘图操作 ******************************************/ //获得资源 DC CClientDC pDC(this); //输出文本 This is test! CString str; str="This is test!"; pDC.TextOut(50,50,str); //绘制字符串矩形路径 CSize sz=pDC.GetTextExtent(str); pDC.BeginPath(); pDC.Rectangle(50,50,50+sz.cx,50+sz.cy); pDC.EndPath(); pDC.SelectClipPath(RGN_DIFF); //绘制线条 for(int i=0;i<150;i+=10) { pDC.MoveTo(0,i); pDC.LineTo(150,i); pDC.MoveTo(i,0); pDC.LineTo(i,150); } CDialog::OnPaint(); } }
运行结果:
在 SelectClipPath 中还可以设置为 RGN_AND / RGN_COPY / RGN_DIFF / RGN_OR / RGN_XOR 样式,具体效果如下:
注意: 路径仅对在路径绘制结束后并调用 SelectClipPath 函数后的绘图操作起作用