• 大小: 21KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: C/C++
  • 标签: C++  Direct2D  VS2017  

资源简介

该程序是一个使用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

评论

共有 条评论