第五章,文本编程

创建光标:

1.文本编辑中如何创建光标?

我们要调用CreateSolidCaret函数。

在msdn中有两个函数,一个是CWindow的CreateSolidCaret,一个是CWnd的CreateSolidCaret,前者是ATL的类成员函数,后者是MFC的类成员函数,我们只要用MFC就可。

void CreateSolidCaret(
   int nWidth,//光标宽,0表示系统定义的窗口边界宽度
   int nHeight //光标高,0表示系统定义的窗口边界高度,这两个数值只是逻辑数值,也就是说不代表实际像素,像素值依照mapping mode而定。
);
光标可以是线或块。
GetSystemMetrics(SM_CXBORDER )或者SM_CYBORDER,可以得到窗口边界。
2.如何显示光标?
创建完了之后,窗口之前的光标就被自动销毁,同时光标是隐藏的,要显示必须调用函数--ShowCaret();当前的光标就开始闪了。
3.设定显示位置
BOOL SetCaretPos(      
    int X,
    int Y
);
4.如何隐藏光标?
调用HideCaret();此时光标隐藏,但不是被销毁。这个函数会自动累加他的调用次数,如果调用了3次HideCaret(),那么要显示光标时,相应的也要调用3次ShowCaret()函数。

CreateWindow()和PreCreateWindow()的区别:

在窗口的CWnd::Create()/CreateEx()调用返回前,要调用PreCreateWindow(),对Create()/CreateEx()中的风格参数进行预处理设置.之后调用OnCreate进行实际的窗口创建,返回后,Create()/CreateEx()也返回,窗口创建结束.

PreCreateWindow()顾名思义就是在窗口创建之前执行的,它的主要任务是对所要创建的窗口进行一些风格或者其他方面的初始化或者说是设置,可以这么说,如果说窗口好比一栋建筑,那么PreCreateWindow()要做的就是在还没有建筑的时候将建筑的图纸画出来,而OnCreate()要做的就是根据图纸将建筑构建起来.

GetTextMetrics():

该函数把程序当前的字体信息,存放到TEXTMETRIC

OnPrepareDC:

在OnDraw成员函数调用前被框架函数调用用于屏幕显示。或者在OnPrint 成员函数调用前被调用于打印预览

GetDocument:

视图对象是用来显示文档对象的内容,函数GetDocument()用于获取当前文档对象的指针m_pDocument.而函数OnDraw()是一个虚函数,负责文档对象的数据在用户视图区的显示输出。在向导生成的成员函数OnDraw()中调用了函数GetDocument().通过获取的文档类指针可以在视图中显示文档内容。
OnDraw(CDC* pDc)
{
    CTextDoc *pDoc=GetDocument();
    pDc->TextOut(100,100,pDc->m_szText);
}
路径层:
  
在PS中,在设计一张海报时,可能会用到多张图片进行合成,而在合成之前是要对每张图片进行各自处理的。这个时候我们就要给每张图片定制一个它独有的处理空间--路径层。在各个独立的空间--路径层上,我们对每张图片进行处理而互相不受影响。
    类似的,在MFC中,在一块窗口上我们也可以定制各个路径层并在各个路径层上进行绘图或输出字符的操作。CDC类提供了成员函数BeginPath()和EndPath()这两个函数来实现一个路径层的创建。
   SelectClipPath:该函数的作用是将所建立的路径层作为一个剪辑区域,将原来的路径层作为另一个剪辑区域,然后对这两个区域进行取交集、并集的操作得到一个新的剪辑区域,并在这个新的区域里进行互操作。当作图的时候,如果想要在整幅图形其中的某个部分和其它部分有所区别,我们可以把这部分图形放到路径层当中,然后指定调用指定互操作模式调用SelectClipPath( int nMode )函数来使路径层和覆盖在其上新绘图剪切区域进行互操作,达到特殊效果。
    pDC->BeginPath();   路径开始
    ......BeginPath和EndPath就是创建一个路径层,之间的操作就是在路径层中的操作。
    pDC->EndPath();     路径结束
GetTextExtent:获取字体在屏幕所占的宽度和高度。
   This method computes the width and height of a line of text using the current font to determine the dimensions. The information is retrieved fromm_hAttribDC, the attribute device context.
绘制路径:
   开始路径:BeginPath
   结束路径:EndPath
   取消路径:AbortPath
   填充路径:FillPath
   为路径在设备资源中创建区域:PathToRegion
   路径和以后绘图中图形的合并方式:SelectClipPath

SelectClipPath

The SelectClipPath function selects the current path as a clipping region for a device context, combining the new region with any existing clipping region using the specified mode.

SelectClipPath用在BeginPath和EndPath之后,其作用就是将BeginPath和EndPath创建的路径作为DC的剪接区域,SelectClipPath之后所有的绘图操作就是新的区域,将SelectClipPath之前创建的路径和该函数之后操作的区域进行操作。(交、与并等操作)



路径层补充:路径仅对在路径绘制结束后并调用 SelectClipPath 函数后的绘图操作起作用,在调用SelectclipPath之前所有在路径层上的操作都会被认为是在路径层上的一部分操作,都会被认为是在路径层上的操作。在调用SelectclipPath之后的在路径层上的操作就会和在调用该函数之前在路径层上的操作区分开来,因此可以通过此函数将路径层的显示和其他区域的显示分开处理而不会受影响。
   在BeginPath()和EndPath之间画出的区域是该路径层的区域大小。
    pDC->TextOut(pt.x,pt.y,str);  此函数在路径层圈出的区域内进行操作,放在其他地方也可。
    pDC->BeginPath();
    pDC->Rectangle(0,0,size.cx,size.cy);   设定路径层区域的大小。
    pDC->EndPath();
   pDC->TextOut(pt.x,pt.y,str);此句会被认为是在路径层上的操作。SelectclipPath函数的作用是将此区域剪辑出来。
    pDC->SelectClipPath(RGN_DIFF);       设定路径层区域和其后的操作的操作模式。如果下面画图的操作在选择路径层区域之前,该画图的内容也会被选择到路径层区域中。
    for(int i=0;i<300;i+=10)
    {
        pDC->MoveTo(0,i);
        pDC->LineTo(300,i);
        pDC->MoveTo(i,0);
        pDC->LineTo(i,300);
    }
    比如上面的代码,在路径层中创建了一个矩形区域,然后在这个路径层区域内输出了一段文字,然后在整个客户区域内画图。由于路径层区域在画图的区域内,导致路径层区域内的输入受到了影响,即路径层区域内的输出文字和画图重叠。
         
    路径层的作用是圈出一块区域作为路径层,然后没有圈出的区域作为另一块区域,但是路径层区域和其他区域到底各自有什么属性,各自有什么特性并没有指出。在没有使用SelectClipPath函数时,路径层也只是一块普通的区域,使用SelectClipPath很方便的将路径层区域和之后的绘图操作区域进行分别处理,即将路径层区域和其他区域分开处理。

剪辑区域:

剪辑区域可以将它理解为一个绘图区域(绘图的区域,不设置一般都理解为客户区),其大小可以由我们来控制,对于单文档应用程序来说,除了标题栏、客户栏、菜单栏以外,剩余的就是客户区。通常可以把客户区看做一个大的剪辑区,但剪辑区域可以局限于客户区中一个小的范围之内。例如,可以限制一个局限区域作为剪辑区域,把以后的绘图操作都仅限于这个局限之内。

CDC类提供了一个SelectClipPath函数,该函数的作用是把当前设置的路径层和设备描述表中已有的剪辑区按照一种指定的模式进行互操作。

SelectClipPath:将绘图区域和路径层进行互操作,形成一个新的绘图区域。新生成的绘图区域在调用SelectClipPath函数之后生效。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值