重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
创新互联公司专业为企业提供石峰网站建设、石峰做网站、石峰网站设计、石峰网站制作等企业网站建设、网页设计与制作、石峰企业网站模板建站服务,10多年石峰做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
参数
Destination 要复制内存块的目的地址。
Source 要复制内存块的源地址。
Length 指定要复制内存块的大小,单位为字节
返回值 该函数为VOID型,没有返回值。
首先我要说插件(Add-in)
插件般现程序扩展微软Office系统公套接口便让发员基于些接口实现Office应用程序增强接口准确说Extensibility.IDTExtensibility2.
除Office应用程序都支持类似扩展机制例IE及Visual Studio本身都支持定程序扩展
其我要说前发插件Add-in
发Office插件(Add-in)途径各种各我致总结三类:
VBA 发:基于Visaul Basic for Application套发模型做些定制种定制限制比较些发难度相说更加低些做VBA发朋友都知道VBA脱离应用程序本身例ExcelVBA编辑器图所示
VC++,Visual Basic发:种发式允许我VC++,或者VB 6直接实现Extensibility.IDTExtensibility2套接口并且更加灵做更加强些定制目前Office应用程序默认安装些插件都种式做例图我Outlook默认安装些插件列表
【备注】早前我用VB 6做面发现基本连VB 6安装程序都找所截图其实项目模板实现接口发种插件关键于Office本身内部些象模型熟悉
VSTO发:所谓VSTO全称Visual Studio Tools for Office.我记VS 2003始提供VSTO 1.0简言允许.NET发环境发Office应用程序或者插件种式着显易见处能力增强用.NET整套框架VSTO发展现几版本别
VS 2003: VSTO 1.0
VS 2005: VSTO 2.0
VS 2008: VSTO 3.0
VS 2010: VSTO 4.0
VSTO 前版本些太部署要看部署环节曾经花精力写插件各式各部署问题导致没办顺利发给用户种觉让沮丧VSTO解决案相些环境依赖另外需要提升.NET安全策略等等
消息现新版本发部署相更加容易发面模板更加用提供Ribbon内置支持部署面我通ClickOnce技术发布网站或者打包vsto压缩包文件容易进行部署本文我用简单例进行说明
我看看新版发工具何快速高效发插件(Add-in)
作演示我主要侧重于发部署流程我要实现插件其场景比较简单:
我需要Outlook添加新Ribbon按钮该按钮点击弹窗口允许我Excel文件导入联系
让我始吧
第步:创建Add-in项目
项目模板自创建面项目结构
【备注】ThisAddin类便访问Outlook前实例要使用代码即
this.Application
第二步:添加Ribbon
我需要Outlook添加新Ribbon按钮事实容易做
我选择Ribbon(Visual Designer)视化界面设计
我首先需要设置Ribbon要显示图我RibbonType修改Microsoft.Outlook.Explorer意思说我Ribbon现Outlook默认管理器窗口
接我添加按钮group1工具箱用控件
我做Ribbon看起像面
第三步:实现简单逻辑
接我按钮实现简单逻辑
通双击该按钮产事件处理器
我简单实现代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using System.Windows.Forms;
namespace OutlookAddInSample
{
public partial class MyRibbon
{
private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
{
}
private void btImport_Click(object sender, RibbonControlEventArgs e)
{
Form form = new Form()
{
Text = "Import Contacts from Excel File",
StartPosition=FormStartPosition.CenterScreen
};
form.Show();
}
}
}
第四步:调试
完操作简单Add-in做何进行调试呢
没错直接按F5进行调试Outlook自打我Ribbon确实能看
点击该按钮我确实看窗口显示
同我Outlook选项框能看插件信息
第五步:发布
我本机做调试何发给用户呢前我般制作MSI安装程序现依做我今主要介绍种更加便部署式通ClickOnce技术发布网站或者文件夹
【注意】location面几种我保持默认选择直接发布文件夹
发布没遇错误面目录
我般目录打包给用户即
第六步:安装
接用户拿些文件应该何安装使用呢其实简单双击setup.exe或者设置直接双击vsto文件
般情况提示
点击install
我再打Outlook仍看Add-in及所添加Ribbon
第七步:卸载
用户需要卸载插件应该做呢
Programs and Features窗口找插件点击Uninstall即
网络上找到这个比较全面,你试一下,我记得以前也是这么设置的。
int GetDeviceCaps( HDC hdc, int nIndex);
其中,hdc用来指定设备环境句柄,nIndex用来指定要获取的参量索引,对于打印机而言,它常常需要下列的预定义值:
LOGPIXELSX 打印机水平分辨率
LOGPIXELSY 打印机垂直分辨率
PHYSICALWIDTH 打印纸的实际宽度
PHYSICALHEIGHT 打印纸的实际高度
PHYSICALOFFSETX 实际可打印区域的物理左边距
PHYSICALOFFSETY 实际可打印区域的物理上边距
下面的函数代码就是用来设置页边距,并且还计算页面的物理边距:
void CEx_Prn1View::SetPageMargin(CDC *pDC, CPrintInfo *pInfo, int l, int t, int r, int b)
// l, t, r, b分别表示左上右下边距, 单位为0.1mm
{
int nOldMode = pDC- GetMapMode();
pDC- SetMapMode(MM_LOMETRIC);
// 计算一个设备单位等于多少0.1mm
double scaleX = 254.0 / (double)GetDeviceCaps(
pDC- m_hAttribDC, LOGPIXELSX);
double scaleY = 254.0 / (double)GetDeviceCaps(
pDC- m_hAttribDC, LOGPIXELSY);
int x = GetDeviceCaps(pDC- m_hAttribDC,
PHYSICALOFFSETX);
int y = GetDeviceCaps(pDC- m_hAttribDC,
PHYSICALOFFSETY);
int w = GetDeviceCaps(pDC- m_hAttribDC,
PHYSICALWIDTH);
int h = GetDeviceCaps(pDC- m_hAttribDC,
PHYSICALHEIGHT);
int nPageWidth = (int)((double)w*scaleX + 0.5);
// 纸宽,单位0.1mm
int nPageHeight = (int)((double)h*scaleY + 0.5);
// 纸高,单位0.1mm
m_nPhyLeft = (int)((double)x*scaleX + 0.5);
// 物理左边距,单位0.1mm
m_nPhyTop = (int)((double)y*scaleY + 0.5);
// 物理上边距,单位0.1mm
pDC- DPtoLP(pInfo- m_rectDraw);
CRect rcTemp = pInfo- m_rectDraw;
rcTemp.NormalizeRect();
m_nPhyRight = nPageWidth - rcTemp.Width() -
m_nPhyLeft; // 物理右边距,单位0.1mm
m_nPhyBottom = nPageHeight - rcTemp.Height() -
m_nPhyTop; // 物理下边距,单位0.1mm
// 若边距小于物理边距,则调整它们
if (l m_nPhyLeft) l = m_nPhyLeft;
if (t m_nPhyTop) t = m_nPhyTop;
if (r m_nPhyRight) r = m_nPhyRight;
if (b m_nPhyBottom) b = m_nPhyBottom;
// 计算并调整pInfo- m_rectDraw的大小
pInfo- m_rectDraw.left = l - m_nPhyLeft;
pInfo- m_rectDraw.top = - t + m_nPhyTop;
pInfo- m_rectDraw.right -= r - m_nPhyRight;
pInfo- m_rectDraw.bottom += b - m_nPhyBottom;
pDC- LPtoDP(pInfo- m_rectDraw);
pDC- SetMapMode(nOldMode);
// 恢复原来的映射模式
}
在C#中有 静态类 的概念 自然里边全部的方法都是静态的 这意味着你可以直接通过 类名 方法名 去调用(例如System的Math类就是典型) 在VB NET中 没有 静态类 的概念(当然你可以用 单例模式 把构造函数弄成Private的方式 其它方法都是静态的)如果某些方法需要被其它地方频繁使用 可以创建 模块 在VB NET中一旦创建了模块 其中任何方法 属性或者变量都可以被其它地方引用 因此适合全局情况下频繁交互的情况(比如初始化加载的参数 可能后续程序要使用)等
现在问题在于 如果你把一个类似以下的模块代码封装成DLL类库 无论在C#或者是VB NET中都无法引用到其方法
Module A
Public Sub Test()
End Sub
End Module
或许你感到很奇怪——不是在VB NET中这样定义一个Module就直接可以使用其内部方法了么?为什么封装成类库就不可以了呢?上网问了一些人 众说纷纭 后来我在他人协助下终于成功解决了这个问题——解决方法很简单——只要在Module前加Public
理由是 为了兼容C# VB NET由Module封装成类库中这个模块不再是 模块 而是一个标准的类了 如果这样写 那么在 NET中被理解成(C#)
internal A
{
public void Test()
{
}
}
整个模块变成Internal的了!当然你到其它程序集中去引用就引用不到!而把类库中的Module的修饰符改为Public就可以了 这就是MSDN那位友人给我最好的提示
虽然这个提示不是令我太满意(因为要知道VB NET中可以直接不通过 类名 方式直接使用方法名) 但是这给了我很大的暗示 得出重要的结论
)VB NET中Module在制作成类库时候等同于VB NET中的类的规则(里边的方法都是静态的) 默认情况下是Friend(C#是internal)
)根据结论 那么我们知道引用该DLL类库的方法一定是 i)引用命名空间 ii)C#中直接 类名 方法名 对于VB NET 直接可以引用到方法名
lishixinzhi/Article/program/net/201311/12502