تبليغاتX
Iranian Technology
 
آموزش برنامه نویسی
 
 
آموزش ویژوال بیسیک و ... برای دیدن تمامی مطالب به آرشیو ماهانه مراجعه کنید
 

برای استفاده از تکنیک Blend ما فقط چند خط کد به نمونه برنامه ی پست قبل اضافه می کنیم . پس قبل از هر کاری باید نمونه برنامه ی پست قبلی رو دانلود کرده باشید .

پست امروز ساده ترین پستی هست که من میزارم ولی در عین حال پست خیلی مهمیه . Blending بعدها برای استفاده از تکنیک Masking سه بعدی مورد استفاده قرار میگیره. پس سعی کنید خوب یاد بگیرید . البته با این توضیح دادن من بعید می دونم !!!

 

بعد از اینکه نمونه برنامه ی پست قبلی رو باز کردین باید این کارها رو انجام بدین .

در داخل مدول OpenGLMain به دنبال تابع InitGL بگردین و این تابع رو به صورت زیر تغییر بدین .

 

Public Function InitGL() As Boolean

 

If Not LoadGLTextures() Then

            InitGL = False

            Exit Function

End If

           

            glEnable  glcTexture2D

            glShadeModel  smSmooth

           

            glClearColor 0,0,0,0

           

            SetupLighting

 

            glBlendFunc  sfSrcAlpha , dfOne

            glEnable  glcBlend

            glDisable  glcDepthTest

 

            glHint htPerspectiveCorrectionHint , hmNicest

 

            InitGL = True

End Function

 

اگه توجه کرده باشین سه خط از این تابع حذف شده و به جای اون 4 خط اضافه شده (خطهای9تا11) .

هشت خط اول که نیازی به توضیح نداره . در خط 9 ما به کمک تابع glBlendFunc مشخص می کنیم که از چه نوع روشی برای ترکیب کردن رنگ اشکال یا سطوح استفاده کنیم.

باید توجه داشته باشید که برای حالت شیشه رنگ های سطح عکسی که قراره به عنوان شیشه مورد استفاده قرار بگیره با رنگ سطوح پشتی ( دارای مختصات z کمتر) ترکیب میشه.

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

برای کامل کردن برنامه تابع DrawGLScene رو هم به این شکل تغییر بدین :

 

Public Function DrawGLScene() AS Boolean

 

            glClear  clrColorBufferBit  or  clrDepthBufferBit

            glLoadIdentity

            glTransLatef  0 , 0 , -5

            glRotatef  Rot(0) , 1 , 0 , 0

            glRotatef  Rot(1) , 0 , 1 , 0

            glRotatef  Rot(2) , 0 , 0 , 1

 

            glBindTexture  glTexture2D , Texture(0)

           

            Dim Q as GluQuadricObj

            Q = gluNewQuadric

            gluquadricTexture Q , True

            gluSphere  Q , 1 , 16 , 16

            gluSphere  Q  , 0.5 , 16 , 16

 

            Rot(0) = Rot(0) + 0.2

            Rot(1) = Rot(1) + 0.3

            Rot(2) = Rot(2) + 0.25

 

            DrawGLScene = True

End Function

 

تنها تغییری که در کد تابع DrawGLScene ایجاد کردیم در خط 12 بود که یک کره ی دیگه در داخل کره ی اولی رسم کردیم .

حالا نوبت به اجرای برنامه میرسه .

اینم سورسش : دانلود

 

DepthTesting :

همون طور که قبلا هم گفتم هنگامی که یک شکل سه بعدی رسم می کنیم مختصات Z اشکال در داخل بافر عمق (Depth Buffer ) ذخیره میشه . شما میدونید که وقتی یک شی پشت یک شی دیگه قرار بگیره دیگه قابل مشاهده نیست بنابراین اگر در رسم اشکال سه بعدی از DepthTesting استفاده نشه اشکالی که در عمق هستند یا در پشت اشکال دیگر قرار دارند هم پردازش میشن . DepthTesting باعث پاک شدن بافر عمق میشه و از پردازش روی اشکالی که در پشت قرار دارند و مشاهده نمی شن جلوگیری میکنه . اما برای استفاده ار Blending ما نمی تونیم از DepthTesting استفاده کنیم چراکه در Blending اشکالی که در پشت هستند هم قابل مشاهده هستن و به عبارتی یک حالت شیشه مانند پیش میاد .

 

پیشنهاد میشه در جاهایی که از Blending استفاده نمیشه از DepthTesting استفاده بشه . همچنین در جاهایی که از Blending استفاده میشه نباید از DepthTest استفاده کرد.

برای استفاده از DepthTest فقط کافیه چند تا کار انجام بدین :

1 – در تابع InitGL کار DepthTesting رو فعال کنید .

2 – هربار که تابع DrawGLScene اجرا میشه بافر عمق رو خالی کنید :

1 : در تابع InitGL  :

glClearDepth 1

glEnable glcDepthTest

glDepthFunc cflEqual

 

2 : در تابع DrawGLScene :

glClear  clrDepthBufferBit  or  clrColorBufferBit

همین .

 

حالا اگه از این دو تکنیک هم زمان استفاده کنیم از طرفی DepthTesting اشکال موجود در پشت رو حذف میکنه و از طرف دیگه Blending سعی میکنه اشکالی که در پشت هستند رو با اشکال قابل مشاهده ترکیب کنه . حالا دیگه خودتون پیش بینی کنید چی میشه !

نه . خطا پیش نمیاد ولی اشکال مبهم و خراب به نظر میرسن.

 

خوب فکر کنم دیگه با DepthTest آشنا شده باشید .  

 

 


و اما چند تا آموزش کاربردی :

 

1 – کاربا Excell در ویژوال بیسیک :

شما می تونید با ویژوال بیسیک فایلهای *.xls مربوط به برنامه Excell رو ایجاد کنید یا در اونها تغییر ایجاد کنید . برای انجام این کار :

1 – ویژوال بیسیک رو باز کرده پروژه ی استاندار رو OK کنید .

2 – از منوی Project -> References رو کلیک کنید و بعد در پنجره ای که باز شد به دنبال Microsoft Excell 11 Object Library بگردین و بعد از علامت دار کردن OK کنید.

3 – حالا یک دکمه یا CommandButton به فرم برنامه اضافه کنید .

4 -  روی Command1 جفت کلیک کنید تا پنجره ی کدها باز بشه . بعد بنویسید :

 

Private sub Command1_Click()  'x

           

            Dim EXL As New Excel.Application

            Dim WorkBook  As Excel.Workbook

            Dim WorkSheet As Excel.WorkSheet

 

            Set WorkBook = Exl.WorkBooks.Add

            Set WorkSheet = WorkBook.WorkSheets(1)

 

            WorkSheet.Cells(1,1) = "This is a Test"

           

            Dim I As Integer

            Dim J As Integer

            For  I = 2 to  10

                        For J = 2 to 10

                                    WorkSheet.cells( I , J ) = I * J

                        Next

            Next

 

            WorkBook.SaveAs  "C:\Test.xls"

            WorkBook.Close

            Set Exl = Nothing

 

End Sub

 

خط اول برای ایجاد کردن شیء Excel هست . خط دوم و سوم به ترتیب برای ایجاد کردن WorkBook و  WorkSheet هستند . حتمآ کار با نرم افزار معروف Excel رو بلدین پس اگه بلد باشین میدونید که WorkBook و WorkSheet چی هستند . اگه هم بلد نیستین زیاد نگران نباشین و این آموزش رو نخونید. 

در خط 4 به وسیله ی Exl.WorkBook.Add یک WorkBook ایجاد می کنیم . در خط 5 هم به وسیله ی WorkBook.WorkSheet(1) اولین کابرگ (WorkSheet) از WorkBook رو انتخاب می کنیم . همون طور که خودتون هم میدونید وقتی برنامه ی Excel رو اجرا می کنید و یک WorkBook ایجاد می کنید به طور پیش فرض سه کاربرگ ایجاد میشه . در اینجا هم شما میتونید به جای عدد 1 در WorkBook.WorkSheet(1) عددهای 2 یا 3 رو بنویسین . همچنین برای ساختن کاربرگ جدید میتونید از دستور زیر استفاده کنید :

WorkBook.WorkSheets.Add

در این صورت اگه آخرین کاربرگی که ساخته باشین کاربرگ 3 باشه کاربرگ 4 هم اضافه میشه.

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

ما در این برنامه به وسیله ی WorkSheet.Cell(1,1) = "This is a test" در خانه ی 1و1 کاربرگ 1 ( کاربرگ 1 رو با دستور Set WorkSheet = WorkBook.WorkSheet(1) انتخاب کردیم. اگه خواستین کاربرگ دیگه ای رو انتخاب کنید فقط کافیه به جای عدد 1 عدد دیگه ای وارد کنید.) عبارت This is a test رو نوشتیم . بعد از اون هم به کمک یک حلقه ی For یک جدول ضرب 2 در 10 رو درکاربرگ 1 نوشتیم . بعد از اون هم به کمک WorkBook.SaveAs "C:\Test.xls" کارهایی که انجام دادیم و WorkBook که ساختیم رو در مسیر C:\Test.xls ذخیره کردیم . بعد از اون هم WorkBook رو بستیم و حافظه ی تخصیص یافته به Exl رو هم آزاد کردیم.

خوب ، چطور بود ؟ حتمآ در قسمت نظرها بگین .  

 


2 – چرخاندن عکس بر حسب درجه :

دو عدد PictureBox به فرم برنامه اضافه کنید و بعد از اون هم یک عدد CommandButton به فرم اضافه کنید .

روی فرم جفت کلیک کنید تا روال رویداد Form_Load باز بشه . بعد بنویسید :

 

Private sub Form_Load ()   'x

           

            Picture1.Picture = LoadPicture("FileName")

            Picture1.AutoRedraw = True

            Picture2.AutoRedraw = True

            Picture1.ScaleMode= 3

            Picture2.ScaleMode = 3

            Picture1.PaintPicture  Picture1.Picture , 0 , 0 , Picture1.ScaleWidth , Picture1.ScaleHeight           'x

           

End Sub

 

در قطعه کد بالا در خط اول به کمک تابع LoadPicture یک تصویر رو داخل Picture1 قرار میدیم. به جای FileName آدرس یا مسیر یک عکس رو بنویسید . در خط 2 خاصیت AutoRedraw به درست قرار دادیم.

اگه خواستین بگین تا درمورد این خاصیت توضیح بدم . خط 3 به بعد هم معلومه . اما در خط 6 اندازه ی عکس رو به اندازه ی کنترل PictureBox در میاریم . تابع PaintPicture برای رسم یک عکس روی یک کنترل مورد استفاده قرار میگیره . البته در کنترل های استاندارد ویژوال بیسیک فقط Form و PictureBox این تابع رو دارن . دو آرگومان اول این تابع ( البته به اینجور توابع متد هم میگن ) نشان دهنده ی محلیه که تصویر قراره در اون محل رسم بشن. مثلآ در این مثال ما گفتیم که در مختصات 0 و 0 تصویر رو رسم کنه. همچنین گفتیم که تصویر رو با اندازه ی ScaleWidth و ScaleHeight کنترل Picture رسم کنه. حالا اگه تصویر رو با اندازه ی ScaleWidth و ScaleHeight کنترل Picture رسم کنه اندازه ی تصویر به اندازه ی کنترل Picture در میاد . به همین سادگی به کنترل Picture خاصیت Stretch اضافه کردین !! (خاصیت Stretch فقط مربوط به کنترل Image هست و باعث میشه که اندازه ی تصویر به انداز ی کنترل Image  دربیاد.)

 

بعد از اینها روی Command1 جفت کلیک کنید و بنویسید :

 

Private sub Command1_Click ()  'x

           

            Dim X , Y As Single

            Dim I , J As Single

            Dim SA As Double

            Dim CA As Double

            Dim TX As Double

            Dim TY As Double

 

            I = Picture1.ScaleWidth / 2

            J = Picture1.ScaleHeight / 2

            SA = Sin ( 45 / 180 * 3.1415)

            CA = Cos ( 45 / 180 * 3.1415)

           

            For X = -I  to  I

                        For Y = -J  to  J

                                    TX = (X * CA) - (Y * SA) + I

                                    TY = (X * SA) + (Y * CA) + J

                                    Picture2.Pset( TX , TY ) , Picture1.Point( X + I , Y + J)

                        Next

                        DoEvents

            Next

 

End Sub

 

حالا دیگه نوبت به اجرا کردن برنامه میرسه . بعد از اجرا کردن برنامه روی Command1 کلیک کنید و رسم شدن تصویر با زاویه 45 در Picture2 رو ببینید. برای تغیر زاویه ی چرخش باید SA = Sin(45 … و CA = Cos(45… رو تغییر بدین . 45 زاویه ی چرخش هستا . می تونید با تغیر دادن عدد 45 زوایای چرخش تصویر رو تغییر بدین .

 

اگه برنامه رو اجرا کرده باشین و دیده باشین وقتی تصویر جدید در Picture2 رسم میشه بعضی از پیکسل ها از هم دور هستند و باعث کم کیفیت شدن تصویر جدید می شن . برای رفع این مشکل هم فقط کافیه به حلقه ها گام پرش ( Step ) اضافه کنید. برای این کار خط های 11 و 12 رو به صورت زیر تغییر بدین .

 

For X = -I  to  I  Step  0.5

            For Y =  -J  to  J  Step  0.5

 

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

 

خوب 6 خط اول که برای اعلان متغیرهاست . در خط ها 7 و 8 وسط کنترل Picture1 رو به دست میاریم و در داخل I , J می ریزیم. در خطهای 9 و 10 هم سینوس و کسینوس زاویه ی چرخش رو به دست میاریم. باید توجه داشته باشید که توابع Sin() , Cos() مقادیر بر حسب رادیان می گیرند . پس با استفاده از فرمول " درجه / 180 * عدد پی " (البته فرمول رو از راست به چپ باید بخونید.) زاویه بر حسب درجه رو به رادیان تبدیل می کنیم.

تنها کار سختی که در چرخوندن تصاویر وجود داره در خطهای 13و14 هستند . در خطهای 13 و 14 ما باید مختصات جدید نقطه ای رو که قراره بچرخونیم ، به دست بیاریم . من این فرمول رو از یکی کتابهای برنامه نویسی و الگوریتم پیدا کردم . در خط بعد ( 15) هم در مختصات جدید که به دست اوردیم پیکسل های تصویر موجود در Picture1 رو روی Picture2 رسم کردیم . البته به کمک متد PSet(x,y),color مربوط به Picture2 . این متد که من در اینجا شکل کلی اون رو نوشتم ، مختصات x,y رو می گیره و در اون محل یک رنگ ( یا پیکسل) رو رسم می کنه .

متد Point(x,y) مربوط به Picture1 هم با گرفتن مختصات رنگ پیکسل اون محل رو برمی گردونه .

 

شما می تونید با چند تا تغییر ساده در فرمول اصلی ( همون کدهای موجود در خطهای 13و14) این برنامه نوع چرخش رو مشخص کنید . مثلا چرخش به صورت عقربه های ساعت یا برعکس یا حتی چرخش سه بعدی . برای مثال شما در کد TX = (CA * x) – (SA * Y) + I به جای – ( منها) از + یا مثبت اضافه کنید تا تصویر به صورت سه بعدی بچرخه .

امیدوارم خوشتون اومده باشه . پس نظر یادتون نره .

 


3 نکاتی در مورد hWnd و hDC و چگونگی کار کردن با اونها :

 

hWnd یا Handle Window : هر پنجره ی موجود در ویندوز دارای یک دستگیره (Handle) است . علت اینکه هر پنجره در ویندوز دارای هندل یا دستگیره هست اینه که ویندوز برای کار با پنجره های مختلف و مدیریت اونها از دستگیره ( هندل ) استفاده میکنه. باید اینو بدونید که حتی یک دکمه فرمان یا کنترل Text در ویندوز به عنوان یک پنجره هستند. پس همه ی کنترل ها هم دارای دستگیره هستند.

 

نحوه ی به دست آوردن دستگیره های پنجره های مختلف : برای به دست آوردن دستگیره ی یک پنجره ما نیاز به دو چیز داریم . یکی نام کلاس اون پنجره و دیگری عنوان یا Caption اون پنجره . همه ی پنجره ها دارای کلاس هستند ولی فقط بعضی از آنها Caption دارند . مثلا Caption پنجره ی My Computer همون اسم خودشه و کلاسش CabinetWClass هست . باید توجه داشته باشین که برای به دست آوردن دستگیره ی یک پنجره حتمآ باید نام کلاس اون رو بدونید . فقط برای به دست آوردن تعداد کمی از پنجره ها نیازی به دونستن کلاس نیست ؛ مثل پنجره ی My Computer .

ممکنه پیش خودتون فکر کنید که چه جوری نام کلاس همه ی پنجره ها رو میشه به دست آورد. اگه نام کلاس یه پنجره رو ندونی که به درد نمی خوره . ولی کار نشد نداره !! به کمک بعضی از توابع API ویندوز می تونید نام کلاس پنجره های مختلف رو به دست بیارید . ولی یه راه ساده تر استفاده از برنامه ی Spy++ هست . این برنامه وقتی که بسته ی نرم افزاری Visual Studio رو نصب می کنید به طور خودکار نصب میشه . اگه شما مجموعه ی Visual Stadio رو نصب کرده باشین می تونید این برنامه رو از این مسیر به دست بیارین :

Start -> All Program -> Microsoft Visual Studio 6.0 -> Microsoft Visual Studio tools -> Spy++

 

اگر هم بسته ی نرم افزاری Visual Stadio رو به طور کامل نصب نکرده باشین می تونید با استفاده از دو راه که به شما میگم این مشکل رو برطرف کنین.

اولین روش اینه که دوباره Visual Studio رو نصب یا به روز کنید .

روش دوم اینه که سی دی Visual Studio رو داخل سی دی رام بزارین و بعد با استفاده از Search کلمه ی Spy++ رو جستجو کنید و برنامه ی Spy++ در صورت پیدا شدن از روی CD  اجرا کنید و از اون استفاده کنین.

 

طرز کار با برنامه Spy++ :

اول از همه پنجره ی My Computer رو باز کنید.

برای کار کردن با برنامه ی Spy و پیدا کردن هندل پنجره ی مورد نظر ( در اینجا My Computer) از منوی Search این برنامه Find رو کلیک کنید یا کلیدهای Alt+F3 رو فشار بدید . بعد از این کار پنجره ی Window Search باز میشه . در داخل این پنجره در جلوی عبارت Finder Tool یک تصویر وجود داره و در وسط اون تصویر یک چیز دایره مانند . روی اون دایره کلیک کنید و با نگه داشتن کلیک چپ اون دایره رو روی پنجره ی My Computer ببرین . خوب دیگه بسه دکمه ی چپ ماوس رو شکستی . ولش کن! البته روی پنجره ی My Computer باید شکل دایره رو درگ کنید.

حالا در پنجره ی Window Search در جعبه متن های Caption و Class عنوان و نام کلاس پنجره یMy Computer نوشته میشه .

 

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

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

 

برای به دست آوردن دستگیره ی یک پنجره ما از تابع API به نام FindWindow استفاده می کنیم. این تابع دو آرگومان دارد که هر دو آرگومان از نوع رشته ای (String) هستند . آرگومان اول نام کلاس و آرگومان دوم Caption پنجره ی مورد نظر هست. تابع با توجه به ورودی ها هندل پنجره رو پیدا می کنه و بر میگردونه . دستگیره یک پنجره یک عدد از نوع Long هست .

شکل کلی تابع FindWindow :

 

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" _

            (byVal StrClassName As String , byVal StrCaption As String) As Long

 

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

 

میدونید که در هر پنجره در داخل خود تعدادی پنجره ی دختر (mdi form) یا زیر پنجره داره . همچنین همون طور که قبلآ هم گفتم هر کنترل در ویندوز یک پنجره به حساب میاد .

حالا اگه ما بخوایم هندل مربوط به یک کنترل در یک پنجره رو به دست بیاریم باید بعد از به دست آوردن هندل پنجره ی اصلی به کمک تابع FindWindowEx هندل اون زیر پنجره یا کنترل رو به دست بیاریم.

برای مثال دکمه ی Start یک دکمه فرمان است و در داخل پنجره ی TaskBar قرار داره . بنابراین اگه بخوایم هندل Start رو به دست بیاریم ، اول هندل TaskBar رو به دست میاریم بعد به کمک تابع FindWindowEx هندل Start رو به دست میاریم .

 

شکل کلی تابع FindWindowEx : دارای 4 آرگومانه . آرگومان اول مربوط به هندل پنجره ی اصلی هست . آرگومان دوم زیاد مورد استفاده قرار نمی گیره و در اکثر اوقات مقدار 0 میگیره . اما آرگومان 3 نام کلاس زیر پنجره یا کنترل هست و آرگومان چهارم هم Caption زیر پنجره یا کنترل .

 

Private Declare Function FindWindowEx lib "User32" Alias "FindWindowExA" _

(byVal hWnd1 As Long , ByVal hWnd2 As Long , byVal sClass As String , _

            ByVal sCaption As String )  As  Long

 

 

مثال: به دست آوردن هندل Start Menu و مخفی کردن آن :

در این مثال ما بعد از به دست آوردن هندل منوی Start اون رو مخفی می کنیم و دوباره از حالت مخفی در میاریم.

 

اول از همه یک پروژه ی جدید از نوع استاندارد باز کنید و دو عدد دکمه فرمان (Command) روی فرم بزارین . برنامه ای که ما قراره بنویسیم به این صورته که با کلیک کردن Command1 دکمه ی منوی Start مخفی میشه و با زدن Command2 از حالت مخفی در میاد.

از منوی View گزینه ی Code رو کلیک کنید تا پنجره ی کدها باز بشه . حالا نوبت به اعلان توابع API که قراره از اونا استفاده کنیم میرسه. در قسمت جنرال(General) بنویسید :

 

Private Declare Function FindWindow lib "User32" Alias "FindWindowA" _

            (ByVal StrClass As String , ByVal StrCaption As String) As Long

 

Private Declare Function FindWindowEx lib "User32" Alias "FindWindowExA" _

(byVal hWnd1 As Long , ByVal hWnd2 As Long , byVal sClass As String , _

            ByVal sCaption As String )  As  Long

 

Private Declare Function ShowWindow lib "User32" _

(ByVal hWnd As Long , ByVal CmdShow As Long) As Long

 

تابع FindWindow رو که توضیح دادم. ولی تابع ShowWindow : این تابع دو آرگومان دارد . آرگومان اول هندل پنجره و آرگومان دوم کاری که قرار است بر روی اون پنجره انجام بشه . اگه به آرگومان دوم مقدار 0 داده بشه پنجره ی مورد نظر مخفی (Hide) میشه و در صورتی که مقدار 5 به این آرگومان فرستاده بشه پنجره از حالت مخفی بیرون میاد و نمایش داده میشه.

 

خوب حالا روی Command1 جفت کلیک کنید و بنویسید :

 

Private sub Command1_Click()     'x

           

            Dim handleTaskBar As Long

            Dim handleStart  As Long

           

            handleTaskBar = FindWindow("Shell_TrayWnd","")

            handleStart = FindWindowEx(handleTaskBar , 0 , "Button" , "Start" )

           

            ShowWindow handleStart , 0

 

End Sub

 

بعدش روی Command2 جفت کلیک کنید و بنویسید :

 

Private sub Command2_Click()     'x

           

            Dim handleTaskBar As Long

            Dim handleStart  As Long

           

            handleTaskBar = FindWindow("Shell_TrayWnd","")

            handleStart = FindWindowEx(handleTaskBar , 0 , "Button" , "Start" )

           

            ShowWindow handleStart , 5

 

End Sub

 

 

امیدوارم با این طرز توضیح دادن من چیزی فهمیده باشین .

 

hDC یا Handle Device Context : هر پنجره در ویندوز علاوه بر داشتن هندل دارای یک خاصیت منحصر به فرد دیگه به نام Device Context هست . ویندوز برای انجام کارهای گرافیکی بر روی پنجره های مختلف از Device Context استفاده میکنه. Device Context آدرس یک قسمت از حافظه است که داده های گرافیکی مربوط یک پنجره ی منحصربه فرد در آنجا ذخیره می شود. DC یک خصوصیت منحصر به فرد برای یک پنجره است . چون داده های گرافیکی در ویندوز همیشه در حال تغییر هستند ، DC ها هم همیشه در حال تغیر هستند .

 

روش به دست آوردن DC : برای به دست آوردن DC مربوط به یک پنجره باید هندل آن پنجره را بدانید .

بعد از به دست آوردن هندل پنجره ی مورد نظر به کمک تابع API به نام GetDC می توان DC آن پنجره رو به دست بیاریم . تابع GetDC فقط یک آرگومان می گیرد و آن هم هندل پنجره ای است که می خواهیم DC آن را به دست آوریم .

DC هم مثل هندل یک عدد Long هست . پس خروجی تابع GetDC باید Long باشد .

 

مثال : چاپ کردن یک اسم روی Start :

برای انجام این کار ما بعد از به دست اوردن هندل Start ، DC دکمه ی Start رو به دست میاریم . بعد از اون هم به کمک تابع TextOut یک متن یا یک اسم رو روی اون می نویسیم.

 

پس یک پروژه ی استاندارد باز کنید و یک عدد CommandButton به فرم اضافه کنید . حالا از منوی View  روی Code کلیک کنید و در قسمت General  بنویسید :

 

Private Declare Function FindWindow lib "User32" Alias "FindWindowA" _

            (ByVal StrClass As String , ByVal StrCaption As String) As Long

 

Private Declare Function FindWindowEx lib "User32" Alias "FindWindowExA" _

(byVal hWnd1 As Long , ByVal hWnd2 As Long , byVal sClass As String , _

            ByVal sCaption As String )  As  Long

 

Private Declare Function GetDC lib "User32" (ByVal hWnd As Long) As Long

Private Declare Function TextOut lib "gdi32" Alias "TextOutA" _

            (byVal hDC as Long , ByVal X As Long , ByVal Y As Long , _

            ByVal lpString As String , ByVal nCount As Long) As Long

 

Private Sub Command1_Click ()        'x

 

            Dim hTask As Long

            Dim hStart As Long

            Dim StartDC As Long

 

            hTask = FindWindow("Shell_TrayWnd","")      'x

            hStart = FindWindowEx(hTask , 0 , "Button" , "Start" )        'x

            StartDC = GetDC(hStart)             'x

           

            TextOut   StartDC , 0 , 0 , "Ali" , 3

 

End Sub

 

تابع TextOut برای نوشتن یک متن روی یک پنجره مورد استفاده قرار می گیره . این تابع 5 آرگومان دارد که آرگومان اول DC مربوط پنجره ی مورد نظر هست . آرگومان دوم و سوم مختصاتی است که متن ما در آن مختصات چاپ میشه. آرگومان چهارم متنی هست که قراره روی پنجره چاپ بشه و آرگومان آخر تعداد کاراکترهای متنی که قراره چاپ بشه رو مشخص می کنه.

 

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

 

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

تا حالا فکر کردین که من این همه تابع API رو از کجا بلدم . شاید فکر کنید من تموم این توابع رو حفظ هستم . ولی اگه انیشتنگ هم باشی نمی شه تموم توابع API رو حفظ بشی . وقتی که شما بسته ی نرم افزاری Visual Studio رو نصب می کنید در کنار برنامه های دیگه یه برنامه ی کوچولو به نام API Viewer هم نصب میشه که تقریبآ پر کاربردترین توابع API که در ویندوز مورد استفاده قرار می گیرن در این برنامه گرد آوری شده .

این جوجه برنامه در این مسیر یافت میشه :

Start -> All Program -> Microsoft Visual Studio 6.0 -> Microsoft Visual Studio 6.0 Tools -> API Viewer.exe

 

طرز استفاده : وقتی که برای اولین بار این برنامه رو باز کردین از منوی File گزینه ی Load Text File… رو کلیک کنید و بعد از باز شدن پنجره ی Select a Text API File در قسمت فایل ها Win32API.txt رو انتخاب کنین و بعد Open رو بزنید . حالا از منوی View گزینه ی Load Last File رو علامت دار کنید . حالا شما می تونید با نوشتن نام هر تابعی که دوست دارین در قسمت جعبه متن Look for و بعد از انتخاب کردن تابع API مورد نظرتون دکمه ی Add رو بزنین . توجه داشته باشین که قسمت Declare Scope رو درست انتخاب کرده باشین .

 

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

نامردین اگه نظر ندین.

تا بعد ...

 

 |+| نوشته شده در  جمعه هفتم تیر 1387ساعت 21:53  توسط علی  | 
 
  بالا  

Free Counter