برگزیده های پرشین تولز

نمونه برنامه های VB6 -آموزش از روی مثال

parscyber

Registered User
تاریخ عضویت
18 سپتامبر 2004
نوشته‌ها
1,170
لایک‌ها
16
سن
34
همون طوری که میدونید شاید هم نمیدونید من خیلی به VB.NET علاقه مندم. تا پارسال هم باهاش خیلی برنامه مینوشتم. خیلی هم تا حالا جون کنده ام بیام یه چیزی به بقیه یاد بدم. اما متاسفانه انتقال من خیلی خیلی ضعیفه.
دمت گرم که بازم این جا رو راه انداختی!
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
به نقل از parscyber :
همون طوری که میدونید شاید هم نمیدونید من خیلی به VB.NET علاقه مندم. تا پارسال هم باهاش خیلی برنامه مینوشتم. خیلی هم تا حالا جون کنده ام بیام یه چیزی به بقیه یاد بدم. اما متاسفانه انتقال من خیلی خیلی ضعیفه.
دمت گرم که بازم این جا رو راه انداختی!
امیدوارم شما هم از تجربیاتتون ما رو بی نصیب نگذارید. من خودم هم مثل شما هستم. شاید یکی از این پستهایی که میبینید رو 5 ساعت فکر کردم تا تونستم بنویسم!

من یکم سرم شلوغ شده در اولین فرصت تاپیک رو ادامه میدم...
 

Electronics Art

کاربر فعال برق و الکترونیک
کاربر فعال
تاریخ عضویت
9 جولای 2005
نوشته‌ها
1,374
لایک‌ها
18
ممنون بلا بلا جان :)
من درسته كه اول كارم ولي بازم ازت تشكر مي كنم :)
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
42
محل سکونت
Iran
ممنون. من که خیلی وقته زیاد فرصت ندارم که به اینجا سر بزنم . حالا شما ها هستید و خیلی خوبه من دیگه خیالم راحته!!

یاد قدیما میفتم که اینجا مگس میپروندم! :)
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
یواش یواش این دفترچه هم به پایان برسونیم که حکایت همچنان باقیست!
شایان به نکته خوبی اشاره کرد، موقع ذخیره کردن و یا بستن برنامه باید کنترلی داشته باشیم که آیا متن تغییر کرده و اگر تغییر کرده امکان ذخیرش رو بدیم.

خب مثل همیشه یک کپی از فولدر پروژه قبل میگیریم، به نام MyNotes0.4 و پروژه رو باز میکنیم.

ما میخوایم بدونیم که اگر تغییری در متن بوجود اومده، حتما امکان ذخیره تغییرات قبل از خروج از برنامه باشه و گرنه ممکن هست که اطلاعات از بین بره.

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

با ترکیب های مختلف بیت ماسک ها اینها رو کنترل میکنیم.

اول یک شمارنده در قسمت جنرال میسازیم که شامل بیت ماسکهای ما هست:
کد:
[FONT=Tahoma]Enum enumTextStatus[/FONT]
[FONT=Tahoma]NoChange = &H0[/FONT]
[FONT=Tahoma]TextChanged = &H2[/FONT]
[FONT=Tahoma]TextSaved = &H4[/FONT]
[FONT=Tahoma]End Enum[/FONT]
بیت ماسک اول بنام NoChange وقتی هست که ما هیچ تغییری نداریم. مثلا هنگام متن جدید یا باز کردن یک متن یا درست بعد از ذخیره متن.
بیت ماسک دوم بنام TextChanged وقتی هست که کوچکترین تغییری در متن بوجود میاد.
بیت ماسک سوم بنام TextSaved وقتی هست که متن ما حداقل یکبار در دیسک ذخیره شده پس حتما یک نام برای خودش داره.

خب، اینها رو هم به جنرال اضافه میکنیم:
کد:
[FONT=Tahoma]Dim lastFilename As String[/FONT]
[FONT=Tahoma]Dim TextStatus As enumTextStatus[/FONT]
یک متغییر که اسم فایل رو نگه داره و یک متغییر که بیت ماسک ها مون رو کنترل کنیم.

بیت ماسک ها رو در موقع لزوم اضافه و یا حذف میکنیم. ما می تونیم بیت ماسک ها رو با عملیات منطقی تنظیم کنیم. میتونم اونها رو or ، and و یا xor کنیم.

اگر ما بخواهیم بگیم که تغییر کرده "یا" ذخیره شده:
کد:
[FONT=Tahoma]TextStatus= TextChanged or TextSaved[/FONT]

و اقسام احتمال های مختلف که در این برنامه البته خیلی کم هستند. فقط این رو بدونیم که برای اضافه کردن یک احتمال/بیت ماسک به یک متغییر اون رو or میکنیم:
کد:
[FONT=Tahoma]TextStatus= TextChanged[/FONT]
[FONT=Tahoma]TextStatus= TextStatus OR TextSaved[/FONT]
برای پاک کردن از یک متغییر، برای مثال اگر مقدار متغییر زیر برابر دستور بالا باشه. یعنی هم TextChanged و هم TextSaved باشه و بخواهیم TextSaved رو از متغییر پاک کنیم، یعنی مقدارش فقط TextChanged بشه:
کد:
[FONT=Tahoma]TextStatus= TextStatus AND NOT(TextSaved)[/FONT]
و موقع چک کردن وجود یک بیت ماسک در یک متغییر مثالا در شرطها، از and استفاده میکنیم:
کد:
[FONT=Tahoma]If TextStatus AND TextSaved Then[/FONT]
[FONT=Tahoma]…[/FONT]
یعنی اگر TextSavedی وجود داشت سپس...

و یک نکته مهم این هست در تعریف بیت ماسکها باید بیت ماسک بعدی حداقل دو برابر از قبلی باشه. یعنی اگر در مبنای هگزادسیمال تعریف میکنیم:
&H0, &H1, &H2, &H4, &H8, &H10, &H20,…
که البته &H0 یک استثنا هستش، ولی خب چون میخواهیم and و or بکنیم، باید در انتها حداقل یک بیت تفاوت بین هر حالت باشه.

خب، بر میگردیم به برنامه و استفاده عملی از بیت ماسک ها:

ساب mnuNew رو به این صورت تغییر میدیم:
کد:
[FONT=Tahoma]Private Sub mnuNew_Click[/FONT][FONT=Tahoma]()[/FONT]
[FONT=Tahoma]If TextStatus And TextChanged Then[/FONT]
[FONT=Tahoma]Dim res As VbMsgBoxResult[/FONT]
[FONT=Tahoma]res = MsgBox("Text has changed, Do you want to save changes?", vbYesNoCancel + vbExclamation[/FONT][FONT=Tahoma])[/FONT]
 
[FONT=Tahoma]If res = vbCancel Then Exit Sub[/FONT]
[FONT=Tahoma]If res = vbYes Then mnuSave_Click[/FONT]
[FONT=Tahoma]End If[/FONT]
 
[FONT=Tahoma]TextStatus = NoChange[/FONT]
[FONT=Tahoma]lastFilename[/FONT][FONT=Tahoma] = ""[/FONT]
 
[FONT=Tahoma]txtNotes.Text[/FONT][FONT=Tahoma] = ""[/FONT]
[FONT=Tahoma]End Sub[/FONT]
اگر تغییری در متن وجود داشته باشه، ساب mnuSave_Click رو که بعدا میگذارم، صدا میزنیم وگرنه بیت ماسک رو NoChange میکنیم و نام فایل رو هم پاک میکنیم.

اینجا یک تغییر در mnuSave بوجود اومده:
ما یک منوی جدید به نام mnuSaveAs و کپشن Save As میسازیم. که در واقع جای mnuSave قدیمی رو میگیره:
کد:
[FONT=Tahoma]Private Sub mnuSaveAs_Click[/FONT][FONT=Tahoma]()[/FONT]
[FONT=Tahoma]On Error GoTo errs1[/FONT]
[FONT=Tahoma]cdlgDialog.CancelError = True[/FONT]
[FONT=Tahoma]cdlgDialog.ShowSave[/FONT]
 
[FONT=Tahoma]If cdlgDialog.FileName <> "" Then[/FONT]
[FONT=Tahoma]save_file cdlgDialog.FileName[/FONT]
[FONT=Tahoma]End If[/FONT]
[FONT=Tahoma]errs1[/FONT][FONT=Tahoma]:[/FONT]
[FONT=Tahoma]End Sub[/FONT]
خب، این همون mnuSave_Click قدیمی هست با نام جدید mnuSaveAs_Click.
حالا کد جدیده mnuSave_Click
کد:
[FONT=Tahoma]Private Sub mnuSave_Click[/FONT][FONT=Tahoma]()[/FONT]
[FONT=Tahoma]If TextStatus And TextSaved Then[/FONT]
[FONT=Tahoma]save_file lastFilename[/FONT]
[FONT=Tahoma]Else[/FONT]
[FONT=Tahoma]mnuSaveAs_Click[/FONT]
[FONT=Tahoma]End If[/FONT]
[FONT=Tahoma]End Sub[/FONT]
اگر بیت ماسک TextSaved وجود داشته باشه. فایل ما یک نام خواهد داشت، پس فقط اونرو ذخیره میکنیم. ولی اگر بیت ماسک رو نداشته باشه، باید mnuSaveAs_Click رو صدا بزنیم تا یک نام براش بگذاریم.

حالا ممکن بگید پس کجا ما این TextSaved و TextChanged رو به متغییر دادیم؟ خب:

ما در رخداد Changed از تکست باکسمون میگذاریم:
کد:
[FONT=Tahoma]Private Sub txtNotes_Change[/FONT][FONT=Tahoma]()[/FONT]
[FONT=Tahoma]TextStatus = TextStatus Or TextChanged [/FONT]
[FONT=Tahoma]End Sub[/FONT]
یعنی با کوچکترین تغییر بیت ماسک TextChanged رو به متغییر اضافه میکنیم. توجه داشته باشید که ما متغییر رو برابر با بیت ماسک قرار نمیدیم بلکه به اون اضافه میکنیم چون شاید در جایی دیگه که در زیر میبینم، ما بیت ماسک دیگه ای هم در متغییر داشته باشیم.

دستورات جدید رو به خطوط آخر save_file اضافه میکنیم:
کد:
[FONT=Tahoma]Sub save_file(strFilename As String[/FONT][FONT=Tahoma])[/FONT]
[FONT=Tahoma]On Error GoTo errs1[/FONT]
[FONT=Tahoma]Dim f As Integer[/FONT]
[FONT=Tahoma]Dim tmp As String[/FONT]
 
[FONT=Tahoma]f = FreeFile[/FONT]
[FONT=Tahoma]Open strFilename For Output As #f[/FONT]
[FONT=Tahoma]Print #f, txtNotes.Text[/FONT]
[FONT=Tahoma]Close #f[/FONT]
 
[FONT=Tahoma]MsgBox "File saved successful.", vbInformation[/FONT]
[FONT=Tahoma]TextStatus = NoChange Or TextSaved[/FONT]
[FONT=Tahoma]lastFilename = strFilename[/FONT]
[FONT=Tahoma]Exit Sub[/FONT]
[FONT=Tahoma]errs1[/FONT][FONT=Tahoma]:[/FONT]
[FONT=Tahoma]MsgBox "Error: Can not save file '" & strFilename & "'.", vbExclamation[/FONT]
[FONT=Tahoma]Close #f[/FONT]
[FONT=Tahoma]End Sub[/FONT]
درست بعد از مسیج باکس، میگیم که فایل ذخیره شده و همچنین دیگه تغییری وجود نداره. و اسم فایل هم در متغییر دیگه ای ذخیره می کنیم.

ساب open_file:
کد:
[FONT=Tahoma]Sub open_file(strFilename As String[/FONT][FONT=Tahoma])[/FONT]
[FONT=Tahoma]On Error GoTo errs1[/FONT]
[FONT=Tahoma]Dim f As Integer[/FONT]
[FONT=Tahoma]Dim tmp As String[/FONT]
 
[FONT=Tahoma]f = FreeFile[/FONT]
[FONT=Tahoma]Open strFilename For Input As #f[/FONT]
[FONT=Tahoma]tmp = Input(LOF(f), #f[/FONT][FONT=Tahoma])[/FONT]
[FONT=Tahoma]Close #f[/FONT]
 
[FONT=Tahoma]txtNotes.Text = tmp[/FONT]
[FONT=Tahoma]TextStatus = NoChange Or TextSaved[/FONT]
[FONT=Tahoma]lastFilename = strFilename[/FONT]
[FONT=Tahoma]Exit Sub[/FONT]
[FONT=Tahoma]errs1[/FONT][FONT=Tahoma]:[/FONT]
[FONT=Tahoma]MsgBox "Error: Can not open file '" & strFilename & "'.", vbExclamation[/FONT]
[FONT=Tahoma]Close #f[/FONT]
[FONT=Tahoma]End Sub[/FONT]
بعد از نشان دادن متن در تکست باکس، میکیم که فایل ذخیره شده (در واقع ما فایل ذخیره شده ای رو باز کردیم) و تغییری در متن وجود نداره. و اسم فایل هم ذخیره میکنیم.

همونطور که قبلا دیدید، این متغییر های جدید در mnuSave_Click و mnuNew_Click هم چک و هم تغییر کردند.

حالا اگر از برنامه بدون ذخیره کردن متن خارج بشیم، متن تغییر کرده از بین میره، پس:

کد:
[FONT=Tahoma]Private Sub Form_Unload(Cancel As Integer[/FONT][FONT=Tahoma])[/FONT]
[FONT=Tahoma]If TextStatus And TextChanged Then[/FONT]
[FONT=Tahoma]Dim res As VbMsgBoxResult[/FONT]
[FONT=Tahoma]res = MsgBox("Text has changed, Do you want to save changes?", vbYesNoCancel + vbExclamation[/FONT][FONT=Tahoma])[/FONT]
 
[FONT=Tahoma]If res = vbCancel Then Cancel = True[/FONT]
[FONT=Tahoma]If res = vbYes Then mnuSave_Click[/FONT]
[FONT=Tahoma]End If[/FONT]
 
[FONT=Tahoma]End Sub[/FONT]

این هم از استفاده از بیت ماسک برای کنترل تغییرات متن.

جالب بود نه؟ پس دیگه حتما تا برنامه بعد!

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

(ادیت: غلط غلوط داشتم)
 

فایل های ضمیمه

  • MyNotes0.4.zip
    13.9 KB · نمایش ها: 225

meli

Registered User
تاریخ عضویت
19 اکتبر 2004
نوشته‌ها
1,393
لایک‌ها
23
سن
36
محل سکونت
tehran
کارت حرف نداره!
موفق باشی!
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
به نقل از meli :
کارت حرف نداره!
موفق باشی!
مرسی.
183.gif
 

شايان

مدیران قدیمی
تاریخ عضویت
2 سپتامبر 2003
نوشته‌ها
4,813
لایک‌ها
9
اقا عالی بود ... البته فاصله بین هر مرحله یه کم داره زیاد میشه ... ولی همینم خیلی خیلی خوبه ! دمت گرم.
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
به نقل از شايان :
اقا عالی بود ... البته فاصله بین هر مرحله یه کم داره زیاد میشه ... ولی همینم خیلی خیلی خوبه ! دمت گرم.
چه کنم که پیر شدم!
62.gif

سعی میکنم زود به زود آپ2دیتش کنم ولی خب چه میشه کرد، گرفتارم، اینها رو هم از روی کتاب نمی نویسم، باید روشون اول فکر کنم کدشون کنم بعد بیارم اینجا شرح بدم. اینکه حرکت یکمی لاک پشتی میشه.
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
بعد از برنامه دفترچه یادداشت، حالا میخوایم با کنترلهای بیشتری از وی بی 6 و همچنین استفاده از API آشنا بشیم. ما یک مرورگر ساده تصویر میسازیم و با استفاده از API امکان گرفت تصویر از دسکتاپ رو بهش میدیم.

خب من اینترفیس ساده برنامه رو براتون اتچ کردم که برای شروع برنامه راحت تر باشیم، اینترفیس برنامه بدین صورت خواهد بود:

attachment.php



مثل همیشه یک فولدر برای برنامه میسازیم به اسم: MyPictures0.1
تا پست بعدی سعی کنید در ایونت Form_Resize کدهای لازم برای تنظیم کنترلها روی فرم رو وقتی که فرم رو تغییر اندازه میدیم خودتون بنوسید. البته در پست بعدی (در اولین فرصت) برنامه رو شروع میکنیم.


فعلا، تابعد :)
 

فایل های ضمیمه

  • screenshot.JPG
    screenshot.JPG
    28.1 KB · نمایش ها: 645
  • MyPictures0.1.zip
    4.6 KB · نمایش ها: 206

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
خب، برنامه رو شروع میکنیم.

ابتدا کدهای ریسایز شدن کنترلها رو می نویسیم:
کد:
Private Sub Form_Resize()
On Error Resume Next
picArea.Width = ScaleWidth - picArea.Left - VScroll1.Width
VScroll1.Left = ScaleWidth - VScroll1.Width
picArea.Height = ScaleHeight - picArea.Top - HScroll1.Height
HScroll1.Top = ScaleHeight - HScroll1.Height
VScroll1.Height = picArea.Height
HScroll1.Width = picArea.Width
VScroll1_Change
HScroll1_Change
End Sub
Private Sub VScroll1_Change()
On Error Resume Next
Dim vl As Double
vl = ((picPicture.Height - picArea.ScaleHeight) * VScroll1.Value) / VScroll1.Max
picPicture.Top = -vl
End Sub
Private Sub HScroll1_Change()
On Error Resume Next
Dim vl As Double
vl = ((picPicture.Width - picArea.ScaleWidth) * HScroll1.Value) / HScroll1.Max
picPicture.Left = -vl
End Sub
چه کار کردیم؟ ما با محاسبه اندازه تصویر picPicture و تناسب بستن کاری می کنیم که با تغییر اسکرولها، تصویرمون قابل پیمایش باشه. همچنین محل قرار گیری و اندازه های کنترلها رو هم در ایونت ریسلز کنترل میکنیم.

حالا برای نشون دادن فایلهای تصویری:
کد:
Private Sub Dir1_Change()
On Error Resume Next
File1 = Dir1
End Sub
Private Sub Drive1_Change()
On Error Resume Next
Dir1 = Drive1
End Sub
Private Sub File1_Click()
On Error GoTo errs1
Dim tmp As String
picPicture.AutoSize = True
tmp = File1.Path
If Right(tmp, 1) <> "\" Then tmp = tmp & "\"
tmp = tmp & File1.FileName
Set picPicture.Picture = LoadPicture(tmp)
VScroll1.Value = 0
HScroll1.Value = 0
VScroll1_Change
HScroll1_Change
Exit Sub
errs1:
MsgBox "Can not display the picture. Error: " & Err.Description, vbExclamation
End Sub
اول کدی رو نوشتیم که اگر درایو و پوشه ها تغییر کردن، متناسب با اون لیست فایلها هم تغییر کنه. فیلتر/یا همون الگویی که برای اسم فایلهامون گذاشتیم *.gif;*.bmp;*.jpg هست که باعث میشه فقط فایلهای تصویری ساپورت شده لیست بشن.
در ایونت File1_Click ابتدا مسیر کامل تا فایل انتخاب شده رو درست میکنیم و بعد او تصویر رو توی کنترل picPicture لود میکنیم و اسکلر بارها رو ریست میکنیم.

بگذارید کد خروج و ذخیره تصویر رو هم بنویسیم:
کد:
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdSave_Click()
On Error GoTo errs2
Dim t$
t$ = InputBox("Type a name for file:", "Save as", "bitmap.bmp")
If t$ <> "" Then
Dim tmp As String
tmp = File1.Path
If Right(tmp, 1) <> "\" Then tmp = tmp & "\"
tmp = tmp & t$
If InStrRev(LCase(tmp), ".bmp") <> Len(tmp) - 3 Then tmp = tmp & ".bmp"
SavePicture picPicture.Picture, tmp
File1.Refresh
MsgBox tmp & " saved!", vbInformation
End If
Exit Sub
errs2:
MsgBox "Can not save picture. Error: " & Err.Description, vbExclamation
End Sub
فکر کنم کاملا واضح باشه، با دستور SavePicture میتونیم تصویر داخل یک پیکچرباکس رو بصورت بیت مپ ذخیره کنیم.

حالا از API کمک میگیریم تا یه اسکرین شات از دسکتاپ بگیریم. برای این کار از توابع و مقادیر ثابتی API استفاده میکنیم. از منوی ویژوال بیسیک ، در start منوی ویندوز برنامه API Viewer رو اجرا و فایل WIN32API.txt رو لود کنید. در اینجا یک لیست تقریبا کامل از توابع ، نوعها و ثباتهایی وجود داره که بهشون میگیم API یا Application Programming Interface.

این ثبات رو انتخاب میکنیم: SRCCOPY و بعد این توابع رو:
BitBlt، GetDesktopWindow و GetDC

حالا در قسمت جنرال برنامه اونهارو کپی میکنیم:
کد:
Option Explicit
Private Const SRCCOPY = &HCC0020
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
BitBlt تابعی برای کپی کردن بیتمپ هستش. GetDesktopWindow هندلر دسکتاپ رو برمیگردونه و با GetDC شماره دیوایس اون هندلر رو برای استفاده در تابع BitBlt بدست میاریم.

حالا کد گرفتن یک اسکرین شات از دسک تاپ:
کد:
Private Sub cmdCapture_Click()
Dim oldWS As Integer
Set picPicture.Picture = Nothing
picPicture.AutoRedraw = True
picPicture.Width = Screen.Width
picPicture.Height = Screen.Height
oldWS = WindowState
WindowState = 1
DoEvents
Refresh
Dim hDCDesktop As Long
hDCDesktop = GetDC(GetDesktopWindow)
BitBlt picPicture.hDC, 0, 0, Screen.Width * Screen.TwipsPerPixelX, Screen.Height * Screen.TwipsPerPixelY, hDCDesktop, 0, 0, SRCCOPY
Set picPicture.Picture = picPicture.Image
picPicture.AutoRedraw = False
WindowState = oldWS
End Sub
چه کار کردیم؟ ابتدا تصویر داخل پیکچرباکس رو پاک و اونرو به اندازه کل صفحه نمایش در آوردیم. ما AutoRedraw رو True کردیم. اگر این خاصیت True باشه، پس از انداخت یک تصویر در پیکچر باکس، اون تصویر در حافظه ذخیره میشه، و اگر حتی پنجره دیگه ای روی اون تصویر بیاد، بعد از برداشتن اون بخاطر ذخیره شدنش در حافظه بازسازی خواهد شد. البته این کار حافظه اضافه از منابع سیستم میگیره و به همین خاطر، حالت پیش فرض False هست ولی چون الان با بلت کردن میخوایم تصویری رو داخل پیکچرباکس بریزیم، باید از اون استفاده کنیم.

بعد موقعیت پنجره برنامه رو داخل یک متغییر ضبط میکنیم و پنجره برنامه رو مینیمایز میکنیم تا در اسکرین شات دیده نشه. با DoEvents و Refresh مطمئن میشین که قبلا از گرفت تصویر، حتما پنجره کوچیک شده باشه.

حالا کار اصلی رو انجام میدیم. ابتدا hDC (هندلر دستگاه) دسکتاپ رو با برگردوندن شماره هندلر دسکتاپ به داخل تابع GetDC میگیریم و سپس با BitBlt از دستگاه منبع که دسکتاپ هست به مقصد یک بیتمپ به اندازه کل صفحه نمایشگر میگیریم. توجه داشته باشید که در API به جای تویپ از پیکسل استفاده میشه پس ما هم Screen.Width و Screen.Height رو در TiwpsPerPixelX و Y ضرب کردیم تا مقدار پیکسل رو بدست بیاریم.

خب حالا یک تصویر داریم که اون رو با Set کردن به Picture در حافظه پیکچرباکس مون ذخیره میکنیم. و دیگه لازم نیست که AutoRedraw روشن باشه.

در انتها هم پنجره برنامه رو به حالت اولش بر میگردونیم.

خب اینم از یه برنامه دیگه به زبان شیرین! وی بی!
جالب بود نه؟ پس تا برنامه بعد :happy:
 

فایل های ضمیمه

  • MyPictures0.1.zip
    10.2 KB · نمایش ها: 235

شايان

مدیران قدیمی
تاریخ عضویت
2 سپتامبر 2003
نوشته‌ها
4,813
لایک‌ها
9
عالیه ... دمت گرم .

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

من فکر میکردم رنگ و فونت و اینارو هم میخوای کار کنی ...
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
به نقل از شايان :
عالیه ... دمت گرم .

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

من فکر میکردم رنگ و فونت و اینارو هم میخوای کار کنی ...
تشکر

عرض کنم که چون از تکسن باکس معمولی استفاده کردیم، قابلیت بیشتری نمیشه بهش داد. البته میشه رنگ و فونت و ... رو عوض کرد ولی کل متن تغییر میکنه، اگر از RichTextBox استفاده میشد میتونستیم قسمتهای مختلف رو فرمت بکنیم. بیشتر هدف این بود که با کامان کنترل ها آشنا بشیم و مفاهیم فایل. حالا سعی میکنم در برنامه های بعدی بیشتر کار کنیم.
 

شايان

مدیران قدیمی
تاریخ عضویت
2 سپتامبر 2003
نوشته‌ها
4,813
لایک‌ها
9
دمت گرم ... فکر کنم اگر همون رو یه چیز کاملتری بکنی ... هم از نظر اموزشی تو یه زمینه قوی تر میشه ... هم به عنوان نمونه کار ( تو آموزش ) یه چیز تکی میشه :D البته این نظره منه ... خودت و بقیه دوستان هم بگید نظرتون چیه .
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
به نقل از شايان :
دمت گرم ... فکر کنم اگر همون رو یه چیز کاملتری بکنی ... هم از نظر اموزشی تو یه زمینه قوی تر میشه ... هم به عنوان نمونه کار ( تو آموزش ) یه چیز تکی میشه :D البته این نظره منه ... خودت و بقیه دوستان هم بگید نظرتون چیه .
باشه، همون رو در بحث بعدی پیشرفته ترش میکنیم. ;)
 

شايان

مدیران قدیمی
تاریخ عضویت
2 سپتامبر 2003
نوشته‌ها
4,813
لایک‌ها
9
آقا دمت گرم ... یهو دیدی الکی الکی دادیم ماکروسافت تو ویستا گذاشت جای Notepad :D
 

شايان

مدیران قدیمی
تاریخ عضویت
2 سپتامبر 2003
نوشته‌ها
4,813
لایک‌ها
9
تاخیر یک هفته ای ... :D

منتظریم :*
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
خب، همونطور که دوستان خواستن، این برنامه رو پیشرفته ترش می کنیم، اصلا شاید اسمشم عوض کردیم گذاشتیم
Bala Word 2006 ، و دادیمش مایکروسافت ازش توی ویستا استفاده کنه!
51.gif


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

برنامه رو شروع میکنم:
از فولدر برنامه قبلی یه کپی میگیریم به اسم MyNotes 0.5 ، و در وی بی 6 بازش میکنیم.
حالا از منوی Project گزینه Components رو انتخاب میکنیم. حالا از لیست، Microsoft Rich Textbox Control 6.0 رو انتخاب میکنیم.

خوشبختانه اکثر پراپرتی ها و ایونت های تکس باکسی که در برنامه هست با پراپرتی ها و ایونت های یک ریچ تکست باکس هم خونی دارن. پس کد ما از این بابت زیاد تغییر نمیکنه. تکست باکس قدیمی رو از روی فرم انتخاب و پاک میکنم و یک ریچ تکست باکس با همون اسم روی فرم میگذاریم. فقط مطمئن بشید که Left کنترل صفر باشه، چون توی کد تنظیمش نمیکنیم.

حالا یه تولبار دیگه هم میسازیم به اسم tbrFont درست زیر tbrStandard . ولی قبل از اینکه دکمه ای روش بگذاریم:
ما چندتا آیکون جدید داریم که باید به imgListمون اضافه کنیم. به ترتیب:
کد:
Prop.ico
Bld.ico
Itl.ico
Undrln.ico
Lft.ico
Ctr.ico
Rt.ico
خب حالا میتونیم دکمه های جدیدمون رو اضافه کنیم، tbrFont رو انتخاب میکنیم و پراپتی Custom رو انتخاب میکنیم به تب دوم میریم و به ترتیب با دکمه Insert Button اینها رو اضافه میکنیم:
کد:
Index: 1
Caption: Font
Image: 7
Index: 2
Style: 3
Index: 3
Caption: Bold
Style: 1
Image: 8
Index: 4
Caption: Italic
Style: 1
Image: 9
Index: 5
Caption: Underline
Style: 1
Image: 10
Index: 6
Style: 3
Index: 7
Caption: Left
Style: 2
Image: 11
Index: 8
Caption: Center
Style: 2
Image: 12
Index: 9
Caption: Right
Style: 2
Image: 13
خب، این قضیه Style چیه؟ با استایل 3 آشنا هستیم، این همون جدا کننده هست، ولی استایل 1 به ما این قابلیت رو میده که از دکمه بصورت یک Checkbox استفاده کنیم، یعنی دو حالت. استایل 2 به ما این قابلیت رو میده که از دکمه بصورت یک Optionbox استفاده کنیم، یعنی دو حالت برای فقط یک دکمه در آن واحد.

حالا دابل کلیک میکنیم روی تولبار و این کد ها رو مینویسیم:
کد:
Private Sub tbrFont_ButtonClick(ByVal Button As MSComctlLib.Button)
On Local Error Resume Next
Select Case Button.Index
Case 1 'font
cdlgDialog.FontName = txtNotes.SelFontName
cdlgDialog.FontSize = txtNotes.SelFontSize
cdlgDialog.FontBold = txtNotes.SelBold
cdlgDialog.FontItalic = txtNotes.SelItalic
cdlgDialog.FontUnderline = txtNotes.SelUnderline
cdlgDialog.ShowFont
txtNotes.SelFontName = cdlgDialog.FontName
txtNotes.SelFontSize = cdlgDialog.FontSize
txtNotes.SelBold = cdlgDialog.FontBold
txtNotes.SelItalic = cdlgDialog.FontItalic
txtNotes.SelUnderline = cdlgDialog.FontUnderline
Case 2 'separator
'nothing
Case 3 'bold
txtNotes.SelBold = Button.Value
Case 4 'italic
txtNotes.SelItalic = Button.Value
Case 5 'underline
txtNotes.SelUnderline = Button.Value
Case 6 'separator
'nothing
Case 7 'left
txtNotes.SelAlignment = rtfLeft
Case 8 'center
txtNotes.SelAlignment = rtfCenter
Case 9 'right
txtNotes.SelAlignment = rtfRight
End Select
End Sub
این کد خیلی سادست، در کیس 2 ما ابتدا خصوصیات فونت حاضر رو به کامان دیالوگ میدیم و با ShowFont امکان تغییرشون رو میدیم و بعد خصوصیات جدید رو به ریچ تکست باکس برمیگردونیم.
در کیسهای 3 و 4 و 5 ، bold یا italic یا underline بودن متن انتخاب شده رو بنا به مقدار دکمه روی تولبار (true / false ) تغییر میدیم.
در کیسهای 7 و 8 و 9 هم جهت متن رو تغییر میدیم.

حالا برای اینکه تغییرات روی دکمه های تولبار هم انجام بشه، یعنی اگر از یک قسمتی که bold بود به یک قسمت دیگه رفتیم که نبود، و این تغییر روی تولبار هم ظاهر بشه، این کدها رو هم توی ایونت SelChange ریچ تکست باکسمون می نویسیم:
کد:
Private Sub txtNotes_SelChange()
If txtNotes.SelBold Then
tbrFont.Buttons(3).Value = tbrPressed
Else
tbrFont.Buttons(3).Value = tbrUnpressed
End If
If txtNotes.SelItalic Then
tbrFont.Buttons(4).Value = tbrPressed
Else
tbrFont.Buttons(4).Value = tbrUnpressed
End If
If txtNotes.SelUnderline Then
tbrFont.Buttons(5).Value = tbrPressed
Else
tbrFont.Buttons(5).Value = tbrUnpressed
End If
Select Case txtNotes.SelAlignment
Case rtfLeft
tbrFont.Buttons(7).Value = tbrPressed
Case rtfCenter
tbrFont.Buttons(8).Value = tbrPressed
Case rtfRight
tbrFont.Buttons(9).Value = tbrPressed
End Select
End Sub
هر خصوصیت رو با یک شرط یا کیس بررسی میکنیم و تغییرات رو روی دکمه ها هم اعمال میکنیم.

ما یک تولبار به فرم اضافه کردیم، پس محل قرار گیری ریچ تکست باکسمون هم تغییر میکنه بصورت زیر:
کد:
Private Sub Form_Resize()
On Error Resume Next
txtNotes.Width = ScaleWidth
txtNotes.Top = tbrFont.Height + tbrFont.Top
txtNotes.Height = ScaleHeight - tbrFont.Height - tbrFont.Top
End Sub
خوب، ریچ تکست باکس، فرمت خاص خودش رو برای ذخیره متن داره، تا بتونه خصوصیات متن رو هم ذخیره کنه، این فرمت اسمش هست Rich Text Format با پسوند rtf.
روی cdlgDialog در فرم کلیک کنید و Filter رو به این صورت تغییر بدید:
کد:
*rtf (Rich Text Format)|*.rtf
این کنترل توابع آماده و خاص خودش رو برای ذخیره متن داره که کار ما رو خیلی ساده میکنه، ما دو تابع ساخته بودیم که متن معمولی رو ذخیره می کرد، حالا اونها رو هم تغییر میدیم به صورت زیر:
کد:
Sub open_file(strFilename As String)
On Error GoTo errs1
'Dim f As Integer
'Dim tmp As String
'
'f = FreeFile
'Open strFilename For Input As #f
'tmp = Input(LOF(f), #f)
'Close #f
'
'txtNotes.Text = tmp
txtNotes.LoadFile strFilename
TextStatus = NoChange Or TextSaved
lastFilename = strFilename
Exit Sub
errs1:
MsgBox "Error: Can not open file '" & strFilename & "'.", vbExclamation
'Close #f
End Sub
Sub save_file(strFilename As String)
On Error GoTo errs1
'Dim f As Integer
'Dim tmp As String
'
'f = FreeFile
'Open strFilename For Output As #f
'Print #f, txtNotes.Text
'Close #f
txtNotes.SaveFile strFilename
MsgBox "File saved successful.", vbInformation
TextStatus = NoChange Or TextSaved
lastFilename = strFilename
Exit Sub
errs1:
MsgBox "Error: Can not save file '" & strFilename & "'.", vbExclamation
'Close #f
End Sub
همونطور که میبینید، دو تابع آماده LoadFile و SaveFile کاری کرد که اکثر کدهای قدیمی کامنت بخورن و در حقیقت میتونیم اونها رو از کد برنامه پاک کنیم.

اگر چیزی رو از کی برد ننداخته باشم همش همین بود! :)
موفق باشید!
 

فایل های ضمیمه

  • MyNotes0.5.zip
    16.8 KB · نمایش ها: 222
بالا