mirror of
https://github.com/quantum5/Zalgo.git
synced 2025-04-24 13:41:57 -04:00
Added X-SAMPA table.
Also: 1. Cleaned up text handling by storing them in resource. 2. Added useful methods to make code look better. 3. Allowed PreviewWindow to be used for general text displaying.
This commit is contained in:
parent
0c8afacd4a
commit
8596131f44
4
Makefile
4
Makefile
|
@ -52,8 +52,8 @@ $(SRCDIR)\Window.cpp: $(INCDIR)\Window.hpp
|
|||
$(SRCDIR)\NLSWrap.cpp: $(INCDIR)\NLSWrap.hpp
|
||||
$(SRCDIR)\MainLogic.cpp: $(INCDIR)\MainWindow.hpp $(INCDIR)\NLSWrap.hpp $(INCDIR)\ConversionData.inc
|
||||
|
||||
$(OUTDIR)\Zalgo.res: Zalgo.rc
|
||||
$(RC) $(RCFLAGS) /fo$@ $**
|
||||
$(OUTDIR)\Zalgo.res: Zalgo.rc res\x-sampa.txt res\init.txt
|
||||
$(RC) $(RCFLAGS) /fo$@ Zalgo.rc
|
||||
|
||||
{$(SRCDIR)}.cpp{$(OUTDIR)}.obj::
|
||||
$(CXX) $(CXXFLAGS) /Fo$(OUTDIR)\ /Fd$(OUTDIR)\ $<
|
||||
|
|
3
Zalgo.rc
3
Zalgo.rc
|
@ -1,3 +1,6 @@
|
|||
#include <resource.h>
|
||||
|
||||
RID_ICON ICON Zalgo.ico
|
||||
RID_XSAMPA ZALGO_TEXT "res\\x-sampa.txt"
|
||||
RID_INIT ZALGO_TEXT "res\\init.txt"
|
||||
RID_LOOSE ZALGO_TEXT "res\\loose.txt"
|
||||
|
|
|
@ -27,10 +27,11 @@
|
|||
#define ZALGO_CYRILLIC 0xA555
|
||||
#define ZALGO_GREEK 0xA556
|
||||
#define ZALGO_XSAMPA 0xA557
|
||||
#define ZALGO_XSAMPA_TABLE 0xA558
|
||||
|
||||
class MainWindow : public Window {
|
||||
public:
|
||||
virtual LPCTSTR ClassName() { return TEXT("Zalgo_Main"); }
|
||||
virtual LPCTSTR ClassName() { return L"Zalgo_Main"; }
|
||||
static MainWindow *Create(LPCTSTR szTitle);
|
||||
protected:
|
||||
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
@ -55,11 +56,11 @@ protected:
|
|||
HWND m_messLevel, m_messUpDown;
|
||||
HWND m_mess, m_unmess, m_previewShow;
|
||||
HWND m_nfc, m_nfd;
|
||||
HWND m_latin, m_cyrillic, m_greek, m_xsampa;
|
||||
HWND m_latin, m_cyrillic, m_greek, m_xsampa, m_xsampa_table;
|
||||
MyDropTarget m_dropTarget;
|
||||
PreviewWindow *m_preview;
|
||||
PreviewWindow *m_preview, *m_data_display;
|
||||
private:
|
||||
HFONT hFont, hFontMono;
|
||||
HFONT hFont;
|
||||
HBRUSH hBrush;
|
||||
UDACCEL *udaSecondAccel;
|
||||
};
|
||||
|
|
|
@ -12,9 +12,13 @@
|
|||
|
||||
class PreviewWindow : public Window {
|
||||
public:
|
||||
virtual LPCTSTR ClassName() { return TEXT("Zalgo_Preview"); }
|
||||
virtual LPCTSTR ClassName() { return L"Zalgo_Preview"; }
|
||||
static PreviewWindow *Create(LPCTSTR szTitle);
|
||||
void Destroy() { DestroyWindow(m_hwnd); }
|
||||
|
||||
void ChangeText(LPWSTR text, bool padding = true);
|
||||
void SetFont(HFONT hFont);
|
||||
void SetFont(const LOGFONT &lf);
|
||||
protected:
|
||||
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
LRESULT OnCreate();
|
||||
|
@ -24,6 +28,7 @@ protected:
|
|||
virtual HICON GetIcon();
|
||||
private:
|
||||
HFONT hFont;
|
||||
bool used_logfont;
|
||||
HBRUSH hBrush;
|
||||
int xChar, yChar, xUpper, xClient, yClient, xClientMax, xPos, yPos;
|
||||
LPTSTR *lpLines;
|
||||
|
|
|
@ -32,8 +32,10 @@ inline void MakeRectBottomRight(RECT &rect, int x, int y, int cx, int cy)
|
|||
|
||||
class Window {
|
||||
public:
|
||||
HWND GetHWND() { return m_hwnd; }
|
||||
HWND GetHWND() const { return m_hwnd; }
|
||||
bool ShowWindow(int nCmdShow) { return ::ShowWindow(m_hwnd, nCmdShow) != 0; }
|
||||
static HINSTANCE GetInstance() { return (HINSTANCE) GetModuleHandle(NULL); }
|
||||
operator HWND() const { return m_hwnd; }
|
||||
protected:
|
||||
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
virtual void PaintContent(PAINTSTRUCT *pps) {}
|
||||
|
@ -52,8 +54,7 @@ private:
|
|||
void OnPaint();
|
||||
void OnPrintClient(HDC hdc);
|
||||
|
||||
static LRESULT CALLBACK
|
||||
s_WndProc(HWND hwnd, UINT uMsg,
|
||||
static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg,
|
||||
WPARAM wParam, LPARAM lParam);
|
||||
protected:
|
||||
HWND m_hwnd;
|
||||
|
|
|
@ -1 +1,10 @@
|
|||
#define RID_ICON 1
|
||||
#define RID_XSAMPA 2
|
||||
#define RID_INIT 3
|
||||
#define RID_LOOSE 4
|
||||
|
||||
inline void GetMessageFont(LOGFONT &lf) {
|
||||
NONCLIENTMETRICS ncmMetrics = { sizeof(NONCLIENTMETRICS) };
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncmMetrics, 0);
|
||||
memcpy(&lf, &ncmMetrics.lfMessageFont, sizeof lf);
|
||||
}
|
||||
|
|
BIN
res/init.txt
Normal file
BIN
res/init.txt
Normal file
Binary file not shown.
BIN
res/loose.txt
Normal file
BIN
res/loose.txt
Normal file
Binary file not shown.
BIN
res/x-sampa.txt
Normal file
BIN
res/x-sampa.txt
Normal file
Binary file not shown.
|
@ -14,24 +14,6 @@
|
|||
#define BOTTOM(x, y, cx, cy) x, (y - cy), cx, cy
|
||||
#define BOTTOMRIGHT(x, y, cx, cy) (x - cx), (y - cy), cx, cy
|
||||
|
||||
#define ZALGO_INITIAL (L"To invoke the hive-mind representing chaos.\r\n"\
|
||||
L"Invoking the feeling of chaos.\r\n"\
|
||||
L"With out order.\r\n"\
|
||||
L"The Nezperdian hive-mind of chaos. Zalgo.\r\n"\
|
||||
L"He who Waits Behind The Wall.\r\n"\
|
||||
L"ZALGO!\r\n\r\n"\
|
||||
L"WARNING: Resulting text size is roughly original "\
|
||||
L"* (1 + fuck up level). Thou hast been warned.\r\n"\
|
||||
L"\r\n"\
|
||||
L"NOTE: If this program crashes on thee, blame "\
|
||||
L"thyself for fucking up a piece of text that is too "\
|
||||
L"big with a very high fuck up level.\r\n\r\n"\
|
||||
L"Do blame Windows for not able to show proper text "\
|
||||
L"in the edit control, for now, use the preview "\
|
||||
L"button.\r\n\r\n"\
|
||||
L"Bonus Geek Info: NFD text will lose all "\
|
||||
L"diacritics. Thou hast been warned.\r\n")
|
||||
|
||||
UINT ZALGO_MESS_LEVEL_[3] = {6, 10, 14};
|
||||
#define ZALGO_MESS_LEVEL_OF(type) (ZALGO_MESS_LEVEL_[type-0xDEAD])
|
||||
|
||||
|
@ -47,6 +29,23 @@ UINT ZALGO_MESS_LEVEL_[3] = {6, 10, 14};
|
|||
WNDPROC wpOrigEditProc;
|
||||
DWORD rgbWindowBackground;
|
||||
|
||||
wchar_t *GetResourceString(int id, HMODULE module = NULL) {
|
||||
HRSRC hRC;
|
||||
DWORD size;
|
||||
HGLOBAL hRes;
|
||||
wchar_t *data;
|
||||
|
||||
hRC = FindResource(module, MAKEINTRESOURCE(id), L"ZALGO_TEXT");
|
||||
if (!hRC)
|
||||
return NULL;
|
||||
size = SizeofResource(module, hRC);
|
||||
hRes = LoadResource(module, hRC);
|
||||
data = new wchar_t[size / sizeof(wchar_t) + 1];
|
||||
memcpy(data, LockResource(hRes), size);
|
||||
data[size / sizeof(wchar_t)] = 0;
|
||||
return data;
|
||||
}
|
||||
|
||||
LRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (uMsg == WM_KEYDOWN) {
|
||||
|
@ -67,24 +66,26 @@ BOOL MainWindow::WinRegisterClass(WNDCLASS *pwc)
|
|||
|
||||
LRESULT MainWindow::OnCreate()
|
||||
{
|
||||
NONCLIENTMETRICS ncmMetrics = { sizeof(NONCLIENTMETRICS) };
|
||||
LOGFONT lf;
|
||||
RECT client;
|
||||
LPWSTR initial = NULL;
|
||||
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncmMetrics, 0);
|
||||
GetClientRect(m_hwnd, &client);
|
||||
|
||||
hFont = CreateFontIndirect(&ncmMetrics.lfMessageFont);
|
||||
GetMessageFont(lf);
|
||||
hFont = CreateFontIndirect(&lf);
|
||||
hBrush = GetSysColorBrush(COLOR_WINDOW);
|
||||
rgbWindowBackground = GetSysColor(COLOR_WINDOW);
|
||||
hFontMono = CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET,
|
||||
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
||||
CLEARTYPE_QUALITY, FF_MODERN, TEXT("Consolas"));
|
||||
|
||||
initial = GetResourceString(RID_INIT);
|
||||
if (!initial)
|
||||
MessageBox(m_hwnd, L"Zalgo initial not found", L"Zalgo Error", MB_ICONERROR);
|
||||
// Children
|
||||
m_message = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT,
|
||||
ZALGO_INITIAL, WS_CHILDWINDOW | WS_VISIBLE | ES_LEFT |
|
||||
initial, WS_CHILDWINDOW | WS_VISIBLE | ES_LEFT |
|
||||
ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL,
|
||||
0, 0, 0, 0, m_hwnd, (HMENU) ZALGO_MESSAGE, GetInstance(), NULL);
|
||||
if (initial)
|
||||
delete [] initial;
|
||||
|
||||
m_goUp = CreateWindow(WC_BUTTON, L"fuck up going &up",
|
||||
WS_CHILDWINDOW | WS_VISIBLE | BS_CHECKBOX, 0, 0, 0, 0,
|
||||
|
@ -146,6 +147,9 @@ LRESULT MainWindow::OnCreate()
|
|||
m_xsampa = CreateWindow(WC_BUTTON, L"&X-SAMPA to IPA",
|
||||
WS_CHILDWINDOW | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0,
|
||||
m_hwnd, (HMENU) ZALGO_XSAMPA, GetInstance(), NULL);
|
||||
m_xsampa_table = CreateWindow(WC_BUTTON, L"X-&SAMPA Table",
|
||||
WS_CHILDWINDOW | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0,
|
||||
m_hwnd, (HMENU) ZALGO_XSAMPA_TABLE, GetInstance(), NULL);
|
||||
|
||||
PostMessage(m_messUpDown, UDM_SETRANGE32, 1, ZALGO_MESS_LEVEL_OF(ZALGO_MAX_MESS));
|
||||
PostMessage(m_messUpDown, UDM_SETPOS32, 0, ZALGO_MESS_LEVEL_OF(ZALGO_NORMAL_MESS));
|
||||
|
@ -168,6 +172,7 @@ LRESULT MainWindow::OnCreate()
|
|||
SETFONT(m_cyrillic);
|
||||
SETFONT(m_greek);
|
||||
SETFONT(m_xsampa);
|
||||
SETFONT(m_xsampa_table);
|
||||
#undef SETFONT
|
||||
|
||||
Button_SetCheck(m_goUp, 1);
|
||||
|
@ -177,10 +182,14 @@ LRESULT MainWindow::OnCreate()
|
|||
Edit_Enable(m_messLevel, 0);
|
||||
|
||||
if (!m_dropTarget.DragDropRegister(m_hwnd))
|
||||
MessageBox(m_hwnd, TEXT("Failed to register Drag and Drop handler"),
|
||||
TEXT("Zalgo has COME!!!"), MB_ICONERROR);
|
||||
MessageBox(m_hwnd, L"Failed to register Drag and Drop handler",
|
||||
L"Zalgo has COME!!!", MB_ICONERROR);
|
||||
|
||||
m_preview = PreviewWindow::Create(L"Text Preview");
|
||||
m_data_display = PreviewWindow::Create(L"X-SAMPA Table");
|
||||
lf.lfHeight = (LONG) (lf.lfHeight * 1.3);
|
||||
lf.lfWidth = (LONG) (lf.lfWidth * 1.3);
|
||||
m_data_display->SetFont(lf);
|
||||
|
||||
// Subclassing
|
||||
wpOrigEditProc = (WNDPROC) SetWindowLongPtr(m_message,
|
||||
|
@ -212,7 +221,9 @@ LRESULT MainWindow::OnDestroy()
|
|||
DestroyWindow(m_cyrillic);
|
||||
DestroyWindow(m_greek);
|
||||
DestroyWindow(m_xsampa);
|
||||
DestroyWindow(m_xsampa_table);
|
||||
delete m_preview;
|
||||
delete m_data_display;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -262,11 +273,12 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
REPOS(m_unmess, BOTTOMRIGHT(client.right - 12, client.bottom - 12, 100, 25));
|
||||
REPOS(m_nfc, BOTTOMRIGHT(client.right - 117, client.bottom - 41, 50, 25));
|
||||
REPOS(m_nfd, BOTTOMRIGHT(client.right - 117, client.bottom - 12, 50, 25));
|
||||
REPOS(m_previewShow,BOTTOMRIGHT(client.right - 172, client.bottom - 12, 100, 25));
|
||||
REPOS(m_previewShow, BOTTOMRIGHT(client.right - 172, client.bottom - 12, 100, 25));
|
||||
REPOS(m_latin, BOTTOM(12, client.bottom - 84, 100, 25));
|
||||
REPOS(m_cyrillic, BOTTOM(117, client.bottom - 84, 100, 25));
|
||||
REPOS(m_greek, BOTTOM(222, client.bottom - 84, 100, 25));
|
||||
REPOS(m_xsampa, BOTTOM(327, client.bottom - 84, 100, 25));
|
||||
REPOS(m_xsampa_table, BOTTOM(432, client.bottom - 84, 100, 25));
|
||||
EndDeferWindowPos(hdwp);
|
||||
#undef REPOS
|
||||
return 0;
|
||||
|
@ -288,8 +300,9 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
text = new wchar_t[textlen];
|
||||
Edit_GetText(m_message, text, textlen);
|
||||
|
||||
SendMessage(m_preview->GetHWND(), WM_CHANGETEXT, 0, (LPARAM) text);
|
||||
ShowWindow(m_preview->GetHWND(), SW_SHOW);
|
||||
m_preview->ChangeText(text);
|
||||
m_preview->ShowWindow(SW_SHOW);
|
||||
break;
|
||||
}
|
||||
case TEXT_TO_NFC:
|
||||
OnTextNFC();
|
||||
|
@ -314,6 +327,21 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
case ZALGO_GO_DOWN:
|
||||
Button_SetCheck((HWND) lParam, !IsDlgButtonChecked(m_hwnd, LOWORD(wParam)));
|
||||
break;
|
||||
case ZALGO_XSAMPA_TABLE: {
|
||||
wchar_t *text;
|
||||
|
||||
SetWindowText(m_data_display->GetHWND(), L"X-SAMPA Table");
|
||||
text = GetResourceString(RID_XSAMPA);
|
||||
if (!text) {
|
||||
MessageBox(m_hwnd, L"X-SAMPA table not found", L"X-SAMPA Error", MB_ICONERROR);
|
||||
break;
|
||||
}
|
||||
m_data_display->ChangeText(text, false);
|
||||
m_data_display->ShowWindow(SW_SHOW);
|
||||
SetForegroundWindow(*m_data_display);
|
||||
delete [] text;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Button_SetCheck(GetDlgItem(m_hwnd, ZALGO_MINI_MESS), 0);
|
||||
Button_SetCheck(GetDlgItem(m_hwnd, ZALGO_NORMAL_MESS), 0);
|
||||
|
@ -348,19 +376,16 @@ LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
if (wParam == 'K' && GetKeyState(VK_CONTROL) < 0 &&
|
||||
GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_MENU) < 0) {
|
||||
static bool unlocked = false;
|
||||
// A user has tried to go beyond max, let is work
|
||||
if (!unlocked && MessageBox(m_hwnd, L"\
|
||||
Thou hast tried to loosen my limits, dost thou promise that:\r\n\
|
||||
1. thou will be responsible to use the string generated\r\n\
|
||||
2. thou will be careful to not enter a number too large that will crash me\r\n\
|
||||
3. if thou dost crash me, blame thyself for entering a number too large\r\n\
|
||||
\r\n\
|
||||
Dost thou agree?", L"About to Unlock Secret", MB_YESNO | MB_ICONQUESTION) == IDYES) {
|
||||
LPWSTR text = GetResourceString(RID_LOOSE);
|
||||
// A user has tried to go beyond max, let it work
|
||||
if (!unlocked && MessageBox(m_hwnd, text,L"About to Unlock Secret",
|
||||
MB_YESNO | MB_ICONQUESTION) == IDYES) {
|
||||
PostMessage(m_messUpDown, UDM_SETRANGE32, 1, LONG_MAX);
|
||||
PostMessage(m_messLevel, EM_SETREADONLY, 0, 0);
|
||||
|
||||
unlocked = true;
|
||||
}
|
||||
delete [] text;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -5,28 +5,13 @@
|
|||
|
||||
LRESULT PreviewWindow::OnCreate()
|
||||
{
|
||||
NONCLIENTMETRICS ncmMetrics = { sizeof(NONCLIENTMETRICS) };
|
||||
LOGFONT lf;
|
||||
RECT client;
|
||||
|
||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncmMetrics, 0);
|
||||
GetClientRect(m_hwnd, &client);
|
||||
|
||||
hFont = CreateFontIndirect(&ncmMetrics.lfMessageFont);
|
||||
|
||||
// Get the handle to the client area's device context.
|
||||
HDC hdc = GetDC(m_hwnd);
|
||||
TEXTMETRIC tm;
|
||||
// Extract font dimensions from the text metrics.
|
||||
GetTextMetrics(hdc, &tm);
|
||||
xChar = tm.tmAveCharWidth;
|
||||
xUpper =(tm.tmPitchAndFamily & 1 ? 3 : 2) * xChar/2;
|
||||
yChar = tm.tmHeight + tm.tmExternalLeading;
|
||||
// Free the device context.
|
||||
ReleaseDC(m_hwnd, hdc);
|
||||
// Set an arbitrary maximum width for client area.
|
||||
//(xClientMax is the sum of the widths of 48 average
|
||||
// lowercase letters and 12 uppercase letters.)
|
||||
xClientMax = 48 * xChar + 12 * xUpper;
|
||||
GetMessageFont(lf);
|
||||
hFont = CreateFontIndirect(&lf);
|
||||
SendMessage(m_hwnd, WM_SETFONT, (WPARAM) hFont, FALSE);
|
||||
|
||||
lpLines = NULL;
|
||||
return 0;
|
||||
|
@ -60,7 +45,7 @@ void PreviewWindow::OnPaint()
|
|||
yPos = si.nPos;
|
||||
|
||||
SelectObject(ps.hdc, hFont);
|
||||
SetBkColor(ps.hdc, RGB(0xF0, 0xF0, 0xF0));
|
||||
SetBkMode(ps.hdc, TRANSPARENT);
|
||||
// Find painting limits.
|
||||
int FirstLine = max(0, yPos + ps.rcPaint.top / yChar);
|
||||
int LastLine = min(lines - 1, yPos + ps.rcPaint.bottom / yChar);
|
||||
|
@ -69,16 +54,101 @@ void PreviewWindow::OnPaint()
|
|||
GetScrollInfo(m_hwnd, SB_HORZ, &si);
|
||||
xPos = si.nPos;
|
||||
for (int i = FirstLine; i <= LastLine; i++) {
|
||||
int x = xChar *(1 - xPos);
|
||||
int y = yChar *(i - yPos);
|
||||
int x = xChar * (1 - xPos);
|
||||
int y = yChar * (i - yPos);
|
||||
rect.top = y;
|
||||
rect.left = x;
|
||||
DrawText(ps.hdc, lpLines[i], -1, &rect, DT_NOCLIP);
|
||||
DrawText(ps.hdc, lpLines[i], -1, &rect, DT_EXPANDTABS | DT_NOCLIP | DT_NOPREFIX);
|
||||
}
|
||||
done:
|
||||
EndPaint(m_hwnd, &ps);
|
||||
}
|
||||
|
||||
void PreviewWindow::ChangeText(LPWSTR text, bool padding)
|
||||
{
|
||||
if (lpLines) {
|
||||
for (int i = 0; i < lines; ++i)
|
||||
delete [] lpLines[i];
|
||||
delete [] lpLines;
|
||||
}
|
||||
|
||||
int l = 0, longest = 0, maxlen = 0;
|
||||
LPWSTR str = text;
|
||||
|
||||
if (*str == L'\0') {
|
||||
empty = true;
|
||||
lpLines = NULL;
|
||||
} else empty = false;
|
||||
|
||||
while (*str++)
|
||||
if (*str == L'\n')
|
||||
++l;
|
||||
|
||||
if (*(str-1) != L'\n')
|
||||
++l;
|
||||
|
||||
lines = l;
|
||||
if (padding)
|
||||
lines += 8;
|
||||
lpLines = new LPTSTR[lines];
|
||||
if (padding) {
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
lpLines[i] = new TCHAR[1];
|
||||
lpLines[i][0] = L'\0';
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < l; ++i) {
|
||||
LPTSTR start = text, end, buf;
|
||||
int len;
|
||||
while (*text++ != L'\n' && *(text-1) != L'\0');
|
||||
end = text - 1;
|
||||
len = end - start;
|
||||
if (len > maxlen) {
|
||||
longest = i + (padding ? 4 : 0);
|
||||
maxlen = len;
|
||||
}
|
||||
buf = new TCHAR[len + 1];
|
||||
memcpy(buf, start, len*sizeof(TCHAR));
|
||||
buf[len] = L'\0';
|
||||
lpLines[i + (padding ? 4 : 0)] = buf;
|
||||
}
|
||||
if (padding) {
|
||||
for (int i = l + 4; i < lines; ++i) {
|
||||
lpLines[i] = new TCHAR[1];
|
||||
lpLines[i][0] = L'\0';
|
||||
}
|
||||
}
|
||||
|
||||
int upper = 0, lower = 0;
|
||||
for (LPTSTR i = lpLines[longest]; *i; ++i) {
|
||||
if (isupper(*i))
|
||||
++upper;
|
||||
else if (!(*i >= 0x0300 && *i < 0x0370 || *i == 0x489))
|
||||
++lower;
|
||||
}
|
||||
xClientMax = lower * xChar + upper * xUpper;
|
||||
|
||||
PostMessage(m_hwnd, WM_SIZE, 0, 0);
|
||||
}
|
||||
|
||||
void PreviewWindow::SetFont(HFONT hFont)
|
||||
{
|
||||
if (used_logfont)
|
||||
DeleteFont(this->hFont);
|
||||
used_logfont = false;
|
||||
SendMessage(m_hwnd, WM_SETFONT, (WPARAM) hFont, TRUE);
|
||||
}
|
||||
|
||||
void PreviewWindow::SetFont(const LOGFONT &lf)
|
||||
{
|
||||
if (used_logfont)
|
||||
DeleteFont(this->hFont);
|
||||
used_logfont = true;
|
||||
hFont = CreateFontIndirect(&lf);
|
||||
SendMessage(m_hwnd, WM_SETFONT, (WPARAM) hFont, TRUE);
|
||||
}
|
||||
|
||||
LRESULT PreviewWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(uMsg) {
|
||||
|
@ -230,69 +300,31 @@ LRESULT PreviewWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
case WM_CHANGETEXT: {
|
||||
if (lpLines) {
|
||||
for (int i = 0; i < lines; ++i)
|
||||
delete [] lpLines[i];
|
||||
delete [] lpLines;
|
||||
}
|
||||
|
||||
LPTSTR str = (LPTSTR) lParam;
|
||||
int l = 0, longest = 0, maxlen = 0;
|
||||
|
||||
if (*str == L'\0') {
|
||||
empty = true;
|
||||
lpLines = NULL;
|
||||
} else empty = false;
|
||||
|
||||
while (*str++)
|
||||
if (*str == L'\n')
|
||||
++l;
|
||||
|
||||
if (*(str-1) != L'\n')
|
||||
++l;
|
||||
|
||||
lines = l + 8;
|
||||
lpLines = new LPTSTR[lines];
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
lpLines[i] = new TCHAR[1];
|
||||
lpLines[i][0] = L'\0';
|
||||
}
|
||||
str = (LPTSTR) lParam;
|
||||
for (int i = 0; i < l; ++i) {
|
||||
LPTSTR start = str, end, buf;
|
||||
int len;
|
||||
while (*str++ != L'\n' && *(str-1) != L'\0');
|
||||
end = str - 1;
|
||||
len = end - start;
|
||||
if (len > maxlen) {
|
||||
longest = i+4;
|
||||
maxlen = len;
|
||||
}
|
||||
buf = new TCHAR[len + 1];
|
||||
memcpy(buf, start, len*sizeof(TCHAR));
|
||||
buf[len] = L'\0';
|
||||
lpLines[i+4] = buf;
|
||||
}
|
||||
for (int i = l + 4; i < lines; ++i) {
|
||||
lpLines[i] = new TCHAR[1];
|
||||
lpLines[i][0] = L'\0';
|
||||
}
|
||||
|
||||
int upper = 0, lower = 0;
|
||||
for (LPTSTR i = lpLines[longest]; *i; ++i) {
|
||||
if (isupper(*i))
|
||||
++upper;
|
||||
else if (!(*i >= 0x0300 && *i < 0x0370 || *i == 0x489))
|
||||
++lower;
|
||||
}
|
||||
xClientMax = lower * xChar + upper * xUpper;
|
||||
|
||||
PostMessage(m_hwnd, WM_SIZE, 0, 0);
|
||||
case WM_CHANGETEXT:
|
||||
ChangeText((LPTSTR) lParam, (wParam & 1) == 0);
|
||||
return 0;
|
||||
case WM_SETFONT: {
|
||||
HDC hdc = GetDC(m_hwnd);
|
||||
hFont = (HFONT) wParam;
|
||||
HFONT hOldFont = SelectFont(hdc, hFont);
|
||||
|
||||
TEXTMETRIC tm;
|
||||
// Extract font dimensions from the text metrics.
|
||||
GetTextMetrics(hdc, &tm);
|
||||
xChar = tm.tmAveCharWidth;
|
||||
xUpper =(tm.tmPitchAndFamily & 1 ? 3 : 2) * xChar/2;
|
||||
yChar = tm.tmHeight + tm.tmExternalLeading;
|
||||
// Set an arbitrary maximum width for client area.
|
||||
//(xClientMax is the sum of the widths of 48 average
|
||||
// lowercase letters and 12 uppercase letters.)
|
||||
xClientMax = 48 * xChar + 12 * xUpper;
|
||||
|
||||
SelectFont(hdc, hOldFont);
|
||||
ReleaseDC(m_hwnd, hdc);
|
||||
break;
|
||||
}
|
||||
case WM_CLOSE:
|
||||
ShowWindow(m_hwnd, SW_HIDE);
|
||||
ShowWindow(SW_HIDE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
|
|||
|
||||
MainWindow *win = MainWindow::Create(L"U̬̩͔̐̿ṅ̨̤̬̽i̛̘̳̹ͤ̍c̠̳̬͛o̘̳͗̿̈́d̗̅̓͗͠ḛ͍͛ ̬̠̹̉ͭ͛D̨̤̰̀̂ͦì̛͇͂a͍͇͛ͨͤc̡̟͖͗̔ͤͅr͔͇ͮ̓̍͢i̴͇͇̇͋̽t̛̟̟͋i̲̘̿̊c̺͎ͬ͗-̴̤́̔P̋̍҉͎̹ö̲̯͈̋͞l͎͂l̻̖ͩ̂͜u̵͔̳̇̋t̳̪͐̎e͈̓͢ḓ̗̭̓ ̹̫͛Ṭͫe̙̝̦̊̊̑͢x̶͉ͦ̚t̞̔̈́̀ ̡̪̪̙͒͗G̘̜̋e͍̯̻͋ͬͦn̹̩̫̑̈́ẽ͔̳r̠͙͒̀̅ͅa̭ͫ̓́t̘̺̋̏̚o̰̙̦ͪṛͦͣ́ͅ");
|
||||
if (win) {
|
||||
ShowWindow(win->GetHWND(), nCmdShow);
|
||||
win->ShowWindow(nCmdShow);
|
||||
MSG msg;
|
||||
while (GetMessage(&msg, NULL, 0, 0) > 0) {
|
||||
TranslateMessage(&msg);
|
||||
|
|
Loading…
Reference in a new issue