Pull to refresh

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

Reading time 2 min
Views 39K
В последнее время Хабр просто пестрит «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 к общему количеству «ненормальных».
Tags:
Hubs:
+33
Comments 12
Comments Comments 12

Articles