Как получить экран X и Y ячейки Excel 2003 в С#

Как найти абсолютное положение ячейки в Excel 2003 (например, относительно экрана [s]) при написании надстройки С# Excel 2003.

Свойства Top и Left диапазона (например, ActiveCell), кажется, дают X и Y относительно верхней левой ячейки. Window.Left и Top дают X и Y окна, но я не могу найти способ получить размер бита посередине (состоящего из панелей инструментов и т. Д.).

Цель здесь — отобразить форму WPF, которая относится к выбранной ячейке и расположена рядом с ней.

Я чувствую, что мне здесь не хватает чего-то основного. Любая помощь очень ценится!


person csharpfrood    schedule 08.06.2011    source источник
comment
Я не уверен, что ты сможешь это сделать. Самое близкое, что вы можете получить, это UsableHeight и UsableWidth активного окна (коллекция Application.Windows), вместе с Top и Left указанного окна и Width и Height главного окна Excel. Таким образом, вы можете в некоторой степени получить неклиентскую область. Но я не знаю, как узнать, сколько неклиентской области находится над вашим окном (строки меню, строка заголовка окна и т. д.) и сколько ниже (строка состояния)   -  person InBetween    schedule 08.06.2011
comment
Спасибо за помощь, InBetween! Я не изучал UsableHeight и UsableWidth, но это хорошее предложение. Можно определить, сколько стоит строка состояния, определяя, отображается она или нет (при условии, что строка состояния всегда имеет фиксированную высоту). Немного «хакерский», но если это лучшее, что я могу сделать...   -  person csharpfrood    schedule 09.06.2011


Ответы (1)


В следующей ссылке есть некоторый код VBA, который может указать вам правильное направление: Form Positioner .

Это более сложно, чем я думал, но если вам нужно найти высоту некоторых командных панелей Excel, может помочь следующий код VBA в их примере:

'
' we'll assume that the application's caption bar and the formula
' bar are the same height as the menu bar.  If we can't figure that out, use 26 as a default.
'
If Application.CommandBars.ActiveMenuBar.Visible = True Then
    DefaultCmdBarHeight = Application.CommandBars.ActiveMenuBar.Height
Else
    DefaultCmdBarHeight = cDefaultCmdBarHeight
End If
'
' We have to have a compenstating factor for command bars. Load an array
' with the heights of visible command bars. The index into the array is
' the RowIndex of the command bar, so we won't "double dip" if two or more
' command bars occupy the same row.
'
For Each CmdBar In Application.CommandBars
    With CmdBar
        If (.Visible = True) And (.Position = msoBarTop) Or (.Position = msoBarMenuBar) Then
            If .RowIndex > 0 Then
                VCmdArr(.RowIndex) = .Height
            End If
        End If
        If (.Visible = True) And (.Position = msoBarLeft) Then
            If .RowIndex > 0 Then
                HCmdArr(.RowIndex) = .Width
            End If
        End If
    End With
Next CmdBar
person Richard Morgan    schedule 09.06.2011