'.NET3.5'에 해당되는 글 1건

  1. 2009.02.16 VSTO에서 메세지 서브클래싱..
2009. 2. 16. 10:02

VSTO에서 메세지 서브클래싱..

출처 : http://handmade.egloos.com/3770543

한 몇일간 '졸작 주제를 잘못 잡은게 아닐까.. 이거 방법이 없는거 아냐?' 라는 생각에 밤잠 설치게(는 아니고 감기 걸려서 잠을 잘 못잤음..) 한 문제가 있었다. 그 문제는 바로!!

오피스 2007의 '리본X UI'에서 OfficeMenu(좌측 상단의 동그란 MS마크의 메뉴) 의 동작을 runtime 시에 동적으로 disable 시키고 싶었는데 그게 안되더라. 는 것이었다.

애초부터 안되는거 아니냐고? 설마! 그랬으면 내가 이런 일말의 희망을 가지고 이틀동안 인터넷을 떠돌아 다녔을리가 없다.
실제로 다음과 같이 리본 메뉴 스키마를 작성하면 disable 시킬수가 있다.

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
  <ribbon>
    <officeMenu>
      <button idMso="FileNew" enabled ="false"/>
    </officeMenu>

      <tabs>
      <tab idMso="TabAddIns">
        <group id="MyGroup"
               label="My Group">
          <toggleButton id="toy" label="연습" size="large" onAction="OnToggle" imageMso="HappyFace"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
그럼됐지 뭐가 문제냐고? 저건 dynamic 하게 안된다는 무지막지한 단점이 있다. 즉 실행시에 한번만 초기화되면 어떻게 건들지를 못한다는거다.

근데.. 왠지 될거 같지 않은가? 왠지 모르게.. 저걸 읽어서 UI에 변화를 줄수 있다면 반대로 변화도 줄수 있을거야. MS가 나보다는 똑똑하니까, 분명히 무슨 함수라던지 속성이라던지가 있을꺼야.. 이러면서 이틀간 인터넷에서 사경을 헤멨(응?)..

근데, 암만 찾아봐도 dynamic하게 변경은 못하는것 같더라. 그래서 또 생각했다. 그러면 저 '리본 메뉴 스키마'를 2개(enable/disable)만들어 둬서 reload하면 될꺼야. 또 뒤졌다... 분명히 뭔가 있기는 있다. 그런데 이해가 안되더라. 
.NET 환경에서 작성된 내용도 아닌거 같고..(난 영어가 시러염!!!) 어쨌든 오늘도 그렇게 무료히 시간을 죽이고 있었더니..

invalidate라는 함수가 눈에 띄었다. (사실 어제부터 눈에 거슬렸으나.. 정확한 용법이 없으니 이게 뭘 하는지 모르겠는거라..)
MSDN을 뒤졌다. 오예~ 예제가 있다. 우선 살짝쿵 훑었다. 뭐 별거 없네.. 하고 닫으려는 순간 눈에 밟히는 문장이 있었으니..
[Instead of the Save dialog box appearing, the custom dialog box appears, as shown in Figure 2.]...

disable이 안된다면 내가 원하는대로 돌리면 되지(아놔.. '돼지' 야? '되지' 야?)..!!

그래서 결과 코드는 다음과 같이..
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
  <!-- QAT(Quick Access Toolbar) 부분 -->
  <commands>
    <command idMso="FileSave" onAction="MySave" />
  </commands>

  <ribbon startFromScratch="false">
    <!-- OfficeMenu 부분 -->
    <officeMenu>
      <button idMso="FileSave" enabled ="true" onAction ="MySave"/>
    </officeMenu>

    <tabs>
      <tab idMso="TabAddIns">
        <group id="MyGroup"
               label="My Group">
          <toggleButton description="this is test" id="toy" label="연습" size="large" onAction="OnToggle" imageMso="HappyFace"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

    Dim repurposing As Boolean = False

    Public Sub MySave(ByVal control As Office.IRibbonControl, ByRef cancelDefault As Boolean)
        If (repurposing) Then
            System.Windows.Forms.MessageBox.Show("로컬 컴퓨터에 저장할수 없음.")
            cancelDefault = True
        Else
            cancelDefault = False
        End If

    End Sub

#Region "Smile Toggle Button Action"
    Public Sub OnToggle(ByVal control As Office.IRibbonControl, ByVal isPressed As Boolean)
        If (isPressed) Then
            ReportTaskPane.Visible = True
        Else
            ReportTaskPane.Visible = False
        End If
        repurposing = isPressed
        ribbon.Invalidate()
    End Sub
#End Region

referenced from: http://msdn2.microsoft.com/en-us/library/bb462633.aspx