2017-08-31 1 views
0

Je souhaite placer un logo dans le coin supérieur droit de chaque page d'un document. Cette fonctionnalité est déjà présente dans un complément Word géré par nous. Cependant, cette fonctionnalité ne fonctionne pas correctement. Le complément convertit l'image en forme et place cette image à une distance fixe du coin gauche du document. Cela fonctionne pour les documents au format A4, mais chaque fois que l'orientation ou la taille du document change, le placement du logo est désactivé.VSTO Word & Visual basic: la propriété Shape.Left ne prend pas la valeur affectée

J'ai essayé de nombreuses stratégies pour résoudre ce problème, mais je n'ai pas trouvé de méthode satisfaisante. Ma stratégie actuelle consiste à déterminer dynamiquement la distance entre le côté gauche de la page et le logo, puis à faire cette position par rapport au côté droit de la page en appelant la propriété .RelativeHorizontalPosition et en la reliant à la zone de marge droite.

Malheureusement, l'interaction avec la propriété .Left de l'objet Shape a été gênante. La propriété .Left ne prend pas la valeur que je lui assigne, mais prend une valeur négative. J'ai vérifié le paramètre que je lui assigne plusieurs fois. Quelqu'un sait-il pourquoi c'est le cas et comment le résoudre?

Exemple de code

Private Sub AddLogos(section As Section, header As HeaderFooter) 
    Dim wordApp As Word.Application = Globals.ThisAddIn.Application 
    Dim pageWidth As Single = section.PageSetup.PageWidth 
    Dim imgFilePath As String = "filepath" 
    Dim leftDistanceA4 As Single = 11 
    Dim logo As Word.Shape 

    Try 
     If wordApp.ActiveDocument.SaveFormat >= 12 Then 
      logo = header.Range.InlineShapes.AddPicture(m_sImageLogo, False, True).ConvertToShape() 
     Else 'Word 97-2003 Support 
      logo = header.Shapes.AddPicture(imgFilePath, False, True) 
     End If 
    Catch ex As Exception 
     Throw New Exception("Error message.") 
    End Try 

    Dim distanceFromRightPageEdge = wordApp.CentimetersToPoints(21 - leftDistanceA4) 
    Dim distanceFromLeftPageEdge = pageWidth - distanceFromRightPageEdge 

    With logo 
     .RelativeVerticalPosition = WdRelativeVerticalPosition.wdRelativeVerticalPositionPage 
     .Left = distanceFromLeftPageEdge 
     .RelativeHorizontalPosition = WdRelativeHorizontalPosition.wdRelativeHorizontalPositionRightMarginArea 
    End With 

Répondre

0

Au lieu de régler la position gauche à une valeur absolue, vous pouvez le faire par rapport et essentiellement « droit-align » la forme. Si vous définissez les propriétés RelativeHorizontalPosition et Left comme indiqué ci-dessous, l'image sera placée dans le coin supérieur droit et conservera sa position relative dans ce coin même si le format ou la taille du document est modifié.

Const imgpath As String = "[your path]" 

    Dim app As New Microsoft.Office.Interop.Word.Application 
    Dim doc As Microsoft.Office.Interop.Word.Document = app.Documents.Add() 
    Dim head As Microsoft.Office.Interop.Word.HeaderFooter = doc.Sections(1).Headers(1) 
    Dim img As Microsoft.Office.Interop.Word.Shape = head.Shapes.AddPicture(imgpath, False, True) 
    With img 
     .RelativeHorizontalPosition = Microsoft.Office.Interop.Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionMargin 
     .Left = Microsoft.Office.Interop.Word.WdShapePosition.wdShapeRight 
    End With 
    app.Visible = True 

    'dispose references 

Edit: Si vous avez besoin de plus de contrôle sur le positionnement de l'ancrage simplement l'image au coin supérieur droit de la page, les formes inline ne possèdent pas en soi que. Au lieu de cela, pensez à utiliser une table sans bordure dans l'en-tête pour fournir plus de contrôle sur son contenu. Une fois que l'image est un enfant de la table, vous avez accès à tous les contrôles de mise en forme de table à utiliser sur votre image:

Const imgpath As String = "[your path]" 
    Const imgMarginCM As Integer = 2 

    Dim app As New Microsoft.Office.Interop.Word.Application 
    Dim doc As Microsoft.Office.Interop.Word.Document = app.Documents.Add() 
    Dim head As Microsoft.Office.Interop.Word.HeaderFooter = doc.Sections(1).Headers(1) 
    Dim tbl As Microsoft.Office.Interop.Word.Table = doc.Tables.Add(head.Range, 1, 1) 
    With tbl 
     .Borders.Enable = False 
     .AutoFitBehavior(Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitWindow) 
     .Cell(1, 1).Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight 
     .Cell(1, 1).TopPadding = app.CentimetersToPoints(imgMarginCM) 
     .Cell(1, 1).RightPadding = app.CentimetersToPoints(imgMarginCM) 
     .Cell(1, 1).Range.InlineShapes.AddPicture(imgpath, False, True) 
    End With 
    app.Visible = True 

    'dispose references 

Bien sûr, si vous avez d'autres éléments dans l'en-tête alors vous créer un Ajuster l'espacement de manière appropriée, mais pour cet exemple, je mets simplement une table unicellulaire sans bordure dans l'en-tête et définissez son comportement autofit à fitwindow afin que la table remplisse la largeur de la page même lorsque les marges ou le format est changé. Ensuite, je viens de définir le rembourrage haut et à droite de la cellule avec l'image, et le comportement que vous recherchez est atteint.

+0

Merci pour votre réponse! J'étais conscient de la technique suivante, mais avec cette technique, je n'étais pas capable de laisser un espace blanc entre la forme/le logo et les coins de la page. Y at-il un moyen d'ajuster ce code, de sorte que le logo sera placé à 1 ou 2 cm des coins supérieur et droit? – Fluous

+0

Voir l'édition, les formes en ligne ont beaucoup d'options de mise en forme graphique, mais pas autant d'options de mise en page. L'utilisation d'une table pour maintenir la forme vous donnera beaucoup plus de contrôle sur la mise en page. – soohoonigan