Top > OOobbs2 > 38

OOobbs2/38 Edit

  • サマリ: 図をクリックして拡大表示させたい
  • 環境: Writer
  • 状態: 未解決
  • 投稿者: アポロ?
  • 投稿日: 2007-05-20 (日) 14:12:15

質問 Edit

ドキュメントに縮小した図を挿入して、その図をクリックしたときに、ウィンドウがポップアップしてオリジナルサイズの図を表示するというような仕組みを作りたいと思います。

とりあえず、図をクリックしたときにダイアログを表示させて、ボタンやイメージコントロールで図を表示させるといったようなところまではできたのですが、ダイアログに表示する図は絶対パスのURLで画像ファイルにリンクすることしかできませんでした。

ドキュメント内に挿入した図をそのままダイアログに表示したいのですが、どのようにすればいいのでしょうか?

回答 Edit

  • 挿入 - 画像から挿入した画像ファイルは png ファイルとしてドキュメントの Pictures ディレクトリに入れられて圧縮されます。

このときのファイル名は、挿入された画像オブジェクトの GraphicURL プロパティから vnd.sun.star.GraphicObject:10000000000001EA000000BACCC32DF4 といった形で取得できます。

API の UCB でドキュメントファイル内部へのアクセスに vnd.sun.star.pkg:// といった形式の Url を利用します。(DevGuide Chapter 14)

上記の場合、vnd.sun.star.pkg://Pictures%2F10000000000001EA000000BACCC32DF4.png 実際のディレクトリの部分の / は %2F に変換

SimpleFileAccess サービスでファイルの有無をチェックすると有る事は確認できるのですが、そのままの URL を Basic ダイアログのイメージコントロールの ImageURL プロパティに与えても画像が表示されません。

イメージコントロールなどではこの形式の Url を認識しないようです。(以前は出来たような気がしたのですが・・・)

画像を表示できていませんが、テストに使用したファイルを添付しておきます。

fileOOobbs2-38.ods

この形式以外の Url でうまくいくかどうかわかりませんが、うまくいかない場合には外にコピーして Url を与えるなどでしょうか。

  • はにゃ?? 2007-05-21 (月) 03:50:05
  • 同じような話題です

http://www.oooforum.org/forum/viewtopic.phtml?t=55075

  • はにゃ?? 2007-08-07 (火) 12:26:41
  • ダイアログと画像を表示するコントロールをダイアログライブラリに用意しておくとサイズが合わないので、画像を表示するダイアログはランタイムで作成しないといけません。ランタイムで作成したときのダイアログのサイズ指定は pixel になりますが、ダイアログモジュールとして作成、実行した場合には pixel 単位になりません。 -- はにゃ?? 2007-08-07 (火) 14:55:38
  • 上記、間違い。ダイアログだとランタイムでも pixel になりません。ウィンドウを作成して場合は別です。 -- はにゃ?? 2007-08-07 (火) 16:37:03
  • 再度訂正。モデルでサイズ指定すると合いませんが、コントローラでサイズを設定すれば pixel サイズに合わせられます。 -- はにゃ?? 2007-08-07 (火) 16:54:01
  • Writer ドキュメントに挿入した (リンクでない) 画像を選択して実行するとダイアログに画像を表示するようにマクロを作成してみました。

fileShowSelectedImage_1.odt

Calc だと com.sun.star.text.TextGraphicObject じゃないので使えません。

com.sun.star.drawing.ShapeCollection にも対応するには・・・

  • はにゃ?? 2007-08-07 (火) 17:06:04
  • Calc、Draw などの ShapeCollection の要素数 Count が 1 のときのみ表示するように対応してみました。

fileShowSelectedImage_2.ods

DocumentStorage はドキュメントが保存されていないと使用できません。

Sub Main
Dim oDoc As Object, oGraphics As Object
Dim oDocStorage As Object
Dim oSelection As Object

  oDoc = ThisComponent
  oSelection = oDoc.getCurrentSelection()
  
  'only TextGraphicObject
  If oSelection.supportsService("com.sun.star.text.TextGraphicObject") Then
    ImgViewer( oSelection, oDoc )
  Elseif oSelection.supportsService("com.sun.star.drawing.ShapeCollection") Then
    If oSelection.Count = 1 Then
      ImgViewer( oSelection.getByIndex(0), oDoc )
    End If
  End If
End Sub


Sub ImgViewer( oGraphicObj, oDocument )
  sImgName = oGraphicObj.GraphicURL
  If InStr( sImgName, "vnd.sun.star.GraphicObject:" ) = 1 Then
    sImgName = Mid(sImgName,28)
    
    If oDocument.DocumentStorage.hasByName("Pictures") Then
      oPictureStorage = oDocument.DocumentStorage.getByName("Pictures")
      
      'filenames of image files that stored in DocumentStorage
      'is like this "10000000000002AELI223.png"
      'difference between GraphicURL and it is its extension
      
      sImgName = GetFullFileName( sImgName, oPictureStorage.ElementNames )
      oPicture = oPictureStorage.getByName( sImgName )
      
      'GraphicProvider to make image XGraphic interface
      oGP = CreateUnoService("com.sun.star.graphic.GraphicProvider")
      Dim oPRops(0) As New com.sun.star.beans.PropertyValue
      oProps(0).Name = "InputStream"
      oProps(0).Value = oPicture.InputStream
      oGraphic = oGP.queryGraphic(oProps)
      
      'Show image on the dialog
      ImgDialog( oGraphic )
    Else
      Exit Sub
    End If
  End If
End Sub



Sub ImgDialog( oGraphic )
  Dim oDialog As Object, oDialogModel As Object
  Dim oImgCtrModel As Object
  Dim nMargin As Long, nHeight As Long, nWidth As Long
  
  aSize = oGraphic.Size
  nMargin = 5 'margin of image control
  nHeight = aSize.Height + nMargin
  nWidth  = aSize.Width + nMargin
  
  oDialogModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
  oDialogModel.setPropertyValues( _
    array("Name","Title"), _
    array("dialog","") )
  oDialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
  oDialog.setModel( oDialogModel )
  
  oImgCtrModel = oDialogModel.createInstance("com.sun.star.awt.UnoControlImageControlModel")
  oImgCtrModel.setPropertyValues( _
    array("Name"), _
    array("dialog") )
  oDialogModel.insertByName( "imgctr", oImgCtrModel )
  
  oImgCtr = oDialog.getControl("imgctr")
  oImgCtr.setPosSize( nMargin,nMargin, nWidth, nHeight, com.sun.star.awt.PosSize.POSSIZE )

  oDialog.setPosSize( 100,100, nWidth + nMargin*2, nHeight + nMargin*2, com.sun.star.awt.PosSize.POSSIZE )

  oDialog.setVisible(true)
  
  oImgCtr.setGraphics( oDialog.Peer.createGraphics() )
  oImgCtrModel.Graphic = oGraphic
  
  oDialog.execute()
End Sub


Function GetFullFileName( sFileName, sFileNames )
  For Each s In sFileNames
    If sFileName = StripExtension(s) Then
      sName = s
      Exit For
    End If
  Next
  GetFullFileName = sName
End Function


Function StripExtension( ByVal sFileName ) As String
Dim nPos As Long, nlPos
  nPos = 0 
  Do
    nPos = InStr(nPos +1, sFileName, ".")
    If nPos > 0 Then nlPos = nPos
  Loop While nPos > 0
  StripExtension = IIf ( nlPos > 0, Mid( sFileName, 1, nlPos -1 ), sFileName )
End Function
  • はにゃ?? 2007-08-07 (火) 17:23:23

感想,コメント,メモ Edit



Attach file: fileShowSelectedImage_2.ods 807 download [Information] fileShowSelectedImage_1.odt 796 download [Information] fileOOobbs2-38.ods 858 download [Information]

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes