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

+ Recent posts