
正文
vb.netvoid的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
用VB.Net 编程时如何获得打印机的物理边距
网络上找到这个比较全面,你试一下,我记得以前也是这么设置的。
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);
// 恢复原来的映射模式
}
相关问答
Q1: VB.NET中的模块
在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
Q2: vb.net做安装包,安装后自动运行程序
1 新建安装部署项目
打开VS2005,点击新建项目,选择:其他项目类型-安装与部署-安装向导(安装项目),然后点击确定。
2 安装向导
关闭后打开安装向导,点击下一步,或者直接点击完成。
3 开始制作
安装向导完成后即可进入项目文件夹:
双击"应用程序文件夹"在右边的空白处右击,选择添加-文件,将你的做的应用程序的可执行文件和相应的类库和组件添加进来。然后右击你的文件,创建快捷方式,然后把快捷方式分别复制或剪切到左边的"用户的'程序'菜单"和"用户桌面"中。这样安装程序安装完成后会在 "开始-所有程序"和"桌面"上生成程序的快捷方式。也可以直接在"用户的'程序'菜单"和"用户桌面"相应目录下新建快捷方式,然后定位到你的文件。
然后右击左边的"应用程序文件夹"打开属性对话框:将属性中的"DefaultLocation"的路径中的"[Manufacturer]"去掉,不然的话做好的安装程序默认安装目录会是"C:\Program Files\你的用户名\安装解决方案名称";
然后打开解决方案管理器,右击你的解决方案名称,选择属性:打开的属性页中,选择"系统必备", 在打开的系统必备页中,在"指定系统必备安装组件的位置"中选中如下选择项:从与我的应用程序相同的位置下载系统必备组件。选上以后,在生成的安装文件包中包含.NetFramework组件 。好了,这样就完成99%了,然后点击"生成-生成解决方案",生成成功!
我以前参考过的,希望对你有帮助。
安装完成后自动启动程序
1.新建一个空的项目InstallCompenent,步骤为:解决方案-右键添加-新建项目-选择"空项目"-输入名称"InstallCompenent"-确定,完成项目的添加.
2.在InstallCompenent项目中右键-添加-新建项-选择安装程序类-输入名称"Installer",完成installer类的添加.
修改代码为:
/// summary
/// 功能是做安装项目主项目输出
/// 实现安装过程中的一些操作
/// 如:安装完成后启动项目
/// /summary
[RunInstaller(true)]
public partial class Installer : Installer
{
/// summary
/// 应用程序入口
/// /summary
public static void Main()
{
}
/// summary
/// 构造函数
/// /summary
public ECSuitsInstaller()
{
InitializeComponent();
}
/// summary
/// 重写安装完成后函数
/// 实现安装完成后自动启动已安装的程序
/// /summary
/// param name="savedState"/param
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
Assembly asm = Assembly.GetExecutingAssembly();
string path = asm.Location.Remove(asm.Location.LastIndexOf("\\")) + "\\";
System.Diagnostics.Process.Start(path + "\\ECSuits.exe");
}
/// summary
/// 重写安装过程方法
/// /summary
/// param name="stateSaver"/param
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
/// summary
/// 重写安装之前方法
/// /summary
/// param name="savedState"/param
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
}
/// summary
/// 重写卸载方法
/// /summary
/// param name="savedState"/param
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
/// summary
/// 重写回滚方法
/// /summary
/// param name="savedState"/param
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
}
3.在安装项目中右键-添加项目输出-选择"项目"-InstallCompenent.
完成主输出项目的添加.
4.打开自定义操作编辑器,在安装-右键-添加自定义操作-选择"应用程序文件夹"-选择"主输出来自InstallCompenent",完成添加.
vb.netvoid的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、vb.netvoid的信息别忘了在本站进行查找喔。








