using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Office.Tools.Ribbon; using System.Windows.Forms; using System.Net.Sockets; using System.Runtime.InteropServices; using Microsoft.Office.Interop.Excel; namespace ExcelAddIn1 { public partial class Ribbon1 { Worksheet _sheet; public double pppx = -1, pppy = -1; public double fbTop = -1, fbLeft = -1; public double hLeft = -1, hTop = -1; public bool init = false; const int LOGPIXELSX = 88; const int LOGPIXELSY = 90; [DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr hWnd); [DllImport("user32.dll")] static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); private void PixelsPerPointX() { if (!this.init) { IntPtr hdc = GetDC(new IntPtr(0)); int PixPerInchX = GetDeviceCaps(hdc, LOGPIXELSX); double pppx = PixPerInchX / 72.0; //72 is the points per inch ReleaseDC(new IntPtr(0), hdc); this.pppx = pppx; } } private void PixelsPerPointY() { if (!this.init) { IntPtr hdc = GetDC(new IntPtr(0)); int PixPerInchY = GetDeviceCaps(hdc, LOGPIXELSY); double pppy = PixPerInchY / 72.0; //72 is the points per inch ReleaseDC(new IntPtr(0), hdc); this.pppy = pppy; } } private void GetFormulaBarAndHeadingsDim() { if (!this.init) { bool formBar = Globals.ThisAddIn.Application.DisplayFormulaBar; bool headings = Globals.ThisAddIn.Application.ActiveWindow.DisplayHeadings; double beforeH, afterH, beforeW, afterW; //check the size of the formula bar beforeH = Globals.ThisAddIn.Application.ActiveWindow.Height; beforeW = Globals.ThisAddIn.Application.ActiveWindow.Width; Globals.ThisAddIn.Application.DisplayFormulaBar = false; afterH = Globals.ThisAddIn.Application.ActiveWindow.Height; afterW = Globals.ThisAddIn.Application.ActiveWindow.Width; Globals.ThisAddIn.Application.DisplayFormulaBar = true; this.fbLeft = afterW - beforeW; this.fbTop = afterH - beforeH; this.hLeft = 0; this.hTop = 0; Globals.ThisAddIn.Application.DisplayFormulaBar = formBar; Globals.ThisAddIn.Application.ActiveWindow.DisplayHeadings = headings; } } private void log(String s) { this.label3.Label += s + " | "; } private void Ribbon1_Load(object sender, RibbonUIEventArgs e) { this._sheet = Globals.ThisAddIn.Application.ActiveSheet; this._sheet.SelectionChange +=new DocEvents_SelectionChangeEventHandler(sheet_SelectionChange); } private void sheet_SelectionChange(Range rng) { MessageBox.Show("Select changed!"); } private void CellTopLeftPixels(Range rng) { if (!init) { PixelsPerPointX(); PixelsPerPointY(); GetFormulaBarAndHeadingsDim(); init = true; } double appTop = Globals.ThisAddIn.Application.Top; double appLeft = Globals.ThisAddIn.Application.Left; long RibbonHeight = Globals.ThisAddIn.Application.CommandBars["Ribbon"].Height; this.log("aT " + appTop); this.log("aL " + appLeft); this.log("rH " + RibbonHeight); this.log("px " + this.pppx); this.log("py " + this.pppy); this.log("fY " + this.fbTop); this.log("fX " + this.fbLeft); this.log("hY " + this.hTop); this.log("hX " + this.hLeft); this.log("rT " + rng.Top); this.log("rL " + rng.Left); this.log("1T " + (appTop + RibbonHeight + rng.Top + this.fbTop + this.hTop)); this.log("1L " + (appLeft + rng.Left + this.fbLeft + this.hTop)); long top = (long)((appTop + RibbonHeight + rng.Top + this.fbTop + this.hTop) * this.pppy); long left = (long)((appLeft + rng.Left + this.fbLeft + this.hLeft) * this.pppx); this.label1.Label = "left: " + left + " top: " + top; long topc = (long)((appTop + RibbonHeight + rng.Top + this.fbTop + this.hTop + rng.Height) * pppy); long leftc = (long)((appLeft + rng.Left + rng.Width + this.fbLeft + this.hTop) * pppx); this.label2.Label = "left: " + leftc + " top: " + topc; } private void button1_Click(object sender, RibbonControlEventArgs e) { this.label3.Label = ""; CellTopLeftPixels(Globals.ThisAddIn.Application.ActiveCell); } } }
출처 : https://svn.kwarc.info/repos/sissi/trunk/win_office_alex/ExcelAddIn1/ExcelAddIn1/Ribbon1.cs
'.Net > Winform' 카테고리의 다른 글
C# Winform 멀티 UI 쓰레드 (0) | 2015.05.06 |
---|---|
C# DataGridView 콤보박스 클릭시 리스트 보여지게 하기 (0) | 2014.10.31 |
C# TabControl 안에 윈도우 추가하기 (2) | 2014.08.19 |
C# 멀티 헤더 DataGridView (0) | 2014.08.14 |
C# CodeDom과 Lambda Exprssion 비교 (0) | 2014.07.14 |