PDA

View Full Version : آموزش: MsgBox کاملا فارسی



reza_edu
سه شنبه 07 دی 1389, 01:50 صبح
سلام خدمت دوستان گرامی من تو برنامه ام نیاز به یک msgbox کاملا فارسی داشتم برای همین گشتم تا یه نمونه کد پیدا کنم اما هر چه گشتم نمونه کدی تو ویبی داتنت نبود اکثرا برای ویبی 6 بود برای همین سراغ تاپیک های کشور های دیگه رفتم تا بلاخره به نتیجه رسیدم حالا من هم همون کد رو با یه تغیر نام کوچیک بعنوان کلاس PersianMsgbox گذاشتم تا دیگران هم ازش استفاده کنن امید وارم که مفید باشه .

به دوستان حرفه ای بر نخوره .


Imports System.Text
Imports System.Runtime.InteropServices


تو باتن این کد رو بنویسید:

Dim MsgFarsi As MsgBoxStyle = MsgBoxStyle.MsgBoxRight Or MsgBoxStyle.YesNo
PersianMsgbox.PatchMsgBox(New String() {"تأييد", "انصراف"})
MsgBox("آيا قبلا از اين کلاس اطلاع داشتيد؟", MsgFarsi, "سؤال")
این کلاسم اضافه کنید:


Public Class PersianMsgbox
Private Shared mLabels() As String '' Desired new labels
Private Shared mLabelIndex As Integer '' Next caption to update

Public Shared Sub PatchMsgBox(ByVal labels() As String)
''--- Updates message box buttons
mLabels = labels
Application.OpenForms(0).BeginInvoke(New FindWindowDelegate(AddressOf FindMsgBox), GetCurrentThreadId())
End Sub

Private Shared Sub FindMsgBox(ByVal tid As Integer)
''--- Enumerate the windows owned by the UI thread
EnumThreadWindows(tid, AddressOf EnumWindow, IntPtr.Zero)
End Sub

Private Shared Function EnumWindow(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
''--- Is this the message box?
Dim sb As New StringBuilder(256)
GetClassName(hWnd, sb, sb.Capacity)
If sb.ToString() <> "#32770" Then Return True
''--- Got it, now find the buttons
mLabelIndex = 0
EnumChildWindows(hWnd, AddressOf FindButtons, IntPtr.Zero)
Return False
End Function

Private Shared Function FindButtons(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Dim sb As New StringBuilder(256)
GetClassName(hWnd, sb, sb.Capacity)
If sb.ToString() = "Button" And mLabelIndex <= UBound(mLabels) Then
''--- Got one, update text
SetWindowText(hWnd, mLabels(mLabelIndex))
mLabelIndex += 1
End If
Return True
End Function

''--- P/Invoke declarations
Private Delegate Sub FindWindowDelegate(ByVal tid As Integer)
Private Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumThreadWindows Lib "user32.dll" (ByVal tid As Integer, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumChildWindows Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function GetClassName Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal name As StringBuilder, ByVal maxlen As Integer) As Integer
Private Declare Auto Function GetCurrentThreadId Lib "kernel32.dll" () As Integer
Private Declare Auto Function SetWindowText Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal text As String) As Boolean
End Class

لطفا تو نظر سنجی شرکت کنید تا بدونم این کد چقدر مفید بود. با تشکر:خجالت:

reza_edu
چهارشنبه 08 دی 1389, 22:23 عصر
سلام از مدیران تالار پوزش میخوام ک این مطلی نا مفید و غیره ضروری رو دوباره بالا کشیدم دو دلیل داشت:
1.از دوستانی که تو نظر سنیج شرکت کردن تشکر کنم حداقل ارزش قائل شدن همون دو نفر از 70 نفر که تاپیک رو دیدن و از اون دوستانیکه تشکر کردن.
2.یه سوال برام پیش اومد اگه این مطلب اینقدر سطح پائین بود دوستان برنامه نویس ما قبلا از چه کدی برای فارسی کردن متن خودشون استفاده میکردن؟ بابا بزارید تا دیگران هم بتونن استفاده کنن نگهداشتن این اطلاعات که باعث پیشرفت نمیشه(یا میشه و من خبر ندارم!) اگرم که بشه من حاضر نیستم بخاطر پیشرفت چیزی رو پنهون کنم یا نگم البته من میدونم که همه دوستانی که تو این فرام عضو هستن اینجور آدمائی نیستن و تروخدا یدفه بکسی برنخوره خلاصه کنم نمونه کد دارید بزارید دیگه بزارید دیگران هم استفاده کنن امیدوارم این مطالبم باعث نشه تا مدیران تصمیم به حذف این تاپیک کنن از تموم دوستانی هم که آموزش میدن یه مشکل دیگران رو حل میکنن تشکر میکنم.

mabbaszadegan
چهارشنبه 08 دی 1389, 22:31 عصر
سلام دوستان
من خوب بیشتر تو c# فعالم و معذرت میخوام که وارد بحثتون میشم !
ولی خواستم از بابت این تاپیک تشکر کنم ، چون واقعن برای من یکی که مفید بود :بوس:

omid-vbAuto
چهارشنبه 08 دی 1389, 22:53 عصر
سلام از مدیران تالار پوزش میخوام ک این مطلی نا مفید و غیره ضروری رو دوباره بالا کشیدم دو دلیل داشت:
1.از دوستانی که تو نظر سنیج شرکت کردن تشکر کنم حداقل ارزش قائل شدن همون دو نفر از 70 نفر که تاپیک رو دیدن و از اون دوستانیکه تشکر کردن.
2.یه سوال برام پیش اومد اگه این مطلب اینقدر سطح پائین بود دوستان برنامه نویس ما قبلا از چه کدی برای فارسی کردن متن خودشون استفاده میکردن؟ بابا بزارید تا دیگران هم بتونن استفاده کنن نگهداشتن این اطلاعات که باعث پیشرفت نمیشه(یا میشه و من خبر ندارم!) اگرم که بشه من حاضر نیستم بخاطر پیشرفت چیزی رو پنهون کنم یا نگم البته من میدونم که همه دوستانی که تو این فرام عضو هستن اینجور آدمائی نیستن و تروخدا یدفه بکسی برنخوره خلاصه کنم نمونه کد دارید بزارید دیگه بزارید دیگران هم استفاده کنن امیدوارم این مطالبم باعث نشه تا مدیران تصمیم به حذف این تاپیک کنن از تموم دوستانی هم که آموزش میدن یه مشکل دیگران رو حل میکنن تشکر میکنم.


دوست عزیز کاری که انجام دادین زیاد ضروری هم نیست،چون بدون تعریف این کلاس میشه این کارهارو کرد.

chasbonakam
چهارشنبه 08 دی 1389, 23:09 عصر
دوست عزیز کاری که انجام دادین زیاد ضروری هم نیست،چون بدون تعریف این کلاس میشه این کارهارو کرد.

می شه بگید چه طوری؟

mansourii
چهارشنبه 08 دی 1389, 23:11 عصر
با اجازتون من یک نمونه میذارم که کاملا جا بیافته


:لبخندساده:

omid-vbAuto
چهارشنبه 08 دی 1389, 23:18 عصر
می شه بگید چه طوری؟

خوب حالشو ببر :لبخند:

chasbonakam
چهارشنبه 08 دی 1389, 23:21 عصر
سلام
واقعا از این همه نبوغ شما حیرت زده شدم.

لطفا به جای ok بنویسه "بله"

به جای cancel بنویسه "لغو"

Reza,M
چهارشنبه 08 دی 1389, 23:26 عصر
با سلام
حالا كه بحث MessageBox شده يه سوال برام پيش اومد!
آيا ميشه فونت و يا سبك نوشته هاي MessageBox را تغيير داد مثلا Bold كرد ؟

omid-vbAuto
چهارشنبه 08 دی 1389, 23:29 عصر
سلام
واقعا از این همه نبوغ شما حیرت زده شدم.

لطفا به جای ok بنویسه "بله"

به جای cancel بنویسه "لغو"

بایدم حیرت زده بشید.

اگرم مشکلتون OK برات کداشو حل میکنم.دادش:قهقهه:

pouyansaraf
پنج شنبه 09 دی 1389, 00:58 صبح
بخاطر خوردن انار زیاده :شیطان:

از سواد من بالاتر بود ولی در مورد ظاهرش
Msgbox() خوبی بود خروجی Yes و NO هم برمیگردوند ولی ظاهرش یخورده استاندارد تر کنید
به نظر من چون Title فرم راست هست نوشته را چپ بگذار و یا برعکس مانند مال آقای mansourii ،قشنگ تر به نظر میرسه

در هر صورت بدرد میخوره

موفق باشید.

Alghoochi
پنج شنبه 09 دی 1389, 08:36 صبح
سلام خدمت دوستان گرامی من تو برنامه ام نیاز به یک msgbox کاملا فارسی داشتم برای همین گشتم تا یه نمونه کد پیدا کنم اما هر چه گشتم نمونه کدی تو ویبی داتنت نبود اکثرا برای ویبی 6 بود برای همین سراغ تاپیک های کشور های دیگه رفتم تا بلاخره به نتیجه رسیدم حالا من هم همون کد رو با یه تغیر نام کوچیک بعنوان کلاس PersianMsgbox گذاشتم تا دیگران هم ازش استفاده کنن امید وارم که مفید باشه .

به دوستان حرفه ای بر نخوره .


Imports System.Text
Imports System.Runtime.InteropServices


تو باتن این کد رو بنویسید:

Dim MsgFarsi As MsgBoxStyle = MsgBoxStyle.MsgBoxRight Or MsgBoxStyle.YesNo
PersianMsgbox.PatchMsgBox(New String() {"تأييد", "انصراف"})
MsgBox("آيا قبلا از اين کلاس اطلاع داشتيد؟", MsgFarsi, "سؤال")
این کلاسم اضافه کنید:


Public Class PersianMsgbox
Private Shared mLabels() As String '' Desired new labels
Private Shared mLabelIndex As Integer '' Next caption to update

Public Shared Sub PatchMsgBox(ByVal labels() As String)
''--- Updates message box buttons
mLabels = labels
Application.OpenForms(0).BeginInvoke(New FindWindowDelegate(AddressOf FindMsgBox), GetCurrentThreadId())
End Sub

Private Shared Sub FindMsgBox(ByVal tid As Integer)
''--- Enumerate the windows owned by the UI thread
EnumThreadWindows(tid, AddressOf EnumWindow, IntPtr.Zero)
End Sub

Private Shared Function EnumWindow(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
''--- Is this the message box?
Dim sb As New StringBuilder(256)
GetClassName(hWnd, sb, sb.Capacity)
If sb.ToString() <> "#32770" Then Return True
''--- Got it, now find the buttons
mLabelIndex = 0
EnumChildWindows(hWnd, AddressOf FindButtons, IntPtr.Zero)
Return False
End Function

Private Shared Function FindButtons(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Dim sb As New StringBuilder(256)
GetClassName(hWnd, sb, sb.Capacity)
If sb.ToString() = "Button" And mLabelIndex <= UBound(mLabels) Then
''--- Got one, update text
SetWindowText(hWnd, mLabels(mLabelIndex))
mLabelIndex += 1
End If
Return True
End Function

''--- P/Invoke declarations
Private Delegate Sub FindWindowDelegate(ByVal tid As Integer)
Private Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumThreadWindows Lib "user32.dll" (ByVal tid As Integer, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumChildWindows Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function GetClassName Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal name As StringBuilder, ByVal maxlen As Integer) As Integer
Private Declare Auto Function GetCurrentThreadId Lib "kernel32.dll" () As Integer
Private Declare Auto Function SetWindowText Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal text As String) As Boolean
End Class

لطفا تو نظر سنجی شرکت کنید تا بدونم این کد چقدر مفید بود. با تشکر:خجالت:

کلاس خوبی نوشتید. بسیار کاربردیه ولی چند پیشنهاد برای بهتر شدن کارتون. اگه می تونید فونت متن و دکمه ها رو به tahoma تغییر بدید. این فونت برای متون فارسی بسیار مناسب تره.
اگر امکان سفارشی کردن آیکون ها و صدا ها رو هم داشته باشه که دیگه عالی میشه.

Alghoochi
پنج شنبه 09 دی 1389, 08:42 صبح
با اجازتون من یک نمونه میذارم که کاملا جا بیافته


:لبخندساده:

دوست عزیز شما از یک فرم جدید جهت نمایش پیغام استفاده کردید ولی دوستمون chasbonakam روی مسیج باکس های خود سیستم کار کردند.

chasbonakam
پنج شنبه 09 دی 1389, 10:30 صبح
سلام

دوست عزیز
اقای omid-vbAuto (http://barnamenevis.org/member.php?120835-omid-vbAuto) رو messagebox سیستم کار کردند.

reza_edu
پنج شنبه 09 دی 1389, 10:44 صبح
سلام باشه باکمی تغیر بهتر میکنم تغییر آیکون سیستم که کاری نداره ولی چشب فونت هم حتما، برمیگردم.

reza_edu
پنج شنبه 09 دی 1389, 21:53 عصر
سلام من برنامه دوستانی که زحمت کشیدن و نمونه کد قرار دادن رو هم دیدم از دوستان هم تشکر میکنم حقیقت هدف من این بود تا هر کدوم از دوستان نمونه کدی در رابطه با این موضوع داشتن تو این تاپیک قرار بدن تا با کد های مختلف آشنا بشیم و دوستانه دیگه که این تاپیک رو نگاه میکنن خودشون انتخاب کنن که دوست دارن از چه روشی استفاده کنن مهم اینکه بهترین کدها قرار بگیره و ما سعی کنیم دیگران رو از روش های مختلف آگاه کنیم همین هدف من بود اگرهم مطلبم کم اهمیت بود یا چیزی گفتم که به دوستان برخورد من از همه دوستان عذر خواهی میکنم. امید وارم بهتر بشه و بتونم فرصت کنم تا تغییرات دیگه بشه تو مسیج باکس قرارداد.

Reza,M
شنبه 11 دی 1389, 23:49 عصر
با سلام دوباره
آخرش ما متوجه نشديم كه آيا ميشه فونت و يا سبك متن نوشته هاي MessageBox را تغيير داد يا نه ! مثلا Bold كرد ؟

reza_edu
سه شنبه 14 دی 1389, 11:58 صبح
سلام بله میشه تغیر داد تو web با asp جواب داده اما تو اپلیکیشن هنوز تست نشده اونم به احتمال زیاد میشه فقط ببخشید سرم یکم شلوغه حتما میزارم .:لبخندساده:

y.saied
جمعه 27 بهمن 1391, 22:50 عصر
سلام
همچنان منتظریم دوست عزیز




سلام بله میشه تغیر داد تو web با asp جواب داده اما تو اپلیکیشن هنوز تست نشده اونم به احتمال زیاد میشه فقط ببخشید سرم یکم شلوغه حتما میزارم .:لبخندساده: