Вывод символов Unicode (иерглифы и т.п.)
|
|
WQ | Дата: Четверг, 21.08.2014, 15:31 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Возможно ли выводить через функции TextOut, DrawText специфические символы кирилицы или иероглифы и т.п.?
|
|
| |
haav | Дата: Четверг, 21.08.2014, 17:06 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: 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 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: 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 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: 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 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Цитата haav ( ) Очень непонятная байда. Сам не понимаю , почему не работает. Сравнивал байты, в обоих случаях разницы нет. То есть все байты один в один, но функция почему не воспринимает фильтр. В общем , советую задать вопрос здесь: http://www.freebasic.net/forum/viewforum.php?f=6 Понятно. Я, к сожалению, плохо знаю английский, но, думаю, вопрос надо задать. За готовый пример спасибо. В принципе, особой потребности в юникоде при выборе файла нет (пользователи программы пусть сами файлы переименовывают ), и сначала я хотел использовать функцию из Window9, но там нет параметра хэндла родительского окна, нашел несколько примеров на WinApi, все настроил, все работало. Дальше потребовалось в одной части кода показать несколько юникодных строк - перевел всю программу на юникод. В итоге вылезают вот такие странности. Это можно еще обойти, если создать несколько функций с заранее вписанными Wstring-строками, не очень красиво, но понятно. Или можно вывести юникодные части в dll и оттуда вызывать. В процессе работы с Wstring еще пришлось написать функцию InStr для юникода, и Mid тоже почему-то не работала, а также регулярные выражения PCRE (там все на Zstring). Перешел к варианту обращения к строке как к массиву...
|
|
| |
|