关于逻辑字体的问题(高手进)
天狼皓月 2005-09-13 03:57:13 首先说一下,下面是完整代码可以直接运行(在调用上没有任何错误,换别的函数都可以正常运行。就这一个不行)。首先说一下错在哪里,错就错在传结构上面 在CreateFontIndirect(ByVal lpLogFont As LOGFONT) As Long 函数中 包含一个描述自定义字体的结构体。在vb 6.0里 可以用 Type 的方法来声明,在delphi 里面 本身就带有一个logfont 类型的结构体 可以直接声明。我在 vb 6.0 和 delphi 里面都实现了。但是在vb.net 里就不行了 ,在vb.net 里不再支持 Type了 要用 Structure方法来 写结构体,但是在传送的时候就会出错.可能.net 也有类似logfont的结构体只是我不知道,也可能是和vb.net里面的字体是只读属性有关。但是我怎么也调试不出来,请高手指正。可能大家和我一样也是在vb.net里第一次用这个函数,但是我希望大家能一起来试一试,学习一下。 在调用方面没有错误,我是按照MSDN上面的调用非托管的dll实例代码改的.以下是源代码
'源代码
Imports System.Runtime.InteropServices
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Label1 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(32, 24)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(136, 16)
Me.Label1.TabIndex = 0
Me.Label1.Text = "Label1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(292, 273)
Me.Controls.Add(Me.Label1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dd As New HelloWorld
dd.Main()
End Sub
End Class
Public Class Win32
Structure LOGFONT '声明结构体
Dim lfHeight As Long '字体的高度
Dim lfWidth As Long '字符平均宽度
Dim lfEscapement As Long '行与水平页角度
Dim lfOrientation As Long '基线与水平角度
Dim lfWeight As Long '笔划的粗细
Dim lfItalic As Byte '非零为斜体
Dim lfUnderline As Byte '非零为下划线
Dim lfStrikeOut As Byte '非零为中划线
Dim lfCharSet As Byte '指定字符集
Dim lfOutPrecision As Byte '输出精度
Dim lfClipPrecision As Byte '裁剪精度
Dim lfQuality As Byte '输出质量
Dim lfPitchAndFamily As Byte '字体的字距和族
Dim lfFaceName As String '选择DC中字体的名称
End Structure
Public Declare Function CreateFontIndirectA Lib "gdi32" (ByVal lpLogFont As LOGFONT) As Long
Public Declare Function SelectObject Lib "gdi32.dll" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long
End Class
Public Class HelloWorld
Public Shared Sub Main()
Dim LF As Win32.LOGFONT
Dim hFont As Long
Dim MyFont As New Win32
With LF
.lfHeight = 100 '字符高度
.lfWidth = 50 '字符宽度
.lfEscapement = 0 '文本倾斜度,逆时针方向为正,一圈总角度为3600
.lfOrientation = 0 '字符倾斜角度
.lfWeight = 0 '字体的轻重
.lfUnderline = 0 '是否加下划线
.lfStrikeOut = 0 '是否加删除线
.lfCharSet = 1 '指定字符集
.lfOutPrecision = 0 '输出、输入精度
.lfClipPrecision = 0 '剪辑精度
.lfQuality = 0 '设置输出质量
.lfPitchAndFamily = 0 '字间距
.lfFaceName = "宋体" '字体名称
End With
MyFont.CreateFontIndirectA(LF) '就是这里传结构的时候出错了
End Sub
End Class