diff options
author | Ash Wolf <ninji@wuffs.org> | 2023-06-28 22:22:32 +0100 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2023-06-28 22:22:32 +0100 |
commit | c0c336500955a23e344651e5412c9d9d441ef4ee (patch) | |
tree | 790769c748db307cf3314f6e896e2f61c68561a2 /src/T2DLL/T2Message.cpp | |
parent | 37e364b2c6cc7487a1c888d256a73e5337bb7189 (diff) | |
download | t2win-c0c336500955a23e344651e5412c9d9d441ef4ee.tar.gz t2win-c0c336500955a23e344651e5412c9d9d441ef4ee.zip |
first pass of T2DLL
Diffstat (limited to 'src/T2DLL/T2Message.cpp')
-rw-r--r-- | src/T2DLL/T2Message.cpp | 274 |
1 files changed, 257 insertions, 17 deletions
diff --git a/src/T2DLL/T2Message.cpp b/src/T2DLL/T2Message.cpp index e089c1b..73850eb 100644 --- a/src/T2DLL/T2Message.cpp +++ b/src/T2DLL/T2Message.cpp @@ -1,49 +1,289 @@ +#include "CT2App.h" #include "T2Message.h" +static BOOL s100E3E08; + +// unknown name - 100E3E0C +static BOOL sVisible; + T2Message::T2Message() { } -void T2Message::ShowMessage(const CString&) { -} +void T2Message::ShowMessage(const CString& str) { + if (!sVisible) { + sVisible = true; + s100E3E08 = true; -/*virtual*/ T2Message::~T2Message() { -} + // "MS Pゴシック" + mFont.CreatePointFont(100, "\x82\x6C\x82\x72 \x82\x6F\x83\x53\x83\x56\x83\x62\x83\x4E"); + + void *buffer = malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2 + 8 * 8); + + BITMAPINFOHEADER *bmi = (BITMAPINFOHEADER *) buffer; + memset(bmi, 0, sizeof(BITMAPINFOHEADER)); + bmi->biSize = sizeof(BITMAPINFOHEADER); + bmi->biWidth = 8; + bmi->biHeight = 8; + bmi->biPlanes = 1; + bmi->biBitCount = 8; + bmi->biClrUsed = 2; + bmi->biClrImportant = 2; + + RGBQUAD *cols = (RGBQUAD *) (((char *) buffer) + sizeof(BITMAPINFOHEADER)); + cols[0].rgbRed = 0; + cols[0].rgbGreen = 0; + cols[0].rgbBlue = 0; + cols[1].rgbRed = 255; + cols[1].rgbGreen = 255; + cols[1].rgbBlue = 0; -/*static*/ const AFX_MSGMAP* __stdcall T2Message::_GetBaseMessageMap() { + unsigned char *pixels = ((unsigned char *) buffer) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2; + unsigned char row[8]; + row[0] = 1; + row[1] = 1; + row[2] = 1; + row[3] = 1; + row[4] = 0; + row[5] = 0; + row[6] = 0; + row[7] = 0; + + for (int y = 0; y < 8; y++) { + for (int x = 0; x < 8; x++) { + pixels[x + y * 8] = row[(x + y) % 8]; + } + } + + int result = mBrush.CreateDIBPatternBrush((const void *) buffer, DIB_RGB_COLORS); + free(buffer); +#line 64 + _ASSERT(result != 0); + + mString = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE, NULL, (HBRUSH) GetStockObject(WHITE_BRUSH)); + + RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = 100; + rect.bottom = 50; + + CreateEx(0, mString, str, WS_POPUP, rect, AfxGetMainWnd(), 0); + } else { + delete this; + } } -/*virtual*/ const AFX_MSGMAP* T2Message::GetMessageMap() const { +/*virtual*/ T2Message::~T2Message() { } +BEGIN_MESSAGE_MAP(T2Message, CWnd) + ON_WM_CREATE() + ON_WM_TIMER() + ON_WM_LBUTTONDOWN() + ON_WM_RBUTTONDOWN() + ON_WM_KEYDOWN() + ON_WM_DESTROY() + ON_WM_ERASEBKGND() + ON_MESSAGE(WM_USER + 10, OnHookMessage) +END_MESSAGE_MAP() + /*virtual*/ void T2Message::PostNcDestroy() { + sVisible = false; + delete this; + ((CT2App *) AfxGetApp())->app_vfAC(); } -int T2Message::OnCreate(CREATESTRUCTA*) { +int T2Message::OnCreate(CREATESTRUCT* cs) { + if (CWnd::OnCreate(cs) == -1) + return -1; + + CString str; + GetWindowText(str); + + CRect desktopRect; + GetDesktopWindow()->GetClientRect(desktopRect); + + CDC *dc = GetDC(); + int save = dc->SaveDC(); + + dc->SelectObject(&mFont); + + mRect2.SetRect(0, 0, (desktopRect.right * 2) / 5, desktopRect.bottom); + dc->DrawText(str, mRect2, DT_WORDBREAK | DT_CALCRECT | DT_NOPREFIX); + mRect2.InflateRect(0, 0, 20, 20); + + dc->RestoreDC(save); + ReleaseDC(dc); + + CRect clientRect; + + GetWindowRect(mRect1); + GetClientRect(clientRect); + mRect1.OffsetRect(-mRect1.left, -mRect1.top); + mRect1.right = mRect1.Width() - clientRect.Width() + mRect2.Width(); + mRect1.bottom = mRect1.Height() - clientRect.Height() + mRect2.Height(); + + CPoint cursorPos; + GetCursorPos(&cursorPos); + + if ((cursorPos.x - mRect1.right) >= 0) + mRect1.OffsetRect(cursorPos.x - mRect1.right, 0); + else + mRect1.OffsetRect(cursorPos.x, 0); + + if ((cursorPos.y - mRect1.bottom) >= 0) + mRect1.OffsetRect(0, cursorPos.y - mRect1.bottom); + else + mRect1.OffsetRect(0, cursorPos.y); + + m78 = false; + + SetTimer(1, 50, NULL); + + m74 = GetTickCount(); + + ((CT2App *) AfxGetApp())->app_vfA8(this); + + return 0; } -void T2Message::OnTimer(unsigned int) { +void T2Message::OnTimer(UINT) { + unsigned int counter; + DWORD tickCount = GetTickCount(); + + if (m74 <= tickCount) + counter = tickCount - m74; + else + counter = -1 - m74 + tickCount; + + if (counter >= 250) { + if (counter >= 1250) { + DestroyWindow(); + return; + } + + if (s100E3E08 == true) { + KillTimer(1); + SetTimer(1, 200, NULL); + s100E3E08 = false; + } + + counter = 250; + m78 = true; + } + + CRect rect; + CPoint pt = mRect1.CenterPoint(); + + if (counter <= 80) { + rect.left = pt.x - 10; + rect.right = pt.x + 10; + + rect.top = pt.y - (((pt.y - mRect1.top) * counter) / 80); + rect.bottom = pt.y + (((mRect1.bottom - pt.y) * counter) / 80); + } else { + counter -= 80; + + rect.top = mRect1.top; + rect.bottom = mRect1.bottom; + + rect.left = pt.x - (((pt.x - mRect1.left - 10) * counter) / 170) - 10; + rect.right = pt.x + (((mRect1.right - pt.x - 10) * counter) / 170) + 10; + } + + SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER); + ShowWindow(SW_SHOWNA); } -long T2Message::OnHookMessage(unsigned int, long) { +LONG T2Message::OnHookMessage(UINT, LONG arg) { + MSG *pMsg = (MSG *) arg; + + if (pMsg->hwnd != m_hWnd) { + if (pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_RBUTTONDOWN || pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) + DestroyWindow(); + } + + return 0; } -void T2Message::OnLButtonDown(unsigned int, CPoint) { +void T2Message::OnLButtonDown(UINT, CPoint) { + DestroyWindow(); } -void T2Message::OnRButtonDown(unsigned int, CPoint) { +void T2Message::OnRButtonDown(UINT, CPoint) { + DestroyWindow(); } -void T2Message::OnKeyDown(unsigned int, unsigned int, unsigned int) { +void T2Message::OnKeyDown(UINT, UINT, UINT) { + DestroyWindow(); } void T2Message::OnDestroy() { + CWnd::OnDestroy(); + KillTimer(1); } -int T2Message::OnEraseBkgnd(CDC*) { -} +int T2Message::OnEraseBkgnd(CDC* dc) { + CRect rect1; + GetClientRect(rect1); -/*static*/ const AFX_MSGMAP T2Message::messageMap { -} + int save = dc->SaveDC(); + + CBrush brush; + brush.CreateStockObject(NULL_BRUSH); + + CPen pen; + pen.CreateStockObject(BLACK_PEN); + + dc->SelectObject(brush); + dc->SelectObject(pen); + dc->Rectangle(rect1); + + rect1.top++; + rect1.left++; + rect1.bottom--; + rect1.right--; + + CRect rect2; + + rect2 = rect1; + rect2.right = rect2.left + 5; + dc->FillRect(rect2, &mBrush); + + rect2 = rect1; + rect2.bottom = rect2.top + 5; + dc->FillRect(rect2, &mBrush); + + rect2 = rect1; + rect2.left = rect2.right - 5; + dc->FillRect(rect2, &mBrush); + + rect2 = rect1; + rect2.top = rect2.bottom - 5; + dc->FillRect(rect2, &mBrush); + + CBrush brush2; + brush2.CreateStockObject(WHITE_BRUSH); + + rect2.top = rect1.top + 5; + rect2.left = rect1.left + 5; + rect2.bottom = rect1.bottom - 5; + rect2.right = rect1.right - 5; + dc->FillRect(rect2, &brush2); + + if (m78) { + dc->SetTextColor(RGB(128, 0, 0)); + dc->SetBkMode(TRANSPARENT); + dc->SelectObject(mFont); + + CString str; + GetWindowText(str); + + CRect textRect = mRect2; + textRect.InflateRect(-10, -10, -10, -10); + dc->DrawText(str, textRect, DT_WORDBREAK | DT_NOPREFIX); + } -/*static*/ const AFX_MSGMAP_ENTRY* const T2Message::_messageEntries { + dc->RestoreDC(save); + return 1; } |