Рисовалка под Windows на C++, или «Ребята, я тоже ненормальный!» (30+ строк кода)

—

от автора

В последнее время Хабр просто пестрит «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.

Собственно, то, ради чего всё начиналось:

image

Особенности

— 31 строка C++ говно кода
— Использованные библиотеки: STL

Недостатки

— Мерцание экрана при непосредственном рисовании (двойная буферизация была опущена в силу экономии строк).
— В реальной задаче написания программы (аля Paint) использование контейнера vector, возможно, не самый лучший вариант, но все же.

Итог

Согласен, немного неправильно укладывать объявление переменных в одну строку. Но думаю, что на общее впечатление от кода это не повлияет.
Всем спасибо за внимание. +1 к общему количеству «ненормальных».

ссылка на оригинал статьи http://habrahabr.ru/post/202678/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *