В последнее время Хабр просто пестрит «30-строчными постами»:
— Гоночка на 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 к общему количеству «ненормальных».
Автор: Beltoev