资源简介
该程序是一个使用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++Builder6.0破解版安装包
- 图灵机用作转换器计算x的y次幂,含
- C++实现的高斯投影正算和反算
- C++用类读取和处理TXT文件数据
- C++实现7.4汉明码编码
- C++实现DNS劫持
- 页面置换算法OPT、FIFO、LRU实现--C++版
- 面向对象程序设计风格的五子棋程序
- C++期末复习 程序填空题 1
- c++ 计算器 能实现带括号的小数计算
- C++课程设计——停车场管理
- linux C与C++混合编程通用makefile
- C++教程完整
- matlab的smooth()函数c++实现
- C++入门经典(第9版) ([美]Walter Sa
- 扫雷小游戏,c++版本
- 利用指针数组冒泡法排序
- dijkstra算法C++实现
- C++test v6.0.0.5破解版3
- 操作系统 C++ 页面置换算法含实验报告
- TelBook.cpp通讯录课程设计
- 声卡数据采集播放演示源程序vc.zip
- 向量类的设计与实现 VC++6.0
- KLT算法c++实现
- RSA加解密源码VC++实现
- mfc实现画图板源码+实验报告
- libstdc++-libc6.2-2.so.3.tar.gz
- C++ OOP实现贪吃蛇,EASYX图形界面
- c++ primer 第五版 中文版 源代码
- c++函数模板和类模板计实验报告
评论
共有 条评论