posts - 29,comments - 10,trackbacks - 0
 

MFCDC(设备描述环境)和一些GDI函数填充装到一起,形成了一个DCD.

CDC
类中的一些常用的成员函数
函数 说明
Arc()
画椭圆弧
BitBlt()
把一个DC中的位图自制到另一个DC
Ellipse()
画椭圆
FillRect()
用指定的画刷填充矩形
LineTo()
画直线
MoveTo()
移动画笔
Rectangle()
画矩形
RoundRect()
画圆角矩形
SelectObject()
选择GDI的绘图对象
SetTextColor()
设置文本颜色
StretchBlt()
把一个DC中的位图自制到另一个DC中但可以改变位图的长宽比
TextOut()
绘制字符串

一、几种派生的CDC
类名 说明
      CClientDC
在相应除WM_PAINT消息之外的消息处理函数中提供窗口客户区的设备描述环境

void CAaaView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
    RECT rc 
= {50,50,250,150};
    dc.Ellipse(
&rc);
    CView::OnLButtonDown(nFlags, point);
}

      CMetaFileDC 代表Windows图元文件的设备描述环境,在创建与设备无关的并且可以回放的图像时使用这个类型的DC
      CPaintDC
OnDraw() 函数中使用的窗口用户区的设备描述环境,MFC中用OnDraw()函数来处理WM_PAINT消息。和WM_PAINT消息关联,当某一窗口需要绘图时,这个消息就发给这个窗口,它在窗口的OnPaint成员函数中使用,其构造函数自动调用BeginPaint,而析构函数自动调用EndPaint。这些都有Windows自动完成。我们要做的就是在CPaintDC对象上画图。

void CAaaView::OnPaint() 
{    
    CPaintDC dc(
this);     //  创建一个对象
    RECT rc = {50,50,150,150};    //  设定坐标
    dc.Rectangle(&rc);    //  绘制矩形
}

      CWindowDC 提供在整个窗口内(不只是用户区)绘图的设备描述环境 .

 void CAaaView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default
    CWindowDC dc(this);
    RECT rc 
= {50,50,250,150};
    dc.Ellipse(
&rc);
    CView::OnLButtonUp(nFlags, point);
}

二、字体描述
1、TEXTMETRIC
void CCFontInfoView::OnDraw(CDC* pDC)
{
    CCFontInfoDoc
* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
// TODO: add draw code for native data here
    TEXTMETRIC tm;
    CString strFontInfo;
    pDC
->GetTextMetrics(&tm);
    strFontInfo.Format(
"以下是当前字体的基本信息!");
    pDC
->TextOut(1010, strFontInfo);
    strFontInfo.Format(
"tmHeight = %d",tm.tmHeight);
    pDC
->TextOut(1030, strFontInfo);
}

2、LOGFONT
void CCFontInfoView::OnMyCreateFont() 
{
    
// TODO: Add your command handler code here
    
//CCFontInfoDoc* pDoc = GetDocument();
    
//ASSERT_VALID(pDoc);

    CDC
* pDC = this->GetDC();
    CString strLogFont;
    LOGFONT lFont 
= {20,    //字符单元或字符的逻辑高度
                     20,        // 字符单元或字符的逻辑宽度
                     10,        // 走格矢量与设备的X轴之间的夹角
                     10,        // 每个字符的基线与设备的X轴之间的夹角
                     555,    // 字体的灰度
                     1,        // 为斜体字体
                     1,        // 带下画线的字体
                     1,        // 带删除线的字体
                     10,        // 字体的符集
                     10,        // 字体的输出精度
                     10,        // 字体的裁减精度
                     10,        // 字体的输出质量
                     10,        // 字体的间距和系列
                     ""}
;    // 字体的字样名
    CFont m_Font;
    m_Font.CreateFontIndirect(
&lFont);
    CFont
* pOldFont = pDC->SelectObject(&m_Font);
    strLogFont 
= "第三章  多媒体文本处理";
    pDC
->TextOut(10,300,strLogFont);
}

三、创建各种字体:

1HFONT CreateFontIndirect(CONST LOGFONT *lplf)

lplf:指向定义此逻辑字体特性的LOGFONT结构的指针。

返回值:如果函数调用成功,返回值是逻辑字体的句柄;如果函数调用失败,返回值是NULL

例子看LOGFONT例子部分

2HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwltalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace)

 参数说明:http://baike.baidu.com/view/1080748.htm

void CCFontInfoView::On310() 
{
    
// TODO: Add your command handler code here
    CDC* pDC = this->GetDC();

    CFont m_Font;
    m_Font.CreateFont(
30,0,10,10,1, FALSE, TRUE, FALSE, ANSI_CHARSET,
                    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 
    PROOF_QUALITY,DEFAULT_PITCH 
+ FF_DONTCARE, "Arial");
    CFont
* pOldFont = pDC->SelectObject(&m_Font);
    pDC
->TextOut(10,350,"第三章  多媒体文本处理");
}

3CFont::CreatePointFont

BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);

返回值:如果成功,则返回非零值,否则为0

参数:

nPointSize

所需字体高度(用0.1点表示,例如,传递120表示12点字体)。

lpszFaceName

一个CString或指向一个以空终止符结尾的字符串,定义字体名称。此字符串长度不应超过30个字符。Windows EnumFontFamilies函数可用于计算当前可用字体的总数。如果为NULL,则GDI使用与设备无关的字体。

pDC

指向CDC对象,将nPointSize中的高度转化为逻辑单位。如果为NULL,则屏幕设备上下文用于转换。


说明:
此函数提供了一种创建指定字体和点大小的字体对象的方法,它自动将nPointSize中的高度转化为逻辑单位,这是使用由pDC指向的CDC对象实现的。
当完成用CreatePointFont函数创建CFont对象后,从设备上下文中选择字体,然后删除CFont对象。

void CCFontInfoView::On311() 
{
    
// TODO: Add your command handler code here
    CDC* pDC = this->GetDC();

    CFont m_Font;
    m_Font.CreatePointFont(
320"Arial", pDC);
    CFont
* pOldFont = pDC->SelectObject(&m_Font);
    pDC
->TextOut(10,250,"第三章  多媒体文本处理");

}

4CFont::CreatePointFontIndirect

BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont, CDC* pDC = NULL);

返回值:如果成功,则返回非零值,否则为0

参数:

lpLogFont

指向LOGFONT结构,定义逻辑字体特征。LOGFONTlfHeight成员用0.1点计算而不用逻辑单位(如果设置lfHeight120,则要求12点字体)。

pDC

指向CDC对象,用于将lfHeight中的高度转化为逻辑单位。如果为NULL,屏幕设备上下文用于转换。


说明:
此函数与CreateFontIndirect相似,但LOGFONTlfHeight成员由0.1点表示而不是用设备单位表示。在传递LOGFONT结构到Windows之前,pDC指向的CDC对象自动使函数的lfHeight中的高度转化为逻辑单位。
当完成由CreatePointFontIndirect函数创建的CFont对象之后,先选择设备上下文字体,然后删去CFont对象。

void CCFontInfoView::On312() 
{
    
// TODO: Add your command handler code here
    CDC* pDC = this->GetDC();

    LOGFONT lf;
    memset(
&lf, 0sizeof(LOGFONT));  // 清空LOGFONT 结构
    lf.lfHeight = 200;    // 设置 LOGFONT 结构
    lf.lfWeight = 700;  
    strcpy(lf.lfFaceName, 
"Arial");
    CFont font;
    font.CreatePointFontIndirect(
&lf, pDC);   
    
    CFont
* pOldFont = pDC->SelectObject(&font);
    pDC
->TextOut(460,260,"第三章  多媒体文本处理");

}

四、文本控件的使用
1、静态文本控件
void CStaticTextDlg::OnButton() 
{
    
// TODO: Add your control notification handler code here
    m_strStaticText = "再见!";  // 设置要显示的内容
    UpdateData(FALSE);    // 在静态文本框中显示结果

}
2使用编辑框控件
void CStaticTextDlg::OnButton2() 
{
    
// TODO: Add your control notification handler code here
    UpdateData(TRUE);   // 接受输入的信息
    m_strDisplay = m_strReceive;     //  赋值
    UpdateData(FALSE);   // 输出得到的信息

}
posted on 2009-06-21 13:19 The_Moment 阅读(832) 评论(0)  编辑 收藏 引用 所属分类: VC理论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理