بحث کاربر: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)

