插入符与路径(VC_MFC)

目录

插入符
绘制路径

(本章节中例子都是用 VS2005 编译调试的)


插入符

CWnd 插入符相关函数:

编写步骤:

代码示例:

这里以在对话框里添加插入符为例子,而创建与显示插入符操作相关实现添加在初始化对话框函数中(即 OnInitDialog 函数),代码如下:

View Code
//创建插入符
CreateSolidCaret(5,30);

//显示插入符
ShowCaret();

//修改插入符位置
POINT point;
point.x = 20;
point.y = 20;
SetCaretPos(point);

运行结果:


绘制路径

相关函数:

编写步骤:

代码示例:

首先我们在对话框中的重绘函数(即 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 函数后的绘图操作起作用

posted @ 2012-11-24 20:32  kzangv  阅读(879)  评论(0编辑  收藏  举报
top