- PVSM.RU - https://www.pvsm.ru -

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

В последнее время Хабр просто пестрит «30-строчными постами»:

Гоночка на JavaScript (30 строк кода) [1]
Крошечный арканоид на JavaScript (30 строк кода) [2]
Крошечный Excel на чистом JavaScript (30 строк кода) [3]
Крошечная змейка на JavaScript (30 строк кода) [4]
Tetris на javascript (в 30+ строк) [5]

Одержимый желанием следовать моде, я тоже решил что-нибудь написать. Но так как с 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 к общему количеству «ненормальных».

Автор: Beltoev

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/windows/48683

Ссылки в тексте:

[1] Гоночка на JavaScript (30 строк кода): http://habrahabr.ru/post/202556/

[2] Крошечный арканоид на JavaScript (30 строк кода) : http://habrahabr.ru/post/202530/

[3] Крошечный Excel на чистом JavaScript (30 строк кода) : http://habrahabr.ru/post/202304/

[4] Крошечная змейка на JavaScript (30 строк кода) : http://habrahabr.ru/post/202476/

[5] Tetris на javascript (в 30+ строк) : http://habrahabr.ru/post/202628/

[6] Источник: http://habrahabr.ru/post/202678/