画像ビューアのサンプル

メニューまたはショートカットキーから画像ファイルを開いて表示するサンプルコードです。
画像が大きい場合はスクロールバーが表示されます。

#include <Windows.h>
#include <balor/graphics/all.hpp>
#include <balor/gui/all.hpp>

using namespace balor::graphics;
using namespace balor::gui;


int APIENTRY WinMain(HINSTANCE , HINSTANCE , LPSTR , int ) {
	Frame frame(L"ImageViewer");
	Bitmap bitmap;

	typedef Menu::ItemInfo Item;
	Item fileMenuItems[] = {
		Item(L"開く(&O)\tCtrl+O", Key::Modifier::ctrl | Key::o),
		Item(),
		Item(L"終了(&X)\tAlt+F4", Key::Modifier::alt | Key::f4)
	};
	Item menuBarItems[] = {
		Item(L"ファイル(&F)", fileMenuItems),
		Item(L"ヘルプ(&H)", [&] (Menu::Click& ) {
			MsgBox::show(L"Image Viewer Ver 1.0", L"バージョン情報");
		})
	};
	MenuBar menuBar(menuBarItems);
	frame.menuBar(&menuBar);

	frame.onShortcutKey() = [&] (Frame::ShortcutKey& e) {
		switch (e.shortcut()) {
			case Key::Modifier::ctrl | Key::o : {
				OpenFileDialog dialog;
				dialog.filter(L"画像ファイル\n*.bmp;*.gif;*.png;*.jpg;*.jpeg;*.tiff\n\n");
				if (dialog.show(frame)) {
					bitmap = Bitmap(dialog.filePath());
					if (bitmap != nullptr) {
						// ウインドウサイズが画像サイズ以下ならスクロールできるようにする。
						frame.scrollMinSize(bitmap.size());
						frame.invalidate();
					}
				}
				e.handled(true);
			} break;
			case Key::Modifier::alt | Key::f4 : {
				frame.close();
				e.handled(true);
			} break;
		}
	};
	frame.onPaint() = [&] (Frame::Paint& e) {
		e.graphics().clear();
		if (bitmap != nullptr) {
			Graphics bitmapGraphics(bitmap);
			// スクロール分ずらして画像をコピーする。
			e.graphics().copy(frame.scrollPosition(), bitmapGraphics);
		}
	};

	frame.runMessageLoop();
	return 0;
}