資源簡介
該程序是一個使用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? {
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破解版安裝包
評論
共有 條評論