๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Resources, Brush, Pen

by eazuooz 2022. 9. 20.

์˜ˆ์ œ :)

https://github.com/eazuooz/WindowAPI/commit/a00f3fe492d614384f7550671b84e0e137e2698b

 

Resources Pen Brush · eazuooz/WindowAPI@a00f3fe

Show file tree Showing 15 changed files with 232 additions and 27 deletions.

github.com

WinAPI์—์„œ Pen๊ณผ Brush๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•ญ์ƒ ์›๋ž˜ hdc์— ์„ธํŒ…๋˜์—ˆ๋˜ Old๊ฐ์ฒด๋กœ ๋‹ค์‹œ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ Pen Brush ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์†Œ๋ฉธ์ž์—์„œ ์ž๋™์œผ๋กœ

์ด์ „ ๊ฐ์ฒด๋กœ ์ „ํ™˜ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ถ”๊ฐ€ ํ•ด์ฃผ์—ˆ๋‹ค.

	struct Pen
	{
	private:
		HDC		mHdc;
		HPEN	mOldPen;

	public:
		Pen(HDC hdc, HPEN pen)
			: mHdc(hdc)
			, mOldPen(NULL)
		{
			mOldPen = (HPEN)SelectObject(mHdc, pen);
		}

		~Pen()
		{
			SelectObject(mHdc, mOldPen);
		}
	};

	struct Brush
	{
	private:
		HDC		mHdc;
		HBRUSH	mOldBrush;

	public:
		Brush(HDC hdc, HBRUSH brush)
			: mHdc(hdc)
			, mOldBrush(NULL)
		{
			mOldBrush = (HBRUSH)SelectObject(mHdc, brush);
		}

		~Brush()
		{
			SelectObject(mHdc, mOldBrush);
		}
	};

 

์‚ฌ์šฉ ํ•  ๋•Œ ์•ž์œผ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. 

	void Missile::Render(HDC _dc)
	{
		Vector2 vPos = GetPos();
		Vector2 vScale = GetScale();

		Brush b(_dc, Application::GetInstance().GetBrush(BRUSH_COLOR::GRAY));
		Pen p(_dc, Application::GetInstance().GetPen(PEN_COLOR::RED));

		Ellipse(_dc
			, (int)vPos.x - vScale.x / 2.f
			, (int)vPos.y - vScale.y / 2.f
			, (int)vPos.x + vScale.x / 2.f
			, (int)vPos.y + vScale.y / 2.f);
	}

 

๋˜ํ•œ ๋ฐฐ๊ฒฝ์ด ํฐ์ƒ‰์œผ๋กœ ๋„ˆ๋ฌด ๋ฐ์•„์„œ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋“ค์ด ์ž˜ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. 

๊ทธ๋ž˜์„œ Pen, Brush ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ๋‹ค.

	void Application::Tick()
	{
		// ์—…๋ฐ์ดํŠธ
		Time::GetInstance().Tick();
		InputManager::GetInstance().Tick();
		SceneManager::GetInstance().Tick();

		
		// Clear
		HBRUSH hPrevBrush = (HBRUSH)SelectObject(mWindowData.backBuffer, mBrushes[(UINT)BRUSH_COLOR::GRAY]);
		Rectangle(mWindowData.backBuffer, -1, -1, mWindowData.width + 1, mWindowData.height + 1);
		SelectObject(mWindowData.backBuffer, hPrevBrush);

		// ๋ Œ๋”๋ง
		SceneManager::GetInstance().Render(mWindowData.backBuffer);
		Time::GetInstance().Render(mWindowData.backBuffer);

		// BitBlt ํ•จ์ˆ˜๋Š” DC ๊ฐ„์— ๊ทธ๋ฆผ์„ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 
		BitBlt(mWindowData.hdc, 0, 0, mWindowData.width, mWindowData.height
			, mWindowData.backBuffer, 0, 0, SRCCOPY);
	}

 

๊ฒŒ์ž„ ์—”์ง„์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

์—์…‹์ด๋ž€

๊ฒŒ์ž„ ์ œ์ž‘ ๋ฐ ๋ ˆ๋ฒจ ๋””์ž์ธ์—์„œ์˜ ์—์…‹[ํŽธ์ง‘] ์œ„์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ฐ์ข… ์ฐธ๊ณ  ์ž๋ฃŒ๋‚˜ ์–ด๋А์ •๋„ ํ”„๋กœํ† ํƒ€์ž… ์ด์ƒ ์™„์„ฑ๋œ ์ž‘์—…๋ฌผ[1] ๋“ฑ์„ ์นญํ•˜๋‚˜ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ (๊ธฐ์ˆ ์ด๋‚˜ ์ž ์žฌ๋ ฅ์„ ๊ฐ€์ง„) ์ธ์žฌ ๋“ฑ์„ ์นญํ•˜๊ธฐ๋„ ํ•œ๋‹ค. [1] ์ผ๋ถ€์—์„  ๋ฆฌ์†Œ์Šค(์ž์›)๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€,  ๊ณต๊ฒฉ ์‚ฌ์šด๋“œ ๋“ฑ๋“ฑ์ด ์—์…‹์ด ๋œ๋‹ค ์ด๋Ÿฌํ•œ ์—์…‹๋“ค์„ ๋ฆฌ์†Œ์Šค๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋Š”๋ฐ

์ด๋Ÿฐ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋กœ๋“œํ• ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

๋˜ํ•œ ๋ฆฌ์†Œ์Šค๋“ค์€ ํ•œ๋ฒˆ ๋กœ๋“œํ•˜๋ฉด ์žฌ๋กœ๋“œ ํ• ํ•„์š” ์—†์ด ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ผ๋ฉด ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค Resources๋Š” std::map์„ ์ด์šฉํ•ด์„œ ๊ด€๋ฆฌํ•  ๊ฒƒ ์ด๋‹ค.

	class Resource;
	class Resources
	{
		SINGLE(Resources)
	public:
		bool Initialize();

	private:
		std::map<std::wstring, Resource*> mResources;
	};

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Component  (0) 2022.09.26
Path, Resource Load  (1) 2022.09.22
Double Buffering  (0) 2022.09.19
Input  (0) 2022.09.15
Scene, Object, Time  (0) 2022.09.15

๋Œ“๊ธ€