— Гоночка на JavaScript (30 строк кода)
— Крошечный арканоид на JavaScript (30 строк кода)
— Крошечный Excel на чистом JavaScript (30 строк кода)
— Крошечная змейка на JavaScript (30 строк кода)
— Tetris на javascript (в 30+ строк)
Одержимый желанием следовать моде, я тоже решил что-нибудь написать. Но так как с JS у меня отношения сложные, я решил писать на C++ с использованием API, которое так любезно предоставила мне ОС Windows (в народе именуемом WinAPI).
Итак, ближе к телу делу:
C++ код (31 строка):
#include <Windows.h> #include <vector> #include "resource.h" BOOL CALLBACK PaintProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ POINT t; static std::vector<POINT> pos; HDC hdc; static bool status; PAINTSTRUCT pt; switch(uMsg) { case WM_INITDIALOG: status = false; return TRUE; break; case WM_PAINT: hdc = BeginPaint(hwnd, &pt); (!pos.size()) ? NULL : MoveToEx(hdc, pos[0].x, pos[0].y, NULL); for(size_t i=0;i<pos.size();++i) (pos[i].x==-1 && i<pos.size()-1) ? MoveToEx(hdc, pos[i+1].x, pos[i+1].y, NULL) : LineTo(hdc, pos[i].x, pos[i].y); EndPaint(hwnd, &pt); break; case WM_LBUTTONDOWN: status = true; break; case WM_LBUTTONUP: status = false; t.x=-1; pos.push_back(t); break; case WM_MOUSEMOVE: GetCursorPos(&t); ScreenToClient (hwnd, &t); (status) ? pos.push_back(t) : NULL; (status) ? InvalidateRect(hwnd, NULL, true) : NULL; break; case WM_CLOSE: EndDialog(hwnd, 0); break; } return FALSE; } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInst, MAKEINTRESOURCE(IDD_PAINT), NULL, PaintProc); return 0; }
Так как меряемся пиписьками основным кодом, не учитывая «верстку», описание диалога, как ресурса, не учитываю, но желающим воспроизвести данный пример необходимо создать диалог с ID — IDD_PAINT.
Собственно, то, ради чего всё начиналось:
Особенности
— 31 строка C++ говно кода
— Использованные библиотеки: STL
Недостатки
— Мерцание экрана при непосредственном рисовании (двойная буферизация была опущена в силу экономии строк).
— В реальной задаче написания программы (аля Paint) использование контейнера vector, возможно, не самый лучший вариант, но все же.
Итог
Согласен, немного неправильно укладывать объявление переменных в одну строку. Но думаю, что на общее впечатление от кода это не повлияет.
Всем спасибо за внимание. +1 к общему количеству «ненормальных».
ссылка на оригинал статьи http://habrahabr.ru/post/202678/
Добавить комментарий