플러그인 방식의 애플리케이션 프레임워크 구축(7) - 기본 서비스

5143 단어 응용 프로그램
기왕 틀을 잡은 이상 우리는 특정한 목표를 위해 서비스를 제공하기를 희망한다. 우리는 사용자가 그의 기능을 계속 확장할 수 있도록 기본적인 서비스를 제공해야 한다.먼저 떠오르는 기능은 바로 메뉴, 도구 모음의 관리이다. 다음에 우리는 도구 모음에 멈추는 등 더욱 유행하는 기능을 실현해야 한다.
어떻게 이런 서비스들을 실현합니까?플러그인이 실행될 때 프로그램 자체의 메뉴, 도구막대, 도구막대 정지 등을 얻을 수 있기를 바랍니다. 예를 들어 메뉴 항목을 추가하고 도구막대 단추를 추가하는 등 항목을 추가할 수 있기를 바랍니다.실행할 때 어떤 메뉴나 도구막대를 얻기 위해서, 우리는 모든 메뉴의 후자 도구막대에 키키를 분배한 다음, 필요할 때 이 키를 통해 실례를 얻어야 한다.이 키에 대해서 말하자면, 나의 예는 비교적 간단하다. 바로 그의 이름이다. Tool Strip 서비스의 코드를 살펴보자.
복제하다
보존
using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

namespace PluginFramework

{

public class ToolStripService : IToolStripService

{

private IApplication application = null;

private Dictionary<String, ToolStrip> toolStrips = new Dictionary<string, ToolStrip>();

public ToolStripService(IApplication application)

{

this.application = application;

}



#region IToolStripService Members



public System.Windows.Forms.ToolStrip GetToolStrip(string toolStripName)

{

ToolStrip toolStrip = null;

if (toolStrips.ContainsKey(toolStripName))

{

toolStrip = toolStrips[toolStripName];

}

return toolStrip;

}

public void AddToolStrip(string toolStripName, System.Windows.Forms.ToolStrip toolStrip)

{

if (toolStrips.ContainsKey(toolStripName))

{

MessageBox.Show("The tool strip name has existed!");

}

else

{

toolStrips[toolStripName] = toolStrip;

//      toolstrip     ,       

                if (application.TopToolPanel != null)

{

application.TopToolPanel.Controls.Add(toolStrip);

}

}

}

public void AddToolStrip(string toolStripName,

System.Windows.Forms.ToolStrip toolStrip,

ToolStripDockState option)

{

if (toolStrips.ContainsKey(toolStripName))

{

MessageBox.Show("The tool strip name has existed!");

}

else

{

toolStrips[toolStripName] = toolStrip;

switch (option)

{

case ToolStripDockState.Left:

if (application.LeftToolPanel != null)

{

application.LeftToolPanel.Controls.Add(toolStrip);

}

break;

case ToolStripDockState.Right:

if (application.RightToolPanel != null)

{

application.RightToolPanel.Controls.Add(toolStrip);

}

break;

case ToolStripDockState.Top:

if (application.TopToolPanel != null)

{

application.TopToolPanel.Controls.Add(toolStrip);

}

break;

case ToolStripDockState.Bottom:

if (application.BottomToolPanel != null)

{

application.BottomToolPanel.Controls.Add(toolStrip);

}

break;

}

}

}

public void RemoveToolStrip(string toolStripName)

{

ToolStrip toolStrip = GetToolStrip(toolStripName);

if (toolStrip != null)

{

if (application.TopToolPanel != null

&& application.TopToolPanel.Controls.Contains(toolStrip))

{

application.TopToolPanel.Controls.Remove(toolStrip);

}

else if (application.BottomToolPanel != null

&& application.BottomToolPanel.Controls.Contains(toolStrip))

{

application.BottomToolPanel.Controls.Remove(toolStrip);

}

else if (application.LeftToolPanel != null

&& application.LeftToolPanel.Controls.Contains(toolStrip))

{

application.LeftToolPanel.Controls.Remove(toolStrip);

}

else if (application.RightToolPanel != null

&& application.RightToolPanel.Controls.Contains(toolStrip))

{

application.RightToolPanel.Controls.Remove(toolStrip);

}

}

toolStrips.Remove(toolStripName);

}



#endregion

    }

}

보기나 정지 도구막대에 대해 말하자면 사전에 직접 실례를 넣지 않고 대상의 유형을 사전에 넣는 것이 좋다. 보기와 정지 도구막대 자체는Form에서 파생된 것이기 때문에 보기나 정지 도구막대가 닫힐 때 대상은 소각되고 대상의 창설은 플러그인의Load 방법에서 이루어진다.우리는 플러그인의 Load 방법을 다시 호출할 수 없다. 이렇게 해서 우리의 사용에 불편을 가져왔기 때문에 우리는 유형을 등록하고 서비스에서 하나의 Show 방법을 실현하는 것이 비교적 합리적이다. 여기서 편의를 보여주기 위해 나는 직접 Load에서 실례화를 하고 실례를 사전에 넣었다.
다음 그림에서는 플러그인이 포함된 정지 도구막대, 도구막대, 새 메뉴 'View' 와 View 메뉴의 하위 메뉴를 보여 줍니다.
요즘은 시간이 없어서 글을 느리게 보내고 잘못 썼어요. 잘 모르는 부분은 원본 코드를 참고할 수 있어요. 여러분의 양해를 바랍니다.
소스 코드
http://files.cnblogs.com/guanjinke/pluginsample3.rar

좋은 웹페이지 즐겨찾기