\t\t孙鑫 第五课 文本编程笔记

来源:互联网 发布:汽车油漆调色软件下载 编辑:程序博客网 时间:2024/06/01 10:45

1  定时器

CWnd::SetTimer

UINT SetTimer(UINTnIDEvent,UINTnElapse,void (CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));

参数(1 该定时器ID号,自己定义。 2 超时时间,每个多少ms触发一次。 3 回调函数,定时时间到后调用该函数去做相应的动作, 如果为NULL,则在该类的WM_TIMER消息里写处理代码, 该消息函数如下

void CMy34View::OnTimer(UINT nIDEvent)

参数 UINT nIDEvent 为定时器ID号,根据自己在SetTimer里写的ID号来判断处理。


2 MFC的OnDraw函数 ,界面重绘时会被框架类调用测函数来重绘窗口,所以如果有文字显示的地方要在此重绘,否则改变窗口大小从而重绘时会导致文字丢失。

3  CDC::DrawText 

virtual int DrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);

int DrawText( const CString& str, LPRECT lpRect, UINT nFormat );

视频里用的第二个,以一个矩形为窗口输出字符串,视频里的例子是歌词颜色改变的demo , 结合定时器完成的。

CFont font;

font.CreatePointFont(100 /* 大小*/,   "楷体"   /*字体*/,  NULL);

CClientDC dc(this);

CFont *oldFont = dc.SelectObject(&font); //选择该字体

CRect rect(10, 20,  100, 200); //设定该矩形

dc.DrawText(str, rect, DT_LEFT); //左对齐  输出str  在rect范围内 

dc.SelectObject(oldFont);  //该字体用完把老字体重新还回设备


4 CFont  字体类

eg. 

CFont font;

font.CreatePointFont(100 /* 大小*/,   "楷体"   /*字体*/,  NULL);

CClientDC dc(this);

CFont *oldFont = dc.SelectObject(&font); //选择该字体

dc.TextOut(x, y, str);    //在(x, y)坐标处输出该str 

dc.SelectObject(oldFont);  //该字体用完把老字体重新还回设备


5 关于这节课自己跟着写的代码(部分  My34View类的cpp部分)

CMy34View::CMy34View()

{

// TODO: add construction code here

m_strInput = "";

m_pt.x = 0;

m_pt.y = 0;

m_nWidth = 0;

 

}

 

CMy34View::~CMy34View()

{

}

 

BOOL CMy34View::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

//  the CREATESTRUCT cs

 

return CView::PreCreateWindow(cs);

}

 

/////////////////////////////////////////////////////////////////////////////

// CMy34View drawing

 

void CMy34View::OnDraw(CDC* pDC)

{

CMy34Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

 

 

CString str;

//str = "Ocean University of China";

str = "中华人民共和国";

COLORREF oldColor = pDC->SetTextColor(RGB(0, 255, 0));

CFont font;

font.CreatePointFont(200, "幼圆", NULL);

CFont *oldFont = pDC->SelectObject(&font);

pDC->TextOut(0, 200, str);

 

str.LoadString(IDS_SDIBT); //SDIBT

pDC->TextOut(50, 50, str);

CSize size;

size = pDC->GetTextExtent(str);

pDC->SelectObject(oldFont);

 

// pDC->BeginPath();

// pDC->Rectangle(50, 50, 50 + size.cx, 50 + size.cy);

// pDC->EndPath();

// 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);

// }

 

}

 

/////////////////////////////////////////////////////////////////////////////

// CMy34View printing 

BOOL CMy34View::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}


/////////////////////////////////////////////////////////////////////////////

// CMy34View message handlers

 

int CMy34View::OnCreate(LPCREATESTRUCT lpCreateStruct) 

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: Add your specialized creation code here

//1

//CreateSolidCaret(10, 20);//创建插入符

//ShowCaret(); //显示插入符

 

//2

// CClientDC dc(this);

// TEXTMETRIC tm;  //字体结构体

// dc.GetTextMetrics(&tm);

// CreateSolidCaret(tm.tmAveCharWidth / 4, tm.tmHeight);

// ShowCaret();

//3

CClientDC dc(this);

bitmap.LoadBitmap(IDB_BITMAP1);

CreateCaret(&bitmap);

ShowCaret();

 

SetTimer(1, 100, NULL);//设置定时器   ID == 1, timeout == 100ms, 无回调函数,在View类的WM_TIMER消息中处理

return 0;

}

 

void CMy34View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 

{

CClientDC dc(this);

CFont font;

font.CreatePointFont(100, "幼圆", NULL);

CFont *oldFont = dc.SelectObject(&font);

 

 

//Enter key

if (0x0d == nChar)

{

m_strInput.Empty();

TEXTMETRIC tm;

dc.GetTextMetrics(&tm);

POINT point; 

point.x = m_pt.x; 

m_pt.y += tm.tmHeight;

point.y = m_pt.y;

SetCaretPos(point);

 

}

//backspace key

else if(0x08 == nChar)

{

 

COLORREF oldBackColor = dc.SetTextColor(dc.GetBkColor());  //取得背景色并且设置当前文字为背景色 保存改变之前的颜色

dc.TextOut(m_pt.x, m_pt.y, m_strInput);                    //设置当前字符串颜色为背景色

m_strInput = m_strInput.Left(m_strInput.GetLength() - 1);  //截取字符创长度-1 的左边部分

dc.SetTextColor(oldBackColor);   //重新设置字体颜色为之前的颜色

dc.TextOut(m_pt.x, m_pt.y, m_strInput);   //输入

 

CSize size;

size = dc.GetTextExtent(m_strInput);   //获得当前字符串在屏幕上的长度

POINT point;

point.x = m_pt.x + size.cx;   //左删除 光标的X轴变 Y轴不变

point.y = m_pt.y;

SetCaretPos(point);

 

}

else

{

m_strInput += nChar;   //把字符串组合 重新输出

CSize size;

size = dc.GetTextExtent(m_strInput); 

dc.TextOut(m_pt.x, m_pt.y, m_strInput);

 

POINT point; 

point.x = m_pt.x  + size.cx;

point.y = m_pt.y;

SetCaretPos(point); 

}

 

dc.SelectObject(oldFont); 

CView::OnChar(nChar, nRepCnt, nFlags);

}

 

void CMy34View::OnLButtonDown(UINT nFlags, CPoint point) 

{

// TODO: Add your message handler code here and/or call default

m_strInput.Empty();

SetCaretPos(point);

m_pt = point;

CView::OnLButtonDown(nFlags, point);

}

 

void CMy34View::OnTimer(UINT nIDEvent) 

{

// TODO: Add your message handler code here and/or call default

switch (nIDEvent)

{

case 1:

m_nWidth += 5;

CString str("中华人民共和国");

CClientDC dc(this);

TEXTMETRIC tm;

dc.GetTextMetrics(&tm);

CRect rect;

rect.left = 0;

rect.top = 200;

rect.right = rect.left + m_nWidth;

rect.bottom = rect.top + tm.tmHeight;

dc.SetTextColor(RGB(255, 0, 255));

CFont font;

font.CreatePointFont(200, "幼圆", NULL);

CFont *oldFont = dc.SelectObject(&font);

dc.DrawText(str, rect, DT_LEFT);

CSize size;

size = dc.GetTextExtent(str);

if (m_nWidth > size.cx)

{

dc.SetTextColor(RGB(0, 0, 255));

m_nWidth = 0;

dc.TextOut(0, 200, str);

}

dc.SelectObject(oldFont);

 

}

CView::OnTimer(nIDEvent);

}






原创粉丝点击