FreeBasic
Главная
Вход
Регистрация
Понедельник, 16.07.2018, 02:05Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » WinAPI » WinApi в freebasic » Вывод символов Unicode (иерглифы и т.п.) (с помощью TextOut, DrawText)
Вывод символов Unicode (иерглифы и т.п.)
WQДата: Четверг, 21.08.2014, 15:31 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 157
Репутация: 5
Статус: Offline
Возможно ли выводить через функции TextOut, DrawText специфические символы кирилицы или иероглифы и т.п.?
 
haavДата: Четверг, 21.08.2014, 17:06 | Сообщение # 2
Генерал-полковник
Группа: Администраторы
Сообщений: 854
Репутация: 34
Статус: Offline
TextOut и DrawText поддерживают unicode. Создавай исходник в Unicode, объявляй в самом начале #Define Unicode и используй уже для строк тип wstring. Только FbEdit и FbIde как редакторы не поддерживают юникод. То есть если надо какой-нибудь китайский символ в исходник занести, то придется писать исходник в другом редакторе (например: AkelPad, Notepad++ , Geany и пр.). Или писать в любом редакторе, но вместо символов писать что-то вроде WChr (&h723,&h725,&h727,&h733)

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Суббота, 08.11.2014, 14:21 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 157
Репутация: 5
Статус: Offline
Понятно. Буду разбираться!

Добавлено (08.11.2014, 14:21)
---------------------------------------------
На эту же тему Юникода:
Код
#define UNICODE

#Include Once "windows.bi"
#Include "win\commdlg.bi"
'
Declare Function GetOFN(_
ByVal hwndOwner As HWND, _
ByVal pszfile As ZString Ptr, _
ByVal nMaxFile As Integer) As Integer
'
Dim As Integer OFNerr,OFNres,retlen
Dim As Integer nptr,optr,fidx= -1
Dim As String filename(1000) 'could be dynamic, for redim
Dim As String file=String(2048,0)'fb string, not zstring. 2048000 works in Vista
'
OFNres=GetOFN(0,StrPtr(file),Len(file))
'If not 1 then there's an error, if 0 then maybe no file was selected
'
OFNerr=CommDlgExtendedError() 'convert to hex for MSDN

If OFNres=1 And OFNerr=0 Then
     'truncate your buffer...
     retlen=InStr(file,Chr(0,0))
     file=Left(file,retlen)
     '
     'parse file, seeking/splitting on the NULL separators
     optr=1:nptr=1:fidx= -1
     While optr<retlen
        nptr=InStr(nptr,file,Chr(0))
        If nptr>0 Then
           fidx+=1 'need to check for filename(fidx) overrun
           filename(fidx)=Mid(file,optr,nptr-optr)
           optr=nptr+1
           nptr+=1
        End If
     Wend
     '
Else
     'you have errors or user cancelled action
     Beep:Beep
End If

If fidx>-1 Then
     For t As Integer = 0 To fidx 'first idx(0) is DIRECTORY, or a singular selected file
        Print "IDX: ";Chr(34);filename(t);Chr(34)
     Next
Else
     Print "No files found/selected?" 'either/or
End If
Print:Print "Sleeping..."
Sleep

Function GetOFN( ByVal hwndOwner As HWND, _
     ByVal pszFile As ZString Ptr, _
     ByVal nMaxFile As Integer) As Integer
          
     Dim Filter As WString Ptr      
          
     Dim f0 As String = "*.mp3"
     Dim f1 As WString*30     
     f1=WStr(f0 & !"\0" & f0 & !"\0\0")
     Filter=@(f1)' Не работает      
       
       
     Filter=@WStr("*.mp3" & !"\0" & "*.mp3" & !"\0\0")' 'Работает   
          
     Dim As OPENFILENAME ofn     
     ofn.lStructSize = SizeOf(OPENFILENAME)
     ofn.hWndOwner = hwndOwner
     ofn.lpstrinitialdir =  @(WStr("c:\freebasic"))
     ofn.lpstrFilter = Filter   
     ofn.lpstrFile = pszFile
     ofn.nMaxFile = nMaxFile
     ofn.Flags =   OFN_explorer Or OFN_allowmultiselect     
     Return GetOpenFileName( @ofn )     
End Function
Код-просто пример, проблема внутри функции GetOFN
В режиме поддержки юникода не могу создать строку-фильтр так, чтобы можно было динамически менять расширение файлов для выбора.
Т.е., если строку прописывать сразу - работает, если подставлять переменную - не работает
Что-то похожее описано здесь http://freebasic.justforum.net/t66-topic 
но и решения оттуда не получается прикрутить
В данном конкретном случае возможно проблема в символе "\0", заменял и на "\u0", и на WChr(0) - не работает...


Сообщение отредактировал WQ - Суббота, 08.11.2014, 14:24
 
haavДата: Суббота, 08.11.2014, 19:58 | Сообщение # 4
Генерал-полковник
Группа: Администраторы
Сообщений: 854
Репутация: 34
Статус: Offline
Очень непонятная байда. Сам не понимаю , почему не работает. Сравнивал байты, в обоих случаях разницы нет. То есть все байты один в один, но функция почему не воспринимает фильтр.

В общем , советую задать вопрос здесь: http://www.freebasic.net/forum/viewforum.php?f=6
Или попробовать данную функцию вызывать с обычными строками (String), то есть объявить вручную функцию GetOpenFileName и структуру OPENFILENAME. Что-то типа так:

Код
#define UNICODE

#Include Once "windows.bi"
#Include "win\commdlg.bi"

type OFNA field=1
  lStructSize as DWORD
  hwndOwner as HWND
  hInstance as HINSTANCE
  lpstrFilter as LPCSTR
  lpstrCustomFilter as LPSTR
  nMaxCustFilter as DWORD
  nFilterIndex as DWORD
  lpstrFile as LPSTR
  nMaxFile as DWORD
  lpstrFileTitle as LPSTR
  nMaxFileTitle as DWORD
  lpstrInitialDir as LPCSTR
  lpstrTitle as LPCSTR
  Flags as DWORD
  nFileOffset as WORD
  nFileExtension as WORD
  lpstrDefExt as LPCSTR
  lCustData as DWORD
  lpfnHook as LPOFNHOOKPROC
  lpTemplateName as LPCSTR
end Type

#Undef GetOpenFileName
declare function GetOpenFileName alias "GetOpenFileNameA" (byval as OFNA ptr) as BOOL

Declare Function GetOFN(_
ByVal hwndOwner As HWND, _
ByVal pszfile As ZString Ptr, _
ByVal nMaxFile As Integer) As Integer
'
Dim As Integer OFNerr,OFNres,retlen
Dim As Integer nptr,optr,fidx= -1
Dim As String filename(1000) 'could be dynamic, for redim
Dim As String file=String(2048,0)'fb string, not zstring. 2048000 works in Vista
'Dim SHARED f1(60) As Byte   
Dim Shared Filter(60) As Byte  
OFNres=GetOFN(0,StrPtr(file),Len(file))
'If not 1 then there's an error, if 0 then maybe no file was selected
OFNerr=CommDlgExtendedError() 'convert to hex for MSDN

If OFNres=1 And OFNerr=0 Then
      'truncate your buffer...
      retlen=InStr(file,Chr(0,0))
      file=Left(file,retlen)
      '
      'parse file, seeking/splitting on the NULL separators
      optr=1:nptr=1:fidx= -1
      While optr<retlen
         nptr=InStr(nptr,file,Chr(0))
         If nptr>0 Then
            fidx+=1 'need to check for filename(fidx) overrun
            filename(fidx)=Mid(file,optr,nptr-optr)
            optr=nptr+1
            nptr+=1
         End If
      Wend
      '
Else
      'you have errors or user cancelled action
      Beep:Beep
End If

If fidx>-1 Then
      For t As Integer = 0 To fidx 'first idx(0) is DIRECTORY, or a singular selected file
         Print "IDX: ";Chr(34);filename(t);Chr(34)
      Next
Else
      Print "No files found/selected?" 'either/or
End If
Print:Print "Sleeping..."
Sleep

Function GetOFN( ByVal hwndOwner As HWND, _
      ByVal pszFile As ZString Ptr, _
      ByVal nMaxFile As Integer) As Integer      
            
      Dim f0 As String = "*.mp3"
      Dim f1 As String     
      f1= f0 & Chr(0) & f0 & Chr(0) & Chr(0)
          
      Dim As OFNA ofn      
      ofn.lStructSize = SizeOf(OFNA)
      ofn.hWndOwner = hwndOwner
      ofn.lpstrinitialdir =  StrPtr("c:\freebasic")
      ofn.lpstrFilter =  StrPtr(f1)
      ofn.lpstrFile = pszFile
      ofn.nMaxFile = nMaxFile
      ofn.Flags =   OFN_explorer Or OFN_allowmultiselect      
      Return GetOpenFileName( @ofn )      
End Function


Не знаю правда, как это совместится в твоем большом проекте. Все таки советую задать вопрос на оф. форуме, может есть более элегантное решение.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Суббота, 08.11.2014, 21:17 | Сообщение # 5
Полковник
Группа: Проверенные
Сообщений: 157
Репутация: 5
Статус: Offline
Цитата haav ()
Очень непонятная байда. Сам не понимаю , почему не работает. Сравнивал байты, в обоих случаях разницы нет. То есть все байты один в один, но функция почему не воспринимает фильтр. В общем , советую задать вопрос здесь: http://www.freebasic.net/forum/viewforum.php?f=6

Понятно. Я, к сожалению, плохо знаю английский, но, думаю, вопрос надо задать. За готовый пример спасибо.
В принципе, особой потребности в юникоде при выборе файла нет (пользователи программы пусть сами файлы переименовывают smile ), и сначала я хотел использовать функцию из Window9, но там нет параметра хэндла родительского окна, нашел несколько примеров на WinApi, все настроил, все работало. Дальше потребовалось в одной части кода показать несколько юникодных строк - перевел всю программу на юникод. В итоге вылезают вот такие странности.
Это можно еще обойти, если создать несколько функций с заранее вписанными Wstring-строками, не очень красиво, но понятно. Или можно вывести юникодные части в dll и оттуда вызывать.
В процессе работы с Wstring еще пришлось написать функцию InStr для юникода, и Mid тоже почему-то не работала, а также регулярные выражения PCRE (там все на Zstring). Перешел к варианту обращения к строке как к массиву...
 
Форум » WinAPI » WinApi в freebasic » Вывод символов Unicode (иерглифы и т.п.) (с помощью TextOut, DrawText)
  • Страница 1 из 1
  • 1
Поиск: