Windows2003-3790/windows/advcore/gdiplus/test/texttest/text.cpp
2020-09-30 16:53:55 +02:00

150 lines
3.0 KiB
C++

//// TEXTREP - Text representation
//
// For this demonstration, text representation is rather simple
#include "precomp.hxx"
#include "global.h"
#include <tchar.h>
//// InitText - Initialise text buffer
//
//
void InitText(INT id) {
HMODULE hmod;
HRSRC hrsrc;
HGLOBAL hglob;
WCHAR *pwcIt; // Initial text
int i;
g_iTextLen = 0;
hmod = GetModuleHandle(NULL);
hrsrc = FindResource(hmod, MAKEINTRESOURCE(id), _TEXT("INITIALTEXT"));
hglob = LoadResource(hmod, hrsrc);
g_iTextLen = SizeofResource(hmod, hrsrc) - 2; // Remove leading byte order mark
pwcIt = (WCHAR*) LockResource(hglob);
if (!hmod || !hrsrc || !hglob || !pwcIt || !g_iTextLen) {
ASSERTS(hmod, "GetModuleHandle(usptest.exe) failed");
ASSERTS(hrsrc, "FindResource(110, INITIALTEXT) failed");
ASSERTS(hglob, "LoadResource(110, INITIALTEXT) failed");
ASSERTS(pwcIt, "LockResource(110, INITIALTEXT) failed");
ASSERTS(g_iTextLen, "INITIALTEXT length zero");
g_iTextLen = 0;
}
if (g_iTextLen >= sizeof(g_wcBuf)) {
g_iTextLen = sizeof(g_wcBuf);
}
memcpy(g_wcBuf, pwcIt+1, g_iTextLen);
g_iTextLen >>= 1; // Bytes to characters
// Drop any zero padding
i = 0;
while ( (i < g_iTextLen)
&& g_wcBuf[i]) {
i++;
}
g_iTextLen = i;
// Construct initial formatting style run covering the entire text
StyleExtendRange(0, g_iTextLen);
ASSERT(StyleCheckRange());
}
//// textDelete - Delete text from buffer
//
BOOL TextDelete(int iPos, int iLen) {
if ( iPos < 0
|| iLen < 0
|| iPos +iLen > g_iTextLen) {
return FALSE;
}
if (iPos + iLen >= g_iTextLen) {
g_iTextLen = iPos;
StyleDeleteRange(iPos, iLen);
ASSERT(StyleCheckRange());
return TRUE;
}
if (iLen == 0) {
return TRUE;
}
memcpy(g_wcBuf + iPos, g_wcBuf + iPos + iLen, sizeof(WCHAR) * (g_iTextLen - (iPos + iLen)));
g_iTextLen -= iLen;
StyleDeleteRange(iPos, iLen);
ASSERT(StyleCheckRange());
return TRUE;
}
//// textInsert - Insert new characters in the buffer at the given insertion point
//
BOOL TextInsert(int iPos, PWCH pwc, int iLen) {
if ( iPos < 0
|| iLen < 0
|| iPos + iLen >= MAX_TEXT
|| iPos > g_iTextLen) {
return FALSE;
}
// Shift text above iPos up the buffer
if (iPos < g_iTextLen) {
memmove(g_wcBuf+iPos+iLen, g_wcBuf+iPos, sizeof(WCHAR)*(g_iTextLen-iPos));
}
// Copy new text into buffer
memcpy(g_wcBuf+iPos, pwc, sizeof(WCHAR)*iLen);
g_iTextLen += iLen;
// Give the new characters the same style as the original character they follow
StyleExtendRange(iPos, iLen);
ASSERT(StyleCheckRange());
return TRUE;
}