C++ パレットを実装する
説明
C++を使ったパレットの作り方を紹介します。パレット内にリストボックスを追加し要素の情報を表示したり活用する方法を紹介します。
この「C++ パレットを作成する」の4チュートリアルで使用するサンプルコードは
こちらからダウンロードできます。
パレットのリソースを定義する
- .grcでパレットを定義する
- ‘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を継承
- インデックスとメンバ変数を追加
#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* 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;
}
問題がなければ次のようなパレットが表示されます。
続きをみる
C++ パレットを実装する
説明
C++を使ったパレットの作り方を紹介します。パレット内にリストボックスを追加し要素の情報を表示したり活用する方法を紹介します。
この「C++ パレットを作成する」の4チュートリアルで使用するサンプルコードは
こちらからダウンロードできます。
パレットのリソースを定義する
パレットクラスを実装する
クラスの定義
クラスの実装
パレットの呼び出し
問題がなければ次のようなパレットが表示されます。
続きをみる