资源简介
该程序是一个使用C++开发的简单文本编辑器,开发平台为VS2017,使用Direct2D进行渲染,内附源代码及exe。
代码片段和文件信息
#include “Editor.h“
#pragma comment(lib“winmm.lib“)
namespace {
inline bool IsHighSurrogate(UINT32 ch) throw()
{
// 0xD800 <= ch <= 0xDBFF
return (ch & 0xFC00) == 0xD800;
}
inline bool IsLowSurrogate(UINT32 ch) throw()
{
// 0xDC00 <= ch <= 0xDFFF
return (ch & 0xFC00) == 0xDC00;
}
}
Editor::Editor()
{
maxScrollY = 0.f;
scrollY = 0.f;
lastInputTime = -1.f;
lastClickTime = -1.f;
lastSelectLength = 0;
isonscroll = false;
textLayout = nullptr;
needUpdate = true;
caretAnchor = 0;
caretPosition = 0;
text = L“helloworld 北冥有鱼,其名为鲲。鲲之大,不知其几千里也。化而为鸟,其名为鹏。鹏之背,不知其几千里也。怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。“;
}
Editor::~Editor()
{
SafeRelease(&textLayout);
}
void Editor::select(SelectMode mode bool moveAnchor)
{
//以下代码使用了dwrite的api
switch (mode)
{
case SelectMode::up:
case SelectMode::down:
{
std::vector lineMetrics;
DWRITE_TEXT_METRICS textMetrics;
textLayout->GetMetrics(&textMetrics);
lineMetrics.resize(textMetrics.lineCount);
textLayout->GetLineMetrics(&lineMetrics.front() textMetrics.lineCount &textMetrics.lineCount);
UINT32 line = 0;
UINT32 linePosition = 0;
UINT32 nextLinePosition = 0;
UINT32 lineCount = static_cast(lineMetrics.size());
for (; line < lineCount; ++line)
{
linePosition = nextLinePosition;
nextLinePosition = linePosition + lineMetrics[line].length;
if (nextLinePosition > caretPosition) {
break;
}
}
if (line > lineCount - 1) {
line = lineCount - 1;
}
if (mode == SelectMode::up)
{
if (line <= 0)
break;
line--;
linePosition -= lineMetrics[line].length;
}
else
{
linePosition += lineMetrics[line].length;
line++;
if (line >= lineMetrics.size())
break;
}
DWRITE_HIT_TEST_METRICS hitTestMetrics;
float caretX caretY dummyX;
textLayout->HitTestTextPosition(
caretPosition
false
&caretX
&caretY
&hitTestMetrics
);
textLayout->HitTestTextPosition(
linePosition
false
&dummyX
&caretY
&hitTestMetrics
);
BOOL isInside isTrailingHit;
textLayout->HitTestPoint(
caretX
caretY
&isTrailingHit
&isInside
&hitTestMetrics
);
caretPosition = hitTestMetrics.textPosition;
if (isTrailingHit) {
caretPosition += hitTestMetrics.length;
}
break;
}
case SelectMode::head:
caretPosition = 0;
break;
case SelectMode::tile:
caretPosition = text.length();
break;
case SelectMode::lastChar:
if (caretPosition > 0) {
UINT32 moveCount = 1;
if (caretPosition >= 2
&& caretPosition <= text.length())
{
if (isUnicodeUnit(text[caretPosition - 1] text[caretPosition - 2]))
{
moveCount = 2;
}
}
if (caretPosition < (UINT32)moveCount)
caretPosition = 0;
else caretPosition -= moveCount;
}
break;
case SelectMode::nextChar:
if (caretPositi 属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 15399 2018-11-24 16:07 Editor.cpp
文件 1924 2018-11-24 16:06 Editor.h
文件 258 2018-11-24 15:24 main.cpp
文件 5096 2018-11-24 16:06 MyWindow.cpp
文件 1360 2018-11-24 16:06 MyWindow.h
文件 24064 2018-11-24 16:12 program.exe
- 上一篇:RTSP_Client.c
- 下一篇:C++Builder6.0破解版安装包
相关资源
- C++头文件转delphi工具 + 源码
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- qt texteditor(富文本编辑器)
- C++17 In Detail
- qt登录富文本编辑器和文档打印设计
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
川公网安备 51152502000135号
评论
共有 条评论