mkxp-sunshine/journal/w32/niko.c
Mathew Velasquez 8c15c73f04 Linux Niko
2016-11-05 02:01:07 -04:00

130 lines
3.4 KiB
C

#include <windows.h>
static const WCHAR niko_classname[] = L"niko";
static HWND niko = NULL;
static HBITMAP niko_bmps[3] = {NULL};
static int niko_offset = 0;
// Window procedure
LRESULT CALLBACK niko_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_CLOSE:
return 0;
case WM_PAINT: {
static int frame = 0;
if (niko_offset % 32 >= 16) {
frame = 1;
} else {
if ((niko_offset / 32) % 2)
frame = 0;
else
frame = 2;
}
PAINTSTRUCT ps;
HDC hdc;
BITMAP bitmap;
HDC hdcMem;
HGDIOBJ oldBitmap;
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
oldBitmap = SelectObject(hdcMem, niko_bmps[frame]);
GetObject(niko_bmps[frame], sizeof(bitmap), &bitmap);
BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int do_niko(int x, int y)
{
// Create
HINSTANCE module = GetModuleHandleW(NULL);
niko_bmps[0] = LoadBitmapW(module, L"NIKO1");
niko_bmps[1] = LoadBitmapW(module, L"NIKO2");
niko_bmps[2] = LoadBitmapW(module, L"NIKO3");
WNDCLASSEXW wc;
wc.cbSize = sizeof(wc);
wc.style = 0;
wc.lpfnWndProc = niko_proc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = module;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = niko_classname;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&wc))
return 1;
if (!(niko = CreateWindowExW(WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
niko_classname,
L"Niko",
WS_POPUP,
x, y,
24 * 2, 32 * 2,
NULL, NULL, module, NULL))) {
return 1;
}
SetLayeredWindowAttributes(niko, RGB(0, 255, 0), 0, LWA_COLORKEY);
ShowWindow(niko, SW_SHOWNOACTIVATE);
UpdateWindow(niko);
// Thread
int screenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
// Get starting position
RECT area;
GetWindowRect(niko, &area);
// Just keep walking down
for (;;) {
// Dispatch messages
unsigned long tick = GetTickCount();
for (;;) {
MSG msg;
if (PeekMessage(&msg, niko, 0, 0, PM_REMOVE) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
if (GetTickCount() - tick >= 1000 / 60)
break;
}
}
niko_offset += 2;
if (area.top + niko_offset >= screenHeight)
break;
SetWindowPos(niko, NULL, area.left, area.top + niko_offset, 0, 0, SWP_NOSIZE);
InvalidateRect(niko, NULL, FALSE);
}
DestroyWindow(niko);
for (int i = 0; i < 3; i++) {
if (niko_bmps[i])
DeleteObject(niko_bmps[i]);
}
return 0;
}