لطفا از ارسال مکرر تقاضا برای پاسخگویی به سوالات جدا پرهیز کنید، ممکن است به هر دلیلی امکان پاسخگویی سریع
به سوال شما میسر نباشد.
پردازش و نمایش کاراکتر های فارسی و glyph ها (اشکال مختلف کاراکتر ها) نیازمند سیستم unicode است که برای هر
کاراکتر دو بایت فضا نیاز دارد (نه یک بایت همانند ansi). و متاسفانه توابع ویژوال بیسیک 6 و نسخه های قبل از آن،
بصورت ترکیبی از unicode و ansi هستند. مثلا رشته های string در ویژوال بیسیک unicode اند ولی کنترل هایی نظیر
textbox بر اساس ansi طراحی شده اند.
اجازه دهید که با یک مثال این مساله را نشان دهم، فرض کنید که بخواهیم کاراکتر ⅓ (کاراکتر 1/3) را که کد unicode آن 8531
ده دهی است را در متغیر text ذخیره کنیم، تابع chrw کد کاراکتر را به رشته تبدیل کرده و بر می گرداند :
کد:
dim text as string
text = [b]chrw[/b](8531)
و با تابع ascw می توانیم کد کاراکتر را مجددا از رشته استخراج کرده و با تابع msgbox اعلام کنیم که به درستی عدد 8531 را
اعلام خواهد کرد :
کد:
dim text as string
text = chrw(8531)
msgbox [b]ascw[/b](text)
تا اینجای کار ویژوال بیسیک کاملا سیستم unicode را پیاده می کند، اما فرض کنیم که یک کنترل textbox داشته باشیم
با نام text1 و بجای متغیر text از این کنترل text1 استفاده کنیم :
کد:
text1 = chrw(8531)
msgbox ascw(text1)
و برخلاف انتظار، بجای عدد 8531، عدد 63 اعلام می شود که کد کاراکتر علامت سوال (?) است و در داخل textbox هم
کاراکتر ? قرار می گیرد. علت این مساله این است که کنترل text1 تنها می تواند کاراکتر های تک بایتی (کد 0 الی 255)
را در خود جای دهد و توانایی نمایش کاراکتری با کد 8531 را ندارد، پس بجای آن کاراکتر ? را درج می کند.
راه حل استفاده از توابع api ویندوز است که مشکل را حل می کنند.
در برنامه ای که نوشتم توابع زیر unicode هستند :
تابع
getcharacterplacementw برای استخراج glyph های کاراکتر ها (حالت های چسبان و غیر چسبان حروف فارسی-عربی)
تابع
exttextoutw برای نمایش glyph ها
تابع
getwindowtextw برای دریافت رشته unicode داخل یک textbox (از مشخصه text کنترل های textbox استفاده نکنید
چون ansi هستند)
تابع
getwindowtextlengthw برای دریافت طول رشته unicode داخل یک textbox
تابع
setwindowtextw برای ارسال یک متن unicde به داخل یک textbox
این توابع api را درون یک ماژول (module) به نام moduleunicode تعریف کردم و برای استفاده ساده تر از آنها توابعی را با
ویژوال بیسیک ایجاد کردم :
تابع
getglyphs مجموعه glyph های یک رشته را درون یک آرایه از نوع integer برمی گرداند، پارامتر hdc بایستی
روی مشخصه hdc یک form یا picturebox یا textbox یا ... تنظیم شود، اینکه در آن کنترل چه فونتی بکار رفته باشد اهمیت
زیادی دارد، زیرا یک کاراکتر ممکن است در دو فونت متفاوت شماره glyph های متفاوتی داشته باشد.
تابع
gettext متن unicde داخل یک textbox را بر می گرداند.
تابع
settext متن unicode داخل یک textbox را به متن دلخواهی تغییر می دهد.
تابع
printglyph یک glyph مشخص را در موقعیت x و y (برحسب pixel) دلخواهی چاپ می کند. پارامتر hdc بایستی
روی مشخصه hdc یک form یا picturebox تنظیم شود، هر فونت و رنگی که در آن فرم یا کنترل فعال باشد برای ترسیم
glyph بکار خواهد رفت. حتما فونتی را بکار ببرید که در هنگام بکارگیری تابع getglyphs بکار برده بودید.
کد کامل برنامه به همراه فایل اجرایی exe ضمیمه این پست می باشد.