加入插入符
CWnd::CreateSolidCaret
void CreateSolideCaret(int nWidth,int nHeight);
需调用ShowCaret()成员函数
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
此程序在CWnd::OnCreate函数中使用(OnCreate函数,框架调用该成员函数,当应用程序请求Create或CreateEx成员函数来创建窗口)
---------------------------------------------------------------------------------------------------------------------------------------------------
图形插入符,即使用图形作为插入符
int CtextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
bitmap.LoadBitmap(IDB_BITMAP1); //CBitmap bitmap定义到头文件中为全局类对象
CreateCaret(&bitmap);
ShowCaret();
return 0;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
CView类中有OnDraw(CDC *pDC)函数,在窗口发生重绘,被应用程序框架类调用,文字和图形在窗口中始终看到,在此函数中处理
输出文字 CString类 无基类
pDC->TextOut(50,50,str) pDC有一个文字输出函数TextOut(nWidth,nHeight,字符对象)
void CtextView::OnDraw(CDC* pDC/*pDC*/)
{
CtextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
//CString str("UESTC"); 或者直接这样写,因为CString重载了“=”运算符
CString str;
str = "UESTC";
pDC->TextOut(50, 50, str); //使用pDC成员函数进行字符串输出
str.LoadString(IDS_UESTC); //使用CString类成员函数加载字符表ID
pDC->TextOutW(0, 200, str);
}
CString类中还有LoadString(ID)函数
在资源视图中添加字符ID
然后定义CString str对象
调用str.LoadString(ID)
pDC->TextOut(0,200,str)输出
---------------------------------------------------------------------------------------------------------------------------------------------------------------
路径层
设置路径层使其与其他有不同效果
CDC::BeginPath (BOOL型返回,打开路径层要用EndPath关闭)
CDC::GetTextExtent(传递一个字符串进来) 返回CSize(此为一个结构体,里面存储的是对象.cx和对象.cy)对象
用这个函数获取字符串在屏幕上的宽度和高度
void CtextView::OnDraw(CDC* pDC/*pDC*/)
{
CtextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString str;
str = "UESTC";
pDC->TextOut(50, 50, str);
CSize sz = pDC->GetTextExtent(str); //定义CSize对象来获取类对象存储的字符串的宽度和高度
str.LoadString(IDS_UESTC);
pDC->TextOutW(0, 200, str);
pDC->BeginPath();
pDC->Rectangle(50, 50, 50 + sz.cx, 50 + sz.cy); //在字符串所在位置画一个矩形
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF); //此成员函数用于剪辑区域路径层
}
-------------------------------------------------------------------------------------------------------------------------------------------------
字符输入 增加WM_CHAR消息 ,再增加一个成员变量m_strLine并初始化为空
SetCaretPos(point)插入符跟随鼠标移动
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
TEXTMETRIC tm; //定义一个TEXTMETRIC类变量
dc.GetTextMetrics(&tm); //获取当前文字的指标
if (0x0d == nChar)
{ //回车处理
m_strLine.Empty(); //设置时为空
m_ptOrigin.y += tm.tmHeight;
}
else if (0x08 == nChar)
{ //退格处理
COLORREF clr = dc.SetTextColor(dc.GetBkColor()); //使用背景色来进行退格处理,获取背景颜色
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine); //输出字符串
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1); //删除左边字符
dc.SetTextColor(clr);
}
else
{
m_strLine = m_strLine + nChar; //直接输出,每次从原点输出
}
CSize sz = dc.GetTextExtent(m_strLine); //获取输入的字符长度和宽度
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx; //每次输出从原点输出,一次性输出
pt.y = m_ptOrigin.y; //高度不变
SetCaretPos(pt); //插入符跟随鼠标移动
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine); //输出
CView::OnChar(nChar, nRepCnt, nFlags);
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
void CtextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCaretPos(point); //插入符跟随鼠标移动
m_strLine.Empty(); //使成员变量存储的值为空
m_ptOrigin = point; //每次输出从原点输出,每次开始默认在原点位置
CView::OnLButtonDown(nFlags, point);
}