بحث کاربر:Mostafa70

از ویکی‌پدیا، دانشنامهٔ آزاد.

[ویرایش] خوش آمدید


سلام Mostafa70، به ویکی‌پدیا خوش آمدید. از مشارکت شما سپاسگزارم. امیدوارم که از اینجا خوشتان بیاید و تصمیم به ماندن بگیرید. پیوندهای زیر برای کاربرهای جدید مفیدند:

امیدوارم از ویکی‌پدیانویس بودن لذت ببرید! لطفاً برای آزمایش از ویکی‌پدیا:گودال ماسه‌بازی استفاده کنید و (فقط) در صفحات بحث نام خود را با چهار علامت مدک امضا کنید، (~~~~)، با این کار نام شما و تاریخ به عنوان امضا درج خواهد شد. در صورتی که سوال داشتید، به صفحهٔ ویکی‌پدیا:میز کمک بروید، یا اینکه از من در صفحهٔ بحثم بپرسید. باز هم خوش آمد می‌گویم.
مصطفی/بحث ۰۶:۵۳، ۱۳ اوت ۲۰۰۷ (UTC)

[ویرایش] كار با API هادر ويژوال بيسيك

سلام.
مقاله این هفته در مورد کار با API ها در ویژوال بیسیک می باشد.امید وارم بتونم این بحث رو در 3 هفته تموم کنم.
ویندوز دارای توابعی است که به زبان C نوشته شده اند. این توابع در DLL های ویندوز قرار دارند وبه آنها Windows API می گویند.برای استفاده از این توابع ابتدا باید آنها را تعریف کنیم که این تعریف شامل نام تابع،آرگومانهای آن و نام DLL ای که تابع در آنقرار دارد است.
برای مثال تعریف یکی از API های ویندوز که نام آن sndPlaySound است و در winmm.dll قرار دارد در زیر آمده است:

Private Declare Function sndPlaySound Lib "winmm.dll" Alias_ "sndPlaySoundA"(ByVal lpszSoundName As String, ByVal uFlags As Long) As_ Long

اگر فکر می کنید طولانی و گیج کننده است به BitBlt نگاه کنید(فلفل نبین چه ریزه!)

Public Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

یا این یکی:

Public Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As_ Long,: ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight_ As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long,ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

خوشبختانه نیازی به حفظ کردن اینها نیست. به منوی Add-ins\Add in manager… بروید و مانند شکل برای VB6API Viewer گزینه های loaded و LoadOnStartup را انتخاب کنید.به همون منو برگردید :و گزینه اضافه شده API Viewer آن را اجرا کنید .
در این قسمت فایل Win32API.dll را load کنید.
حالادر combo عبارت Declares را انتخاب کنید

و روی یکی از API های زیر آن دبل کلیک کنید تا تعریف آن را ببینید.

مقدمه چینی کافیه. تعریف sndPlayerSound و ثابت

SND_ASYNC را به بخش declares در فرم خودتون اضافه کنید.(دقت کنید تعریف تابع در فرم باید با Private باشد)

Private Declare Function sndPlaySound Lib "winmm.dll" Alias_ ndPlaySoundA"(ByVal: lpszSoundName As String, ByVal uFlags As Long) As Long Private Const SND_ASYNC = &H1 ' play asynchronously

Private Sub Command1_Click()
sndPlaySound "c:\windows\media\chimes.wav", SND_ASYNC
End Sub
اگر آدرس فایل درست باشد فایل پخش می شود. برای ÷ایان دادن می تونین تابع رو با فضای خالی صدا کنید.البته برین تو MSDN و یه سری تابع برای تمرین ازش پیدا کنید چون واقعا در یادگیری موثره.
Restart کردنWindows
هر کاری که خود ویندوز می تونه انجام بده شما هم می تونید با API ها انجام بدید.یکی هم Restart کردن:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long,

ByVal dwReserved As Long) As Long

Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Sub Command1_Click()
ExitWindowsEx EWX_REBOOT + EWX_FORCE, 0
End Sub
پارامتر اول کاری است که باید انجام شود. Shutdown,Reboot(restart) یا logoff و هرکدام از آنها که باewx_force جمع شوند به نوع اجباری آن عمل تبدیل میشود.
HWnd :
هندل،هر شیئی در ویندوز با یک عدد منحصر به فرد شناخته می شود . این عدد مانند نام آن شی است و برای صدا کردن شی بوسیله API ها به اینها نیاز داریم.اگر شی در برنامه خودتون باشه می تونید باobjct.hwnd هندل اونو بگیرید.
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long,

ByVal fEnable As Long) As Long

Private Sub Command1_Click()
EnableWindow Text1.hwnd, False
End Sub
:با EnableWindow میتونید یک window رو فعال یا غیرفعال کنید.اینو بدونید که در windows همه چیز یه window بشمار میاد حتی یک textbox.
برای بدست آوردن هندل یک window که در برنامه خودتون نیست چند راه وجود دارد که یکیش اینه:

Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long,

ByVal fEnable As Long) As Long

Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long,

ByVal yPoint As Long) As Long
Private Sub Command1_Click()
Dim ret As Long

ret = WindowFromPoint(0, 0)

EnableWindow ret, False
End Sub
این API یه مختصات می کیره و هندل ÷نجره ای را که الان در آن مختصات است بر می گرداند.(شاید نتیجه آزمایش برایتان دردسر ساز باشد!)
گرفتن مختصات موس در صفحه:

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As

Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Timer1_Timer()
Dim pt As POINTAPI
GetCursorPos pt
Label1.Caption = pt.x
Label2.Caption = pt.y
End Sub
خب مطلب این هفته اینجا تموم می شه ولی هته دیگه حتما حتما حتما .... بیاین که می خوام یکی از کارهای هیجان انگیز در windows رو واستون بیارم.
گرفتن متن یک Window :
این کار یکی از هیجان انگیز ترین کار هایی است که می توان در Windows انجام داد.
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long,

ByVal yPoint As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal

hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function SendMessageString Lib "user32" Alias "SendMessageA"

(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long

Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Type POINTAPI
x As Long
y As Long
End Type
Private Function GetText(wnd As Long) As String
Dim buf As String, l As Long
l = SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0)
buf = Space(l)
SendMessageString wnd, WM_GETTEXT, l + 1, buf
GetText = buf
End Function
Private Sub Command1_Click()
Timer1.Enabled = Not Timer1.Enabled
End Sub
Private Sub Timer1_Timer()
Dim pt As POINTAPI, wnd As Long
GetCursorPos pt
wnd = WindowFromPoint(pt.x, pt.y)
Label1.Caption = GetText(wnd)
End Sub
شاید بد نباشه که روی پنجره DialUp Networking خودتون این برنامه رو امتحان کنید.
توضیح تابع GetText :
اولین sendmessage طول متن این هندل را برمیگرداند.
دستور space یک آرگومان میگیره و رشته ای با اون تعداد space برمی گردونه.
دومین sendmessage که در حقیقت با نام دیگه ای از همون تابعه اما آرگئمان سوم اون طول رشته است و به همین دلیل یکی بیشتر از طول واقعیه که در C کاراکتر آخر رشته کد اسکی Null است . و ما نمی خوام این کاراکتر در رشته ما باشه.

HDD:
در حقیقت صفحه نقاشی تو ویندوزه.اگر جایی گرافیک هست ، DC هم هست. برای گرفتن HDC از تابع GetDC(Hwnd) استفاده می کنیم تا dc یک wnd رو بگیریم.
برنامه عکس گرفتن از صفحه:
یک PictureBox در مختصات 0,0 از فرم خودتان قرار دهید،BorderStyle فرم و Picture رو برابر 0 کنید و windowstate در فرم رو برابر با maximized کنید.
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As

Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Const SRCCOPY = &HCC0020 ' (DWORD) dest = source
Private Sub Form_Load()
Dim wnd As Long, dc As Long
Picture1.AutoRedraw = True
wnd = GetDesktopWindow
dc = GetDC(wnd)
Form_Resize
BitBlt Picture1.hdc, 0, 0, Screen.Width / 15, Screen.Height / 15, dc, 0, 0,
SRCCOPY
End Sub
Private Sub Form_Resize()
Picture1.Move 0, 0, Screen.Width, Screen.Height
End Sub
Private Sub Picture1_Click()
SavePicture Picture1.Image, "c:\test.bmp"
Unload Me
End Sub
تابع bitblt تصویر روی یک dc رو روی یک dc دیگر رسم می کند.

تغییر دادن شکل فرم:
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long,

ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim rgn As Long
rgn = CreateEllipticRgn(0, 0, Me.Width / 15, Me.Height / 15)
SetWindowRgn Me.hWnd, rgn, True
End Sub
تابع CreateEllipticRgn یک محدوده بیضی شکل تعریف میکند و SetWindowRng اون محدوده رو در یک window تاثیر می دهد. در باره API های زیر تحقیق کنید.
CreatePolygonRgn
CreateRoundRectRgn
CombineRgn

فایل های INI:
فایلهای ini نوع خاصی از فایل های متنی هستند که بیشتر برای ذخیره کردن تنظیمات برنامه بکار می روند. و برای تقویت کردن حافظه برنامه بسیار موثرند.
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias

"WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias

"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private iLeft As Integer, iTop As Integer
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim buf As String
buf = Space(255)
GetPrivateProfileString "myAPP", "Left", "10", buf, 255, "testini.ini"
iLeft = CInt(Left(Trim(buf), Len(Trim(buf)) - 1))
buf = Space(255)
GetPrivateProfileString "myAPP", "Top", "10", buf, 255, "testini.ini"
iTop = CInt(Left(Trim(buf), Len(Trim(buf)) - 1))
Me.Move iLeft, iTop
End Sub
Private Sub Form_Unload(Cancel As Integer)
WritePrivateProfileString "myAPP", "Left", CStr(Me.Left), "testini.ini"
WritePrivateProfileString "myAPP", "Top", CStr(Me.Top), "testini.ini"
End Sub
اگر در قسمت filename آدرس را تعیین نکنید فایل ini در دایرکتوری windows ذخیره می شود.
از وقتی که ویندوز 95 وارد بازار شد فایک های ini کمرنگ تر شدند و جای خودشونو به رجیستری دادن. برای کار با رجیستری میتوانید از دستورات vb یا از API ها استفاده کنید.ما اینجا به دستورات vb اکتفا می کنیم.
Private Sub Form_Load()
Me.Left = CInt(GetSetting("myAPP", "Position", "Left", 10))
Me.Top = CInt(GetSetting("myAPP", "Position", "Top", 10))
End Sub
Private Sub Form_Unload(Cancel As Integer)
SaveSetting "myAPP", "Position", "Left", Me.Left
SaveSetting "myAPP", "Position", "Top", Me.Top
End Sub
کار با این دستورات بسیار راحته ولی در همه جای رجیستری کاربرد ندارد.من توصیه می کنم که شما از API ها استفاده کنید.(با کمک MSDN).
سایت http://www.allapi.net/ هم یک برنامه مفید داره که در اون برای اکثر توابع ویندوز مثال و توضیح داره.
پایان مقاله

--Mostafa70 ۰۵:۵۱، ۲۰ اوت ۲۰۰۷ (UTC)