パレットを実装する

 

C++ パレットを実装する

説明

C++を使ったパレットの作り方を紹介します。パレット内にリストボックスを追加し要素の情報を表示したり活用する方法を紹介します。

この「C++ パレットを作成する」の4チュートリアルで使用するサンプルコードは
こちらからダウンロードできます。

パレットのリソースを定義する

  • .grcでパレットを定義する
    • パレットにリストボックスを1つ追加します
  • ‘GDLG’: ダイアログの定義
  • ‘DLGH’: ダイアログアイテムのツールチップの定義

/*
'GDLG'  resID  Palette [| frameFlag | growFlag | captionFlag | closeFlag]  x  y  dx  dy  "title" 
{
      dialogItem1
          ...
      dialogItemi
          ...
      dialogItemn
}
*/


'GDLG'  32500  Palette | close      0    0  400  300  "SamplePalette" {
/* [  1] */ SingleSelList	 2   2  396  296  SmallPlain  PartialItems  21  HasHeader  21
}


'DLGH'  32500  DLG_32500_SamplePalette {
1 "Listbox tooltip string" SingleSelListBox_0
}


パレットクラスを実装する

クラスの定義

  • 必要なヘッダーをインクルード
  • DG::PaletteとDG::PaletteObserverを継承したクラスを定義
  • staticメンバーによるグローバルアクセス
  • シングルトン実装
  • DG::ListBoxObserverを継承
    • リストボックスのイベント処理に必要
  • インデックスとメンバ変数を追加
    • ダイアログアイテムにはインデックスが必要
// SamplePalette.hpp

#include "DG.h"
#include "DGModule.hpp"

class SamplePalette 
	: public DG::Palette
	, public DG::PanelObserver
	, public DG::ListBoxObserver
{

public:
	static SamplePalette& GetInstance();
	static bool HasInstance();
	static void CreateInstance();
	void ShowPalette();
	void HidePalette();

protected:
	SamplePalette();
	virtual ~SamplePalette();

private:
	static SamplePalette* instance;

	enum
	{
		listBoxID = 1,
	};

	DG::SingleSelListBox listBox;
};

クラスの実装

  • コンストラクタでAttach()
    • ObserverにAttachすることでPanelEventを取得できる
  • デコンストラクタでDetach()
    • Observerはこれ以上必要ないのでDetachしておく
  • グローバル変数やstatic変数を使用する場合には、ACAPI_KeepInMemory(true) を使用
// SamplePalette.cpp

SamplePalette* SamplePalette::instance = nullptr;


SamplePalette::SamplePalette() 
	: DG::Palette(ACAPI_GetOwnResModule(), 32500, ACAPI_GetOwnResModule())
	, listBox(GetReference(), listBoxID)
{
	Attach(*this);
	BeginEventProcessing();
	listBox.Attach(*this);
}

SamplePalette::~SamplePalette()
{
	Detach(*this);
	EndEventProcessing();
}

SamplePalette& SamplePalette::GetInstance()
{
	return *instance;
}

bool SamplePalette::HasInstance()
{
	return instance != nullptr;
}

void SamplePalette::CreateInstance()
{
	instance = new SamplePalette;
	ACAPI_KeepInMemory(true);
}

void SamplePalette::ShowPalette()
{
	DG::Palette::Show();
	DG::Palette::BringToFront();
}

void SamplePalette::HidePalette()
{
	instance->Hide();
}

パレットの呼び出し

  • メニューコマンドを選択されたときにパレットが
    • 隠れている場合は表示する
    • 表示されている場合は隠す

GSErrCode __ACENV_CALL MenuCommandHandler (const API_MenuParams *menuParams)
{
	switch (menuParams->menuItemRef.menuResID) {
	case ID_MENU_STRINGS:
		switch (menuParams->menuItemRef.itemIndex) {
		case 1:
		{
			if (!SamplePalette::HasInstance()) {
				SamplePalette::CreateInstance();
			}

			if (SamplePalette::GetInstance().IsVisible()){
				SamplePalette::GetInstance().HidePalette();
			}
			else{
				SamplePalette::GetInstance().ShowPalette();
			}
		}
			break;
		}
		break;
	}

	return NoError;
}		// MenuCommandHandler

問題がなければ次のようなパレットが表示されます。

続きをみる