APIPaletteControlCallBackProc
Modeless Palette에 대한 특수 메시지 처리를 위한 사용자 제공 콜백 함수입니다.
typedef GSErrCode APIPaletteControlCallBackProc (
Int32 referenceID,
API_PaletteMessageID messageID,
GS::IntPtr param
);
파라미터
- referenceID
- [in] Modeless Palette를 식별하는 유일 ID입니다.
- messageID
- [in] Palette 컨트롤 콜백 프로시저에서 처리되는 이벤트입니다.
- param

- [out] 리턴 파라미터입니다.
APIPalMsg_IsPaletteVisible에서 사용합니다.
리턴 값
NoError- 함수가 성공적으로 완료되었습니다.
다른 공통 API 오류들에 대해서는 API 오류 문서를 보십시오.
설명
당신은 ACAPI_RegisterModelessWindow로 이 함수를 등록할 수 있습니다. 이제부터는 당신의 팔레트의 행동을 다른 팔레트들에게 맞춰서 조정하는 것은 당신의 책임입니다.
다음 타입의 이벤트들이 당신의 커스텀 창에 나타날 것입니다:
메시지 타입 설명 APIPalMsg_ClosePaletteAPI가 애드온에게 팔레트를 닫으라고 요청합니다. APIPalMsg_HidePalette_Begin팔레트가 어떤 이유로 숨겨져야 합니다. 예. 사용자가 메뉴에서 Hide All Palettes를 선택함. APIPalMsg_HidePalette_End필요한 경우 팔레트는 다시 나타나게 됩니다. APIPalMsg_DisableItems_Begin사용자가 입력을 수행하는 중이므로 특정 팔레트 항목들이 비활성화되어야 합니다. 입력하는 동안 데이터베이스를 수정하지 말아야 하므로 이것은 필수입니다. APIPalMsg_DisableItems_EndAPIPalMsg_DisableItems_Begin이 끝났으므로 팔레트에서 항목들을 활성화합니다.APIPalMsg_OpenPaletteWork Environment에서 설정한 대로 팔레트를 자동으로 열어야 할 때 보냅니다. 생성될 때 팔레트는 GUID를 전달해야 합니다: 이 작업을 하려면 DG::Palette (resourceId, paletteGuid)APIPalMsg_IsPaletteVisibleWork Environment는 현재 문서를 닫거나 애플리케이션을 종료할 때 팔레트에게 가시성 상태를 쿼리합니다. 만약 param에서true(실제로는bool*)를 리턴하면, ArchiCAD는 다음 실행시 그 애드온에게APIPalMsg_OpenPalette를 보냅니다. 그러면 당신은 애드온의 팔레트를 다시 열 수 있습니다.
예제
const GS::Guid paletteGuid ("{A20B280D-928B-4258-9A4A-8617B57124F8}");
void MainPaletteDestroyed (void);
// --- MainPalette -----------------------------------------------------------
class MainPalette: public DG::Palette,
public GS::DisposableObject
{
friend class MainObserver;
public:
MainPalette (short resId);
~MainPalette ();
};
// --- MainObserver ---------------------------------------------------------
class MainObserver: private DG::PanelObserver,
public DG::CompoundItemObserver,
public GS::DisposableObject,
public GS::DisposeHandler
{
private:
MainPalette* paletteQL;
public:
MainObserver (MainPalette* mainPalette);
~MainObserver ();
virtual void PanelOpened (const DG::PanelOpenEvent& ev);
virtual void PanelClosed (const DG::PanelCloseEvent& ev);
virtual void PanelCloseRequested (const DG::PanelCloseRequestEvent& ev, bool* accept);
virtual void DisposeRequested (GS::DisposableObject& source);
};
// --- MainPalette --------------------------------------------------------------
MainPalette::MainPalette (short resId):
DG::Palette (resId, paletteGuid)
{
SetDefaultGarbageCollector ();
}
MainPalette::~MainPalette ()
{
}
// --- MainObserver ---------------------------------------------------------
MainObserver::MainObserver (MainPalette* mainPalette):
paletteQL (mainPalette)
{
paletteQL->Attach (*this);
AttachToAllItems (*paletteQL);
paletteQL->BeginEventProcessing ();
SetDefaultGarbageCollector ();
paletteQL->SetDisposeHandler (*this);
}
MainObserver::~MainObserver ()
{
}
void MainObserver::PanelOpened (const DG::PanelOpenEvent& /*ev*/)
{
}
void MainObserver::PanelClosed (const DG::PanelCloseEvent& /*ev*/)
{
}
void MainObserver::PanelCloseRequested (const DG::PanelCloseRequestEvent& /*ev*/, bool* /*accept*/)
{
paletteQL->EndEventProcessing ();
paletteQL->MarkAsDisposable ();
}
// -----------------------------------------------------------------------------
// 팔레트 파괴를 처리함
// -----------------------------------------------------------------------------
void MainObserver::DisposeRequested (GS::DisposableObject& source)
{
if (&source == paletteQL) {
paletteQL = NULL;
MainPaletteDestroyed ();
MarkAsDisposable (); // 가비지 컬렉터가 나중에 지울 수 있게 표시함
}
}
MainPalette* mainPalette = NULL;
MainObserver* mainObserver = NULL;
void MainPaletteDestroyed (void);
{
mainPalette = NULL;
}
// -----------------------------------------------------------------------------
// 특수 팔레트 메시지들
// -----------------------------------------------------------------------------
static GSErrCode __ACENV_CALL PaletteAPIControlCallBack (Int32 referenceID, API_PaletteMessageID messageID, GS::IntPtr param)
{
if (referenceID == paletteRefId) {
switch (messageID) {
case APIPalMsg_OpenPalette:
if (mainPalette != NULL) {
mainPalette->Show ();
} else {
UseOwnResClass resClass;
mainPalette = new MainPalette (32400);
mainObserver = new MainObserver (mainPalette);
mainPalette->Show ();
}
break;
case APIPalMsg_ClosePalette:
if (mainPalette != NULL) {
mainPalette->Hide ();
mainPalette->SendCloseRequest ();
}
break;
case APIPalMsg_HidePalette_Begin:
if (mainPalette != NULL) {
mainPalette->Hide ();
SetMenuItemTextState (false);
}
break;
case APIPalMsg_HidePalette_End:
if (mainPalette != NULL) {
mainPalette->Show ();
}
break;
case APIPalMsg_DisableItems_Begin:
if (mainPalette != NULL) {
mainPalette->DisableItems ();
}
break;
case APIPalMsg_DisableItems_End:
if (mainPalette != NULL) {
mainPalette->EnableItems ();
}
break;
case APIPalMsg_IsPaletteVisible:
* reinterpret_cast (param) = (mainObserver != NULL);
break;
default:
break;
}
}
return NoError;
}
// -----------------------------------------------------------------------------
// ArchiCAD로부터 알림들을 처리함
// -----------------------------------------------------------------------------
GSErrCode __ACENV_CALL APIEventHandler (API_NotifyEventID notifID, Int32 /*param*/)
{
switch (notifID) {
case APINotify_NewAndReset:
case APINotify_Quit:
if (mainPalette != NULL) {
mainPalette->Hide ();
mainPalette->SendCloseRequest ();
}
break;
}
return NoError;
}
//------------------------------------------------------
// 의존성 정의
//------------------------------------------------------
API_AddonType __ACENV_CALL CheckEnvironment (API_EnvirParams* /*envir*/)
{
return APIAddon_Preload;
} // RegisterAddOn
//------------------------------------------------------
// Add-On 초기화
//------------------------------------------------------
GSErrCode __ACENV_CALL Initialize (void)
{
GSErrCode err = ACAPI_RegisterModelessWindow (paletteRefId, 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 (paletteGuid));
if (err == NoError)
err = ACAPI_Notify_CatchProjectEvent (APINotify_NewAndReset | APINotify_Quit, APIEventHandler);
return err;
}
//------------------------------------------------------
// 최종 호출...
//------------------------------------------------------
GSErrCode __ACENV_CALL FreeData (void)
{
ACAPI_Notify_CatchProjectEvent (APINotify_NewAndReset | APINotify_Quit, NULL);
if (mainPalette != NULL) {
mainPalette->Hide ();
mainPalette->SendCloseRequest ();
}
ACAPI_UnregisterModelessWindow (paletteRefId);
return NoError;
}
요구사항
- 버전: API 4.1 또는 이후
- 헤더: APIdefs_Callback.h