ドッキングパレットを実装する

 

ドッキングパレットを実装する

説明

ドッキングパレットを実装する方法はとても簡単です。パレットにGUIDを指定するだけです。

パレットにGrowステータスを指定する

  • growを指定するとパレットの幅・高さを変更できるようになります
    • ドッキングの際に自動的にパレットのサイズが変更されるため
    • .grcを変更したときには必ずコンパイルかリビルドを行ってください。
'GDLG'  32500  Palette | grow | close      0    0  200  300  "SamplePalette" {
/* [  1] */ SingleSelList	 2   2  396  296  SmallPlain  PartialItems  21  HasHeader  21
}

パレットのGUIDを生成する

  • GUIDの生成方法はwebで「GUID生成」と調べるとたくさん検索にヒットします
// SamplePalette.hpp
const GS::Guid SamplePaletteGuid{ "C67E8137-A2AC-42FD-BDE6-413F509731B8" };
const Int32    SamplePaletteGuidRefId = (Int32)GS::GenerateHashValue(SamplePaletteGuid);
  • コンストラクタの引数にGUIDを渡す
SamplePalette::SamplePalette() 
	: DG::Palette(ACAPI_GetOwnResModule(), 32500, ACAPI_GetOwnResModule(), SamplePaletteGuid)

プロジェクトにパレットを登録する

  • プロジェクトにパレットを登録すると、プロジェクトの様々なイベント(たとえば作業環境の適用による表示の切り替えなど)を取得し対応することができます。
  • また登録時にパレットが利用可能なビューを指定することも可能です。
 
GSErrCode __ACENV_CALL	PaletteAPIControlCallBack(Int32 referenceID, API_PaletteMessageID messageID, GS::IntPtr param)
{
	if (referenceID != SamplePaletteGuidRefId)
		return NoError;

	switch (messageID) {
	case APIPalMsg_OpenPalette:
		if (!SamplePalette::GetInstance().IsPaletteVisible()) {
			SamplePalette::GetInstance().ShowPalette();
		}
		break;

	case APIPalMsg_ClosePalette:
		SamplePalette::GetInstance().ClosePalette();
		break;

	case APIPalMsg_HidePalette_Begin:
	case APIPalMsg_HidePalette_End:
	case APIPalMsg_DisableItems_Begin:
	case APIPalMsg_DisableItems_End:
	case APIPalMsg_IsPaletteVisible:
	default:
		break;
	}

	return NoError;
}



GSErrCode	__ACENV_CALL Initialize	(void)
{
    GSErrCode err = NoError;

	ACAPI_RegisterModelessWindow(SamplePaletteGuidRefId, PaletteAPIControlCallBack, API_PalEnabled_FloorPlan +
		API_PalEnabled_Section + API_PalEnabled_Elevation + API_PalEnabled_InteriorElevation +
		API_PalEnabled_3D + API_PalEnabled_Detail + API_PalEnabled_Worksheet + API_PalEnabled_Layout +
		API_PalEnabled_DocumentFrom3D, GSGuid2APIGuid(SamplePaletteGuid));

	return err;
}		// Initialize


GSErrCode __ACENV_CALL	FreeData (void)
{
	GSErrCode err = NoError;
	ACAPI_UnregisterModelessWindow(SamplePaletteGuidRefId);
	return err;
}		// FreeData


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

public:
	bool IsPaletteVisible();
};


bool SamplePalette::IsPaletteVisible()
{
	return instance != nullptr && instance->IsVisible();
}