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_ClosePalette
API가 애드온에게 팔레트를 닫으라고 요청합니다. APIPalMsg_HidePalette_Begin
팔레트가 어떤 이유로 숨겨져야 합니다. 예. 사용자가 메뉴에서 Hide All Palettes를 선택함. APIPalMsg_HidePalette_End
필요한 경우 팔레트는 다시 나타나게 됩니다. APIPalMsg_DisableItems_Begin
사용자가 입력을 수행하는 중이므로 특정 팔레트 항목들이 비활성화되어야 합니다. 입력하는 동안 데이터베이스를 수정하지 말아야 하므로 이것은 필수입니다. APIPalMsg_DisableItems_End
APIPalMsg_DisableItems_Begin
이 끝났으므로 팔레트에서 항목들을 활성화합니다.APIPalMsg_OpenPalette
Work Environment에서 설정한 대로 팔레트를 자동으로 열어야 할 때 보냅니다. 생성될 때 팔레트는 GUID를 전달해야 합니다: 이 작업을 하려면 DG::Palette (resourceId, paletteGuid)
APIPalMsg_IsPaletteVisible
Work 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