۱۳۸۷ اسفند ۱۹, دوشنبه

bitblt

امروز میخوام یکی از توابع معروف رو براتون توضیحش رو بزارم که حال مضاعفی ببریم.توی اکثر جاها اگه بخواید آموزش این تابع رو یادبگیرید با نگاه اول به متن اون آموزش مختون سوت میکشه ولی باید بدونید که یکی از توابع ساده هستش.خب حرف بسه بریم سراغ اصل مطلب.
فرمت تابع bitblt به شکل زیر هستش.
Private Declare Function BitBlt Lib "gdi32.dll" (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 از public استفاده کنید.
حالا به ترتیب توضیحشون میدم.
hDestDC=اچ دی سی (hdc) کنترلی که عکس به اون منتقل میشه.یعنی عکس ما توش کپی میشه.
x=نقطه ی شروع ترسیم(عکس جدید)در راستای افقی.
y=نقطه ی شروع ترسیم(عکس جدید)در راستای عمودی.
nWidth=عرض تصویر جدید.
nHeight=طول تصویر جدید.
hSrcDC=اچ دی سی (hdc) کنترلی که تصویر از اونجا کپی میشه(کنترل مبدع).
xSrc=نقطه ی شروع کپی شدن در راستای افق عکس(کنترل مبدع)
ySrc=نقطه ی شروع کپی شدن عکس در راستای عمود(کنترل مبدع)
dwRop=یک ثابت(constant)که در زیر توضیح داده شده.
تعداد زیادی ثابت وجود داره ولی ما با تابع زیر شروع میکنیم.این تابع عکس رو بدون هیچ دستکاری از کنترل مبدع به کنترل مقصد کپی میکنه.
Private Const SRCCOPY As Long = &HCC0020

در زیر یک نمونه اورده شده است.
  BitBlt Picture2.hDC, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hDC, 0, 0, SRCCOPY

به ثابت روبه رو نگاه کنید.              Public Const MERGEPAINT = &HBB0226
این ثابت به رنگ پس زمینه ی کنترلی که عکس در آن کپی میشود بستگی دارد.
رنگ backcolor کنترل مقصدرو عوض کنید و بعد عکس رو کپی کنید و نتیجه رو ببینید.
ثابتت زیر رنگ عکس کپی شده رو عوض میکنه ولی با backcolor کاری نداره.
Public Const NOTSRCCOPY = &H330008
همون طور که گفتم برای این تابع ثوابت زیادی وجود داره که در زیر لیست شدن.ولی از توضیح دادن همه ی آنها معذورم.البته خودتون راحت میتونید دونه دونه امتحانش کنید.
Public Const BLACKNESS = &H42
Public Const DSTINVERT = &H550009
Public Const MERGECOPY = &HC000CA
Public Const MERGEPAINT = &HBB0226
Public Const NOTSRCCOPY = &H330008
Public Const NOTSRCERASE = &H1100A69
Public Const SRCAND = &H8800C6
Public Const SRCCOPY = &HCC0020
Public Const SRCERASE = &H440328
Public Const SRCINVERT = &H660046
Public Const SRCPAINT = &HEE0086
Public Const WHITENESS = &HFF0062


۱۳۸۷ بهمن ۲۳, چهارشنبه

picture

امروز میخوام کار با عکس ها رو آموزش بدم.این رو هم بگم که این پست خیلی ابتدایی هستش.

شاید تا حالا پیش اومده باشه که بخواید یه عکس رو از یک محل دلخواه توی یک picture box اضافه کنید و کد زیر رو نوشته باشید
picture1.picture=("c:/mypicture")

خوب حتمآ با ارور مواجه شدید.برای بارکردن یک عکس درون یک picture box یا یک image باید از توابع زیر استفاده کنید.

1)برای بارکردن loadpicture
2)برای سیو کردن savepicture


به مثال های زیر نگاه کنید.

picture1.picture=loadpicture(path)
savepicture picture1.picture,path

دستور loadpicture آرگومان های دیگری هم دارد ولی واجب نیستند.

۱۳۸۷ بهمن ۱۰, پنجشنبه

windowfrompoint

در پست قبلی نحوه ی کار با پنجره ها رو توضیح دادم .هم چنین نحوه ی بدست آوردن محل کرسر رو هم آموزش دادم. حالا میخوام یک کد باحال رو آموزش بدم که فقط با استفاده از محل پنجره هندل اون رو به شما بده.خب دو تا مطلب قبلی یا همون پست قبلی رو اینجا استفاده میکنیم بعلاوه ی تابع windowfrompoint .نیازی ه توضیح نداره پس به کد زیر بسنده میکنم.

مواد لازم:1 عدد فرم - 1 عدد تایمر - لیبل(label)به میزان لازم.

()Private Sub Timer1_Time
Dim wnd As Long
Getcursorpos pointapi
(wnd=Windowfrompoint (pointapi.x,pointapi.y
Label1.caption=wnd
End Sub

۱۳۸۷ بهمن ۷, دوشنبه

random files

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

منظور من اینکه میتونید یک تایپ(مثل تایپ توی api ها)مثلآ با اسم phoneb مخفف phonebook تعریف کنید.

این تایپ phoneb شما دو خاصیت به نام های firstname و lastname و phonenumber دارد.

که مثلآ میتونید 1000 تا رکورد روی اون ذخیره کنید.پس به این ترتیب میتونیم یک data base از نوع داده ای خودمون تعریف کنیم.خیلی گیج کننده هست ولی یک بار امتحان کنید دیگه راحت میشه. خوب برای شروع یک پروژه جدید با یک ماژول باز کنید.اول از همه باید تایپ خودمون رو تعریف کنیم پس توی ماژول تایپ خودتون رو تعریف کنید.میتونید از کد پایین به عنوان الگو استفاده کنید.



public type phoneb

firstname as string

lastname as string

phonenumber as string

end type



حتمآ میدونید که در ویژوال بیسیک نمیشه بین اسامی از فضای خالی استفاده کرد.پس سعی کنید از اسامی مخفف استفاده کنید.

هر خاصیت باید یک طول مخصوص داشته باشد.به کد زیر توجه کنید.



public type phoneb
firstname as string *25
lastname as string *25
phonenumber as string *25
end type



همه ی تایپ ها باید به شکل بالا باشند.یعنی طول داشته باشند.مواظب باشید که کاربر نمیتواند بیش از اون چیزی که شما مشخص کردید توی یک تایپ بنویسد.و اگر بنویسد سیو نمی شود.

خب حالا باید یک فایل رو باز کنیدتا بتوانید با استفاده از تایپی که تعریف کردید توی فال بنویسید وسیو کنید.

شما میتوانید یک فایل رو به چند روش باز کنید ولی اینجا ما فایل رو به صورت رندم(random)یا اتفاقی باز میکنیم.

برای این کار از فرمول روبه رو استفاده میکنیم. open path for random as #number len=lenght

دستورات آبی مربوط به خود ویژال بیسیک هستند.و باید نوشته شوند.path(مسیر)مسیری هست که فایل در آنجا قرار دارد.number شماره ی فایل هست که اگر خواستید بتوانید چند فایل با هم باز و بسته بکنید.

len همون طول فایل هست که از شمارش طول prperty های تایپمون به دست میاد.مثلآ در اینجا طول فایل می 75 هست 25+25+25=75

به مثال زیر نگاه کنید.

open "c:\program files" for random as #1

به این ترتیب یک فایل رو باز کردید.یا اگر وجود نداشت به وجود آوردید(آخه وقتی یک فایل رو باز میکنید اگه وجود نداشته باشه اول اون رو به وجود میاره بعد بازش میکنه.)

خب حالا که بازش کردید میتونید توش اطلاعات بنویسید یا از توش بخونید.

قبل از هرکاری یک کار دیگه رو هم باید یاد بگیرید اون هم اینکه چند رکورد توی فایل نوشته شده.

۱۳۸۷ بهمن ۵, شنبه

getcursorpos

برای بدست آوردن محل کرسر ویندوز از تابع getcursorpos استفاده میکنیم.
برای این کار نیاز به یک تایپ داریم به اسم pointapi .
پس توی جنرال برنامه کد زیر رو کپی کنید.

Private Type POINAPI
x as integer
y as integer
End Type
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
dim POINTAPI as POINTAPI

حالا یک تایمر بزارید و توی روالش کد زیر رو بنویسید.(اول interval اون رو 100 بکنید)

getcursorpos POINTAPI
text1.text=POINTAPI.x
text2.text=POINTAPI.y

یادم رفت که بگم دوتا textbox هم بزارید.

۱۳۸۷ دی ۲۹, یکشنبه

windows

بحث پنجره ها مبحث بزرگی است.

برای شروع یک توزیح کلی میدم.

هر چیز در ویندوز یک پنجذه هست. هر پنجره یک هندل(handle) یا دستگیره دارد . هندل ها همیشه long هستند و متغیری که یک هندل به ان نسبت داده میشود باید از نوع long تعریف شده باشد.بریم سراغ اصل مطلب.



برای گرفتن هندل یک پنجره از تابعی به نام findwindow استفاده میکنیم.(چند تا دیگه هم هستن)

یاد گرفتن این تابع خیلی آسونه.این تابع از شما دو چیز میخواهد

1-نام پنجره

2-نام کلاس پنجره

شما باید فقت یکی رو پر کنید و در دیگری بنویسید VbNullString به مثال پایین نگاه کنید



findwindow(VbNullString,"visualbasic")

پس به روش زیر میتوان هندل یک پنجره رو گرفت.

dim a as long
a=findwindow(vbnullstring,windowname)

حالا با استفاده از تابع showwindow میشه پنجره رو دستکاری کرد.
این تابع هم ساده هست.چون فقت ندل پنجره و فلگ کاری که میخواد بکنه رو نیاز داره. فلگ هارو در زیر اوردم.
sw_show نمایش پنجره
sw_hide پنهان کردن پنجره
sw_maximize بزرگ کردن صفحه
sw_minimize کوچک کردن صفحه
این یکی جداّ نیاز به توزیح نداره ولی توزیح میدم واسه اوش گ...ها.

dim wnd as long
wnd=findwindow(vbnullstring)
showwindow wnd,sw_hide
به این ترتیب یک پنجره رو مخفی میکنیم.دقت داشته باشید که پنجره مخفی(hide)میشه.

۱۳۸۷ آذر ۲۹, جمعه

windows colors

خب حالا میخواهیم یکمی سیستم رنگ بندی کامپیوتر رو دست کاری کنیم.
برای این کار از یک api به نام setsyscolors استفاده میکنیم.
خیلی کارساده ای هست فقت باید نام یک فلگ و یک عدد از نوع long که همان رنگ هست رو بهش بدین.

Private Declare Function SetSysColors Lib "user32.dll" (ByVal nChanges As Long,_ ByRef lpSysColor As Long, ByRef lpColorValues As Long) As Long

و فلگ هاش هم در زیر اومده.

private Const COLOR_3DDKSHADOW As Long = 21
private Const COLOR_3DLIGHT As Long = 22
private Const COLOR_ACTIVEBORDER As Long = 10
private Const COLOR_ACTIVECAPTION As Long = 2
private Const COLOR_BACKGROUND As Long = 1
private Const COLOR_BTNSHADOW As Long = 16
private Const COLOR_BTNTEXT As Long = 18
private Const COLOR_CAPTIONTEXT As Long = 9
private Const COLOR_HIGHLIGHT As Long = 13
private Const COLOR_HIGHLIGHTTEXT As Long = 14
private Const COLOR_HOTLIGHT As Long = 26
private Const COLOR_MENU As Long = 4
private Const COLOR_MENUTEXT As Long = 7
private Const COLOR_SCHEMES As Long = 715
private Const COLOR_SCROLLBAR As Long = 0
private Const COLOR_WINDOW As Long = 5
private Const COLOR_WINDOWFRAME As Long = 6
private Const COLOR_WINDOWTEXT As Long = 8

توضیح دادن اینکه هرکدام از اینها چا کار میکنند کار سختی پس خودتون دونه دونه امتحانشون کنید.
(getsystemcolors(flag
دستور بالا هم رنگ کلمپوتر رو میگیرد

Input Output

خب خیلی جاها من دیدم که گفتن نمیشه با ویژوال بیسیک ورودی خروجی هارو کنترل کرد. در صورتی که این حرف کاملآ اشتباه هست. ویژوال بیسیک قابلیت کنت...