Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция EnumFontFamiliesEx, Определить шрифттип 
:(
    Опции темы
popzow
Дата 14.5.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Помогите разобраться с функцией EnumFontFamiliesEx. Вот у меня есть ComboBox  с шрифтами, через выбор в ComboBoxe я бы хотел бы узнать какой тип шрифта выбраннчй шрифт. Может кто знает как эта функция работает, или если аналогичная фнкция в .Net? 
PM MAIL   Вверх
popzow
Дата 14.5.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Вот выкопал в Интернете, еще бы как нибудь применить было бы вообще хорошо. Можеть бы кто- нибудь поможет. Большое спасибо. Очень нужна функция, неделю бьюсь ничего найти не могу.

Код

    Private Const LF_FACESIZE As Short = 32
    Private Const LF_FULLFACESIZE As Short = 64

    Private Declare Function EnumFontFamiliesEx Lib "gdi32" Alias "EnumFontFamiliesExA" (ByVal hDC As Integer, ByRef lpLogFont As LOGFONT, ByVal lpEnumFontProc As Integer, ByVal lParam As Integer, ByVal dw As Integer) As Integer

    Public Structure LOGFONT
        Dim lfHeight As Integer
        Dim lfWidth As Integer
        Dim lfEscapement As Integer
        Dim lfOrientation As Integer
        Dim lfWeight As Integer
        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
        <VBFixedArray(LF_FACESIZE)> Dim lfFaceName() As Byte

        Public Sub Initialize()
            ReDim lfFaceName(LF_FACESIZE)
        End Sub
    End Structure

PM MAIL   Вверх
Naum
Дата 15.5.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 2
Всего: 15



А чем не подходит просто Combobox.Font?


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
popzow
Дата 15.5.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Да я бы хотел бы не перечислить шрифты, а по имени шрифта узнать какой он тип (roman, swiss и.т.д) Вот не знаю как это реализовать.
PM MAIL   Вверх
Naum
Дата 16.5.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 2
Всего: 15



Извини, но опять не понял, что значит тип. Имя шрифта - это есть Family шрифта. Затем шрифт может быть подчеркнутый, жирный, курсив. Может иметь различные размеры. Что же конкретно значит тип шрифта?
Цитата(popzow @  15.5.2007,  19:52 Найти цитируемый пост)
Да я бы хотел бы не перечислить шрифты

А я и не предлагал перечислять шрифты.
Код

ComboBox myCombo = new ComboBox();
DoSomeThing(myCombo);
Font fontInCombo = myCombo.Font;

fongInCombo - есть текущий шрифт комбобокса.
Понял, чего я не понял.  smile 
Цитата(popzow @  14.5.2007,  20:12 Найти цитируемый пост)
Вот у меня есть ComboBox  с шрифтами,

Что значит "с шрифтами". У тебя там имена шрифтов, типа "Times New Roman", "Arial" и т.д.? Или что?



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
popzow
Дата 16.5.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Точно имена с шрифтаме типа "Times New Roman", "Arial" и т.д. в комбобоксе через выбор которых я бы хотел бы узнать- они roman, swiss или какой другой тип.

Код

Imports System.Runtime.InteropServices
Imports System.Drawing

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    Private Structure LOGFONT
        Public Const LF_FACESIZE = 32
        Public lfHeight As Integer
        Public lfWidth As Integer
        Public lfEscapement As Integer
        Public lfOrientation As Integer
        Public lfWeight As Integer
        Public lfItalic As Byte
        Public lfUnderline As Byte
        Public lfStrikeOut As Byte
        Public lfCharSet As Byte
        Public lfOutPrecision As Byte
        Public lfClipPrecision As Byte
        Public lfQuality As Byte
        Public lfPitchAndFamily As Byte
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=LF_FACESIZE)> _
        Public lfFaceName As String
    End Structure

    Private Enum PitchAndFamilyDefs
        DEFAULT_PITCH = 0
        FIXED_PITCH = 1
        VARIABLE_PITCH = 2
        FF_DONTCARE = (0 << 4)
        FF_ROMAN = (1 << 4)
        FF_SWISS = (2 << 4)
        FF_MODERN = (3 << 4)
        FF_SCRIPT = (4 << 4)
        FF_DECORATIVE = (5 << 4)
    End Enum


То что у меня на сегодня есть.
Пытаюсь выйти на PitchAndFamilyDefs.
Но вот сдесь с логикой что-то не то:

Код

    Private Declare Function GetObject Lib "gdi32.dll" Alias "GetObjectA" ( _
      ByVal hObject As IntPtr, ByVal nCount As Int32, ByVal lpObject As IntPtr) As Int32

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lf() As LOGFONT = New LOGFONT() {New LOGFONT}
        Dim font As Font = New Font("Arial", 8)
        GetObject(font.ToHfont(), Marshal.SizeOf(GetType(LOGFONT)), Marshal.UnsafeAddrOfPinnedArrayElement(lf, 0))
        MsgBox(lf(0).lfPitchAndFamily.ToString())
    End Sub


Может у тебя есть какие либо идеи.

PM MAIL   Вверх
Naum
Дата 18.5.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 2
Всего: 15



smile Ага я наконец понял вопрос. Извини, но ответа я не знаю. Пока. smile

Добавлено через 46 секунд
 smile В смысле не "до свидания". А пока я ответа не знаю. Но попробую помочь.

Добавлено через 3 минуты и 40 секунд
 smile В смысле не "до свидания". А пока я ответа не знаю. Но попробую помочь.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
popzow
Дата 18.5.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Реализовал.

Код


Imports System.Drawing
Imports System.Runtime.InteropServices

Public Class Form1
    Private Shared Charset As Byte = 0
    Private Shared PitchAndFamilyValue As Byte = 0
    Private Delegate Function EnumFontDelegate(ByVal lplf As IntPtr, ByVal lptm As IntPtr, ByVal dwType As IntPtr, ByVal lpData As IntPtr) As Integer
    Private Declare Function EnumFonts Lib "gdi32.dll" Alias "EnumFontsA" ( _
      ByVal hdc As IntPtr, ByVal lpFaceName As String, ByVal lpFontFunc As EnumFontDelegate, ByVal lParam As IntPtr) As Int32
    <StructLayout(LayoutKind.Sequential, _
    Charset:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Structure LOGFONT
        Public lfHeight As Integer
        Public lfWidth As Integer
        Public lfEscapement As Integer
        Public lfOrientation As Integer
        Public lfWeight As Integer
        Public lfItalic As Byte
        Public lfUnderline As Byte
        Public lfStrikeOut As Byte
        Public lfCharSet As Byte
        Public lfOutPrecision As Byte
        Public lfClipPrecision As Byte
        Public lfQuality As Byte
        Public lfPitchAndFamily As Byte
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
        Public lfFaceName As String
    End Structure
    <Flags()> _
    Public Enum PitchAndFamilyDefs
        ' Fields
        DEFAULT_PITCH = 0
        FF_DECORATIVE = 80
        FF_DONTCARE = 0
        FF_MODERN = &H30
        FF_ROMAN = &H10
        FF_SCRIPT = &H40
        FF_SWISS = &H20
        FIXED_PITCH = 1
        VARIABLE_PITCH = 2
    End Enum
    Public Enum CharacterSet
        ' Fields
        ANSI_CHARSET = 0
        DEFAULT_CHARSET = 1
        SYMBOL_CHARSET = 2
        SHIFTJIS_CHARSET = 128
        HANGEUL_CHARSET = 129
        HANGUL_CHARSET = 129
        GB2312_CHARSET = 134
        CHINESEBIG5_CHARSET = 136
        OEM_CHARSET = 255
        JOHAB_CHARSET = 130
        HEBREW_CHARSET = 177
        ARABIC_CHARSET = 178
        GREEK_CHARSET = 161
        TURKISH_CHARSET = 162
        VIETNAMESE_CHARSET = 163
        THAI_CHARSET = 222
        EASTEUROPE_CHARSET = 238
        RUSSIAN_CHARSET = 204
        MAC_CHARSET = 77
        BALTIC_CHARSET = 186
    End Enum
    Public Sub DisplayFontInformation(ByVal fontfam As FontFamily)
        Dim fntset As String = ""
        Dim fnttyp As String = ""
        Dim pitch As String = ""
        SetFontInformation(fontfam)
        ' Get font type
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.FF_ROMAN, Byte)) = CType(PitchAndFamilyDefs.FF_ROMAN, Byte) Then
            fnttyp = "roman"
        End If
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.FF_SWISS, Byte)) = CType(PitchAndFamilyDefs.FF_SWISS, Byte) Then
            fnttyp = "swiss"
        End If
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.FF_MODERN, Byte)) = CType(PitchAndFamilyDefs.FF_MODERN, Byte) Then
            fnttyp = "modern"
        End If
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.FF_SCRIPT, Byte)) = CType(PitchAndFamilyDefs.FF_SCRIPT, Byte) Then
            fnttyp = "script"
        End If
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.FF_DECORATIVE, Byte)) = CType(PitchAndFamilyDefs.FF_DECORATIVE, Byte) Then
            fnttyp = "decor"
        End If
        ' Get font pitch
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.VARIABLE_PITCH, Byte)) = CType(PitchAndFamilyDefs.VARIABLE_PITCH, Byte) Then
            pitch = "VARIABLE_PITCH"
        End If
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.DEFAULT_PITCH, Byte)) = CType(PitchAndFamilyDefs.DEFAULT_PITCH, Byte) Then
            pitch = "DEFAULT_PITCH"
        End If
        If (PitchAndFamilyValue And CType(PitchAndFamilyDefs.FIXED_PITCH, Byte)) = CType(PitchAndFamilyDefs.FIXED_PITCH, Byte) Then
            pitch = "FIXED_PITCH"
        End If
        ' Get font charset
        If System.Enum.GetName(GetType(CharacterSet), Charset) = "RUSSIAN_CHARSET" Then
            MsgBox("RUSSIAN_CHARSET")
        End If
        fntset = System.Enum.GetName(GetType(CharacterSet), Charset)
        MsgBox("Font: " & fontfam.Name & ", type: " & fnttyp & ", pitch: " & pitch & ", charset:" & fntset)
    End Sub
    Private Shared Function FontEnumProc(ByVal lpLF As IntPtr, ByVal lpTM As IntPtr, ByVal dwType As IntPtr, ByVal lpData As IntPtr) As Integer
        Dim LF As LOGFONT = DirectCast(Marshal.PtrToStructure(lpLF, GetType(LOGFONT)), LOGFONT)
        PitchAndFamilyValue = LF.lfPitchAndFamily
        Charset = LF.lfCharSet
        Return 0
    End Function
    Private Shared Sub SetFontInformation(ByVal fontfam As FontFamily)
        PitchAndFamilyValue = 0
        Charset = 0
        Dim fn As Font
        fn = New Font(fontfam, 10, FontStyle.Regular, 0, CharacterSet.RUSSIAN_CHARSET)
        If Not fn Is Nothing Then
            Dim g As Graphics = Graphics.FromImage(New Bitmap(100, 100))
            EnumFonts(g.GetHdc, fn.Name, New EnumFontDelegate(AddressOf FontEnumProc), IntPtr.Zero)
            g.ReleaseHdc()
            fn.Dispose()
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        DisplayFontInformation(RichTextBox1.Font.FontFamily)
    End Sub

End Class


А бы сейчас не могу проверить поддерживает ли какой-то конкретный шрифт к примеру RUSSIAN_CHARSET? smile 
Показывает или ANSI_CHARSET,DEFAULT_CHARSET или SYMBOL_CHARSET, и все. В принципе наверное так и должно быть с этой функцией, вот если кто- что знает как шрифт проверить поддерживает ли он определенный charset выкладываем. У меня уже почти нет идей. smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.