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

 

آدرس جدید سایت من رو میتونید از لینک زیر وارد شوید :

شاهد جدیدترین مطالب من در سایت جدیدم باشید !!

 

:new my website -  Please enter this Link 

 

www.mmirshahi.ir

پورت اسکنر

یک پورت اسکنر ساده که به زبان Visual C++ 6 برای شما نوشته ام...

با این پورت اسکنر میتوانید پورت های باز کامپیوتر خودتونو ببینید!

 

lموفق باشید...


Download File 1

Download File 2

ماشین حساب ساده

در اینجا یک ماشین حساب زیبا وساده به زبان C#.net طراحی کرده ام که امیدوارم خوشتون بیاد...

موفق باشید...


 Download File 2

Download File

Easy Login

برنامه لاگین به زبان Asp.net که برای شما نوشته ام شما را با نحوه لاگین شدن به سایت آشنا میکند...

در این برنامه سعی شده که به صورت دستی از فایل به عنوان کوکی استفاده گردد!


 


موفق باشید...


Download File

Download File 2

بازی سیب یا Apple Game

بازی زیبای سیب که به زبان visual c++ 6 نوشته ام را تقدیم به شما میکنم...

 

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

موفق باشید!

Download File

Download File 2

بازی (TETRIS) یا همان خانه بازی خودمون به زبان C#.NET

TETRIS  GAME ! PROFETIONAL

با سلام خدمت دوستان گرامی :

در اینجا برای شما برنامه ای را به زبان سی شارپ دات نت نوشته ام . برای اجرای این برنامه حتما باید پلتفرم دات نت فریم ورک 2 را بر روی سیستم خود نصب کنید.

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

Download File

Download File 1

شروع کار با دات نت (برنامه نویسی ASP.Net در وب)

جهت آشنایی کامل شما با برنامه نویسی  ASP.NET در اینجا برای شما کتابی را تدارک دیده ایم.

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

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

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

 

Download File

آنتی ویروس برای (Kernel.exe) :

هنگامي که در حال گشت و گذار در لابه لاي صفحات اينترنت هستيد بدون شک ويروس ها وکرم هاي خطرناکي در سيستم شما بارگذاري خواهند شد وهمين امر موجب کندي وآلودگي سيستم به ويروس ميگردد . يک نمونه از اين ويروس هايي که اخيرا مد شده ودر بيشتر صفحات بارگذاري ميشوند ويروسي است به نام Kernel.exe که به محض باز کردن سايت مورد نظر در سيستم شما بارگذاري شده و کامپيوتر شما را آلوده ميسازد. از جمله کارهاي اين ويروس :

1-به محض وارد شدن به سيستم چراغ هارد ديسک شما به طور متوالي روشن است.دليل آن هم در مورد دوم بيان ميشود.

2-ممکن است صفحات اچ تي ام ال زيادي را در کامپيوتر خود ذخيره کرده باشيد که اين ويروس به محض وارد شدن به کامپيوتر , خود را در داخل اين صفحات قرار ميدهد وهنگامي که شما اين ويروس را اگرچه به طور دستي از سيستم پاک ميکنيد ولي به محض باز کردن همين صفحات ويروس دوباره به داخل سيستم نفوذ کرده وبه قول معروف - روز از نو روزي از نو.

3-هنگ کردن سيستم آلوده به اين ويروس . کند شدن سرعت ويندوز شما و . . .

برنامه اي که توسط من نوشته شده شما را از شر اين ويروس نجات ميدهد و به شما کمک ميکند تا دوباره سيستم را از اين ويروس عاري کنيد :

* فايل اصلي را از پروسس ويندوز خارج کرده و به همين ترتيب از دايرکتوري سيستم شما حذف ميکند.

* تمامي صفحات اچ تي ام ال ذخيره شده در کامپيوترتان را اسکن کرده و از اين ويروس پاک ميکند.

 

Download File 1

Download File 2

جدول متغیرهای رشته ای در ویژوال سی :

Class

string
type

convert
to char*?

convert to
const char*?

convert to
wchar_t*?

convert to
const wchar_t*?

convert
to BSTR?

construct
from char*?

 

_bstr_t

BSTR

yes, cast1

yes, cast

yes, cast1

yes, cast

yes2

yes

 

_variant_t

BSTR

no

no

no

cast to
_bstr_t3

cast to
_bstr_t3

yes

 

string

MBCS

no

yes, c_str()
method

no

no

no

yes

 

wstring

Unicode

no

no

no

yes, c_str()
method

no

no

 

CComBSTR

BSTR

no

no

no

yes, cast
to BSTR

yes, cast

yes

 

CComVariant

BSTR

no

no

no

yes4

yes4

yes

 

CString

TCHAR

no6

in MBCS
builds, cast

no6

in Unicode
builds, cast

no5

yes

 

COleVariant

BSTR

no

no

no

yes4

yes4

in MBCS builds

 

 

 داده های رشته ای در ویژوال سی , به دسته های گوناگونی تقسیم میشوند. حال در اینجا این سوال مطرح میگردد که آیا همه این متغیرها قابل تبدیل به همدیگر هستند؟ از این رو جدولی که در شکل بالا مشاهده میکنید به شما نشان خواهد داد که این داده ها در زمینه تبدیل به همدیگر چقدر انعطاف پذیری دارند. توجه نمایید ...

Encrypt چیست؟ Decrypt چیست؟

در برخی از مواقع جهت رعایت کردن امنیت داده های خود ناچاریم که آنها را به صورتی در خروجی چاپ نماییم تا از دسترس دیگران در امان بماند. به عنوان مثال  برای حرف .آ. که اگر بخواهیم آنرا غیر قابل خواندن برای مخاطب کنیم میتوانیم از راه های متعددی استفده نماییم. مثلا میتوانیم اشاره گری از کاراکترها را به اندازه واحدی از اینتجر آن را بیفزاییم یا از آن کم کنیم. دقت کنید :

char * Decrypt ;   //my data

decrypt = name;  //copy my data to decrypt

decrypt-=j );          // add integer* )   

decrypt++;  // increase

این نمونه کوچکی از انکد و دیکد فایل بود . سورس کامل را میتوانید از لینک زیر دانلود نمایید :

DOWNLOAD FILE

بارگذاری فایل Gif

در این مبحث میخواهیم شما را با نحوه وارد کردن Gif در ویژوال سی آشنا سازیم. البته این سورس بیشتر به زبان سی پلاس پلاس است تا ویژوال آن . ولی میتوانید با ویژوال نیز آن را کامپایل نمایید . از آنجا که در زبان ویژوال ابزار لازم جهت لود کردن بیت مپ و گیف موجود میباشد ولی با ارائه این سورس شما را با جزییات بیشتر این فرایند آشنا خواهیم کرد.

 

DOWNLOAD FILE

 

                                                                   

بازی سیب یا Apple Game !

این بازی را که خیلی هیجان انگیز و زیباست , خودم به زبان ویژوال سی نوشته ام .در این بازی که شما سعی میکنید سیب ها را جمع آوری کنید, مواظب باشید تا سیب های از دست رفته بیش از ۸ عدد نشود که میتوانید با جمع آوری ۳ آدمک سیب های از دست رفته را به صفر برسانید. خلاصه بازی زیبا و فکری خوبی است که پیشنهاد میکنم آن را دانلود نمایید . در ضمن سورس این بازی را هم از لینک زیر میتوانید دانلود نمایید...

DOWNLOAD FILE ! Game

DOWNLOAD Source

سورس بازی پازل version 2.0

همان طوری که قول داده بودم سورس بازی پازل را در سایت قرار دادم . در ضمن دوستانی که از دانلود سورس برنامه خودم توی سایت codeproject مشکل داشتند میتوانند مستقیما از لینک زیر دانلود نمایند. setup یا دموی این بازی هم داخل همین سایت در قسمت ,مطالب گفته شده قرار دارد که میتوانید دانلود نمایید :

DOWNLOAD File

یک پازل دیگر به زبان ویژوال سی :

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

 

DOWNLOAD FILE

 

                                                               

یک برنامه سرگرم کننده :

در اين بخش جهت رفع خستگي شما يك برنامه ساده و خنده دار را توضيح خواهيم داد. در اين برنامه كه شما قصد اين را داريد كه بر روي يك دكمه واقع در روي پنجره كليك نماييد, ولي خود برنامه اجازه اين كار را به شما نخواهد داد!!! توضيح اين برنامه اين :
 
ابتدا از کلاس CWnd يک والد يا parent گرفته و بوسيله اين کار parent يک پنجره را از دسکتاپ بطور پيش فرض ميگيريم. حال يک rect مورد پيش فرض را در نظر گرفته , واين rect همان پهناي پنجره ما ميباشد يعني parent يا والد ماست. يک rect پيش فرض ديگر را در نظر گرفته و اين را rect باتون يا دکمه خود ميدانيم. بعد مرکز اين دکمه را بدست آورده ودر مقدار Center قرار ميدهيم. پهنا وعمق اين باتون را بدست آورده و در CriticalSize ذخيره مينماييم. و سپس rect قبلي دکمه خود را در rect  جديد به نام NewButtonRect ذخيره ميکنيم.
 
; ()CWnd* pParent = GetParent(); if (!pParent) pParent = GetDesktopWindow
;(CRect ParentRect; pParent->GetClientRect(ParentRect
 
 
; ()CRect ButtonRect; GetWindowRect(ButtonRect); pParent->ScreenToClient(ButtonRect); CPoint Center = ButtonRect.CenterPoint
 
; CSize CriticalSize(ButtonRect.Width()/6, ButtonRect.Height()/6); CRect NewButtonRect = ButtonRect
 
در اينجا با دستور if ميگوييم :اگر مختصات CriticalSize در  xها از مختصات xهاي موس کم شود و حاصل اين عبارت از مختصات مرکز دکمه در محور xها بيشتر شود...و نيز اگر قسمت چپ پنجره window ,از جمع با اندازه پهناي دکمه, کمتر شود از قسمت چپي يا قسمت محور xهاي دکمه:: آنگاه , مختصات xهاي موس
از قسمت راستي دکمه و يا از محور xهاي دکمه در جهت مثبت ها , کم کن و مقدار اين عبارت را يکي يکي به rect جديد دکمه بيفزا.
 
 }( if (point.x - CriticalSize.cx > Center.x)
 
(if (ButtonRect.left > ParentRect.left + ButtonRect.Width() + m_nJumpDistance
}
;(NewButtonRect -= CSize(ButtonRect.right - point.x + m_nJumpDistance, 0
 
ويا بلعکس:
else
}
;(NewButtonRect += CSize(point.x - ButtonRect.left + m_nJumpDistance, 0
 
به همين ترتيب همين دستور براي محور هاي yها, هم انجام ميشود وموقعيت بالا وپايين دکمه سنجيده وسپس مقادير حاصله از اين سنجش از rect دکمه کم ويا زياد ميگردد والي آخر... و در آخر هم با تابع زير rect جديد دکمه تغيير محل ميابد:
 
;(MoveWindow(NewButtonRect
ميتوانيد سورس و هدر اين برنامه را از زير دانلود نماييد.
 
Download File

نحوه کار کردن با فایل دیالوگ :

 
در اينجا ميخواهيم شما را با نحوه چگونگي کار با فايل ها و طريقه جستجو کردن کلمه مورد نظر خود در درون فايل ها در ,ويژوال سي را براي شما بيان کنيم.در اين مبحث که ما فايل خود را از کلاس CFILE مشتق نموديم خواهيم توانست رشته هاي خود را مرتب نموده ذخيره کرده و بر اساس اعداد جستجو کنيم. در VC چندين کلاس براي کار با فيل ها وجود دارند ولي در اينجا ما ميخواهيم با اين کلاس برنامه خود را شروع کنيم. خوب براي شروع کار از کلاس CFILE يک فايل را ايجاد کرده وبعد از انتخاب مسير و نوع فلگ ,برنامه را جهت ايجاد فايل تست مينماييم.
 
;(MyFile.Open("c:\\database.dat", CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate
 
خوب حال نوبت به قرار دادن رشته هاي مورد نظر در ان مي باشد. اما قبل از آن ميخواهم بدانم که از خط زير چه استنباط ميکنيد؟
 
;()MyFile.SeekToEnd
;"     " +m_EDIT_IDNumber=m_EDIT_IDNumber
;(m_EDIT_IDNumber=m_EDIT_IDNumber.Left(5
بله درست است , ماموقعيت فايل را به انتهاي آن بردهايم چرا که بتوانيم داده هاي خود را تا انتهاي فايل بچينيم.خط بعد ميگويد که اولين داده ما که عدد هم هست 5 کاراکتر بعد از آن راخالي قرار بده ,چون اينگونه ما ترتيب قرار دادن رشته ها را در فايل انتخاب نموده ايم . حال ميتوانيم به دلخواه بعد از عدد مورد نظر که 5 کاراکتر بعد از آن خالي است يک رشته ديگر قرار دهيم و الي آخر... خط بعدي هم ميگويد که  از قسمت چپ اولين وارده ما 5 کاراکتر خالي است.به همين ترتيب تا آخر ميتوانيم 5 تا 5تا يا بيشتر فضاي خالي بين هر داده وارد کنيم. ما در اينجا براي نحوه جستجو اين کار را انجام داده ايم. بعد از انتخاب فيلد ها به دلخواه و نحوه قرار گيري آنها در فايل مورد نظر ميتوانيم ان را ذخيره کنيم با عمل زير:
 
  ........)MyFile.Write
در مرحله بعد بايد بتوانيم در داخل فايل خود به جلو ويا به عقب حرکت کنيم. مانند پايگاه داده ها. براي اين کار ما بايد طول فايل را گرفته وچون موقع نوشتن در فايلمان تعداد کاراکتر ها را 43 قرار داده ايم , بايد انرا بر 43 تقسيم نماييم . مقدار برگشتي اين حاصل برابر با آخرين رکورد ماست. بعد از آن موقعيت فايل را به ابتداي ان اورده و ارگومان دوم ان را هم برابر با CFile::current قرار ميدهيم .يعني ميخواهيم بگوييم که به فايل مورد نظر برگردد که ما ميخواهيم. سپس به اندازه 43 بافر را از آن خوانده. براي اينکه مبدل به رشته کنيم بافر مورد نظر را در STRING قرار ميدهيم  و در پايان هم موقعيت قرارگيري داده هايمان در فايل را به برنامه ميگوييم:
 
 
}(if(RecordPointer > MyFile.GetLength()/43
;("MessageBox("End of file
 {else
 
;MyFile.Seek(0,CFile::current); MyFile.Read(MyBuffer,43); MyString=MyBuffer
; (m_EDIT_IDNumber=MyString.Left(5); m_EDIT_FirstName=MyString.Mid(5,15); m_EDIT_LastName=MyString.Mid(20,20
;(m_EDIT_MiddleInitial=MyString.Mid(40,1
 
 
اما براي جستجوي خودمان چي؟ خوب در اينجا هم به صورت باينري ما SEARCH ميزنيم .طول فايل را مانند قبل گرفته ومقدار برگشتي آن برابر با انتهاي فايل ميباشد, در خط زير اين روش جستجو را باينري مي ناميم که سرعت بالايي را هم دارد و عمل جستجو با حداقل افت زمان انجام ميگيرد:
;Looking=Starting+(Ending-Starting)/2
 
در اينجا Ending اخر فايل و Starting نقطه شروع فايل است. الگوريتم به اين صورت است که فايل را به دو قسمت کرده و رشته اي را که در قسمت چپ فايل ما باشد به هنگام پيدا کردن ديگر قسمت راست فايل را جستجو نميکند و اين از علل سرعت بالاي آن است. بعد از آن موقعيت قرار گيري در فايل از محل Looking به اندازه 43 بافر ميشود و از ابتدا قرار ميگيرد. حال با دستور IF ميگوييم , اگر مقدار بافر  فايل ما از اولين فيلد بزرگتر بود موقعيت فايل به آخر بيايد در غير اين صورت به نقطه صفر يا همان ابتداي فايل برود .
;MyFile.Seek(Looking*43,CFile::begin); MyFile.Read(MyBuffer,43); MyString=MyBuffer
 
}(if(MyString > m_EDIT_IDNumber
;Ending=Looking
 
{
 سپس با تابع زير يک کاراکتر را در شته مورد نظر جستجو کرده و اگر موفقيت آميز بود به ترتيب فيلد هاي ما را به ترتيب قرار گيري در فايل براي ما بياور:
 
(if ( _stricmp(MyString.Left(5),m_EDIT_IDNumber)==1
}
 
;(m_EDIT_IDNumber=MyString.Left(5); m_EDIT_FirstName=MyString.Mid(5,15
 
;(m_EDIT_LastName=MyString.Mid(20,20); m_EDIT_MiddleInitial=MyString.Mid(40,1
 
 مطالعه قسمت مرتب کردن داده هايمان را هم به عهده خودتان ميگذاريم .براي دانلود سورس و هدر برنامه ميتوانيد به قسمت زير مراجعه نماييد.
 
Download File

یک دفترچه تلفن ساده با Visual c :

 جهت آشنایی شما عزیزان با نحوه کار کردن با فایل ها(بخصوص باینری) در اینجا یک دفترچه تلفن زیبا و ساده را به شما تقدیم میکنیم.جهت دانلود فایل اجرایی این برنامه از قسمت زیر مراجعه کنید و برای  سورس این برنامه که در codeproject.com آپلود نموده ایم میتوانید مراجعه کنید .

                                                                              DOWNLOAD   

یک بازی پازل :

به عنوان سرگرمی برای خودم یک پازل نوشته ام . دوستان میتوانند این پازل را از قسمت زیر دانلود نمایند . در ضمن افرادی که سورس این پازل را میخواهند میتوانند با مراجعه به سایت codeproject.com  که من در آنجا آپلود نموده ام دانلود نمایند.                         

                                                                             DOWNLOAD

کار با Open Gl در visual c:

در اينجا ميخواهيم شما را با نحوه کار با OPEN GL در VC آشنا کنيم.مبحث OPEN GL در واقع مربوط به مباحث گرافيکي ويژوال سي ميباشد .ولي با اين تفاوت که اين قسمت بسيار پيچيده وسر در گم ميباشد ونيازمند ان است که فرد مطالعه زيادي را در اين باره داشته باشد. OPEN GL را در همه جا ديده ايم بسياري از بازي هايي که با ويژوال سي نوشته ميشوند از اين مورد سود ميبرند .چرا که مربوط به DIRECT X ميباشد که اين متعلق به گرافيک بالا مثلا در بازيها ميتوان آن را نام برد. ويژوال سي به خوبه اين قابليت را دارد که ميتواند به طور عالي با DIRECT X ,ترکيب شود و گرافيک بالايي را در برنامه ها بوجود اورد. همان طور که بسياري از بازي ها تحت همين موضوع در VC نوشته شده , و گرافيک بازي ها را چند برابر ميکند. در اينجا ميخواهيم مثال ساده اي از اين مبحث براي شما بزنيم تا موضوع کمي جا بيفتد. در اين مثال ما مخواهيم يک مثلث را به طريق OPEN GL ترسيم نماييم. براي شروع ابتدا , يک پهنايي را جهت رسم بر روي پنجره باز ميکنيم تا مثلث در آن ترسيم گردد:
 
;(CRect rect(7, 7, 300, 300
 
 
;(m_pDisplay->Create( NULL, NULL, WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE, rect, this, 0
خوب محيط ما آماده شد. حال نوبت به ترسيم خود مثلث ميشود . ممکن است بپرسيد اين m_pDisplay چيست؟ اين در واقع متغيري است از يک کلاس دلخواه که مارسم آن مثلث را در تابع ()OnPaint آن کلاس نوشته ايم. خوب قبل از هر چيز ابتدا بايد يک استراکچر يا ساختاري را تعريف کنيم,اي ساختار در واقع فرمت پيکسل ما را جهت ترسيم مثلث در اختيار ما ميگذارد.
 
  PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |  {PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0  
 
{
آرگومان سوم WINDOW را support ميکنند. آرگومان چهارم خود OPEN GL را, و آرگومان پنجم نوع رنگ در پروژمان و بالاخره آرگومان دو تا به اخر لايه بندي در ترسيم مان را ايجاد مينمايد. بعد از اين ساختار با کمک يک محتواي ابزار اين ساختار را در تابع ChoosePixelFormat جاسازي مينماييم. و بالاخره مقدار برگشتي اين تابع را که از نوع INT هست را در تابعي به نام SetPixelFormat قرار داده تا بتوانيم فرمت مورد نظر در ساختار خود را ايجاد و تنظيم نماييم.
 
iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0
 
(SetPixelFormat(hdc, iPixelFormat, &pfd
 
در تابع ()OnPaint که گفته شد حال ميتوانيم مثلث را ترسيم نماييم. ابتدا رنگ هاي پيش فرض در مثلث را پاک ميکنيم تا به حالت پيش فرض برگردد. بعد ازآن رنگ هاي مورد نظر را در مثلث ست يا تنظيم مينماييم, سپس محيط را براي رندر کردن اماده کرده و نيز رنگ ها را به صورت VERTEX يا عمودي به صورت 3F قرار ميدهيم. و در آخر هم جهت تغيير دادن جلو و عقب بافر در محتواي ابزار خود انرا در تابع SwapBuffers قرار داده وبا اين کار مثلث رسم ميگردد. شما ميتوانيد سورس و هدر اين برنامه را از زير دانلود نماييد.
 
Download File

نحوه ایجاد  FlatToolTip در visaul c:

در اين بخش مي خواهيم شما را با چگونگي كار با محتواي ابزار در Visual C++6 آشنا كنيم.محتواي ابزار يا (DC) يكي از پيچيده ترين ابزارها در Visual C++6ميباشد كه به وسيله اين ابزار مي توانيد اشياء را بطور واسطه با گرافيك يا بدون آن در برنامه هاي خود خلق كنيد. قبل از اينكه بتوانيد هر نوع گرافيكي را ترسيم نماييد بايد يك محواي ابزار براي نايش آن داشته باشيد. محتواي ابزار شامل اطلاعاتي دباره سيستم,برنامه و پنجره اي است كه گرافيك بايد روي آن رسم كند وچه ناحيه اي از آ ن را نمايش دهد.در ويندوز ترسيم گرافيك همواره در محتواي ابزار پنجره برنامه صورت ميگيرد. در هر لحظه ممكن است اين پنجره در حالت حداكثر وبلعكس باشد. در كليه اين حالت برنامه نويس كاري با وضعيت فعلي پنجره ندارد بلكه اين ويندوز است كه بايد تشخيص دهد چه مقدار از گرافيك را كجا ترسيم نمايد. در زير مثالي را براي شما مطرح خواهيم نمود وبراي شما توضيح خواهيم داد كه چگونه با اين ابزار كار كنيد.همه ما به خوبي پيغام هاي بالون شكل (BaloonToolTip) را در ويندوز به خوبي مشاهده نموده ايم. بالون ها جهبه پيغام هايي هستند كه بصورت گرافيكي وبه وسيله همين محتواي ابزار ايجاد ميگردند كه البته اين محتواي ابزار با چند تابع گرافيكي ديگر تركيب شده واين بالون را خلق ميكنند.  اين برنامه ما شبه بالون است يعني از لحاظ شناور بودن چيزي بين تول تيپ و بالون است.
خوب مي رويم سر اصل موضوع :: 
ما در واقع در اين برنامه از کلاس خود CToolTipCtrlEx استفاده خواهيم نمود ولي در مراحل جلوتر آن را تبديل به بالون ميکنيم. تمامي توابع وبطور کلي عملياتي را که براي ايجاد بالون خواهيم کرد را در خود تابع , ()onPaint مينويسيم. ابتدا متغيري از نوع POINT را ايجاد ميکنيم و موقعيت هر شي ء را به وسيله پوينتر موس به دست آورده و پهناي آن و اندازه آن را هنگامي که به دست آورديم آنوقت خواهيم توانست بالون خود را بر روي آن شيء مورد نظر ايجاد نماييم:
 
                                                                                                                                                                                       ;POINT Pos
;GetCursorPos(&Pos); CRect PRect; WindowFromPoint(Pos)->GetWindowRect(PRect); CPaintDC dc(this); Rect,R1; CRect WRect
 
سپس با فرمان زير موقعيت بالون را بر روي شيء مورد نظر آن هم در جاي معلوم شده تنظيم ميکنيم:
 
;Over=Pos.y >(PRect.top+(PRect.bottom-PRect.top)/2); Left=Pos.x <(PRect.left+(PRect.right-PRect.left)/2)
با دستور بالا ما به  وسيله موس گفته ايم که بالون ما در چه پهنايي از شيء نمايان شود. حال text مورد  نظر را با کمي ويرايش در بالون خود بايد ترسيم کنيم. متغيري از نوع String تعريف نموده و طول آن را بدست مياوريم بعد از آن ماداميکه تک تک اين رشته برگردانه شد تا آخر خط ,آنگاه سايز آن خط را جهت ست کردن با سايز شبه بالون ما به دست ميآوريم. تا اينجاي کار خسته نباشيد...
 
;("")CString Tip=_T(""),TStr=_T(""); GetWindowText(Tip); UINT Width=0; UINT Rows=1; UINT iPos=0; Tip.Replace(_T("\r"),_T
 
      (() while(iPos
'Tip.GetAt(iPos)=='\n  
       ; (CSize Sz1=dc.GetTextExtent(TStr
    ;Width=(Width > Sz1.cx) ? Width :  .cx
       حالا يک rect پيش فرض را در نظر گرفته وبعد از ايجاد , ميگوييم اگر مقدار ,Over باشد انگاه قسمت بالايي PRect را همواره برابر قسمت تحتاني rect مورد نظر در نظر بگير. با اين کار مقدار بالايي اين rect در مقدار پاييني rect پيش فرض ذخيره ميگردد سپس اين مقدار به دست آمده که همان قسمت تحتاني rect مورد نظر است , خاصيت TEXTMETRIC از ان کسر شده ودر WRect.top که پيش فرض است ذخيره ميگردد.با اين کار متن خود را به خاصيت TEXTMETRIC مبدل نموده و مقادير پهنا (rect) , را از بالا و از پايين تنظيم مينماييم تا شبه بالون ما شناور يا float بماند. ونيز اين اعمال وقتي که مقدار left باشد:
 
;(GetWindowRect(WRect); TEXTMETRIC TM; dc.GetTextMetrics(&TM
} if
;(WRect.bottom=PRect.top; WRect.top=WRect.bottom-(Rows*(TM.tmHeight)+4
 
 } else
;(WRect.top=PRect.bottom; WRect.bottom=WRect.top+(Rows*(TM.tmHeight)+4
 
حال سراغ محتواي ابزار ميرويم. يک پهنا, مستطيل يا rect را پيش فرض دانسته و پشت زمينه اين rect را رنگ کرده و همين پهناي رنگ شده را 15 واحد زياد نموده و دوباره با محتواي ابزار پشت زمينه اين rect  جديد را رنگ مکنيم. در مرحله بعد متن خود را با همين محتواي ابزار ترسيم مينماييم.
;GetClientRect(Rect); dc.FillSolidRect(Rect,m_bkColor); R1=Rect; R1.right=R1.left+15; dc.FillSolidRect(R1,m_leftColor); Rect.left=R1.right+1
 
;(dc.DrawText(Tip,Rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE
 
آرايه اي متشکل از پويينتر 18 تايي درست مينماييم.با اين کار يک چند ضلعي يا پوليگان با اين مقادير از پوينت ها ايجاد مينماييم چرا که چهار چوب اصلي ما در تول تيپ اينجا خلق ميشود. و ظرافت اصلي کار ما در اينجاست که به تناسب هر rect يک آرايه تعريف شده و گوشه هاي اين rect تنظيم ميگردد.شما با مراحل ساخت يک بالون آشنا شديد, ميتوانيد سورس اين برنامه را به همراه هدر آن دانلود نموده و خود بيشتر مطالعه نماييد.
 
Download File

آشنایی با زمان در visual c:

در اين بخش مي خواهيم با يکي از نمونه کارهايي که با time و يا همان زمان سرو کار داريم , شما را  آشنا کنيم. مبحث زمان  يا همان ساعت را در ويندوز ديده ايم و به طرق مختلف مي توانيم اين کار را در ويژوال سي انجام دهيم. از آنجايي که وارد کردن time  در VC به چند طريق انجام ميشود... مثلا نشان دادن زمان مانند بايوس يا مانند ويندوز ,ما قصد داريم شيوه نشان دادن زمان مانند ويندوز را به شما بياموزيم. خوب براي اين کار ابتدا ما يک متغير از نوع  SYSTEMTIME تعريف ميکنيم و متغير هاي زير را هم اضافه ميکنيم:
 
;SYSTEMTIME st
;[ TCHAR szTime[32
;[ TCHAR szDate[32
;HWND hwnd
بعد از انجام اين کارها سراغ بدنه اصلي تابع خود ميرويم که در زير آورده شده است:
 
;(GetLocalTime (&st
 
;((GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_USE_CP_ACP, &st, NULL, szTime, NUM_ELEMENTS(szTime
 
مقدار برگشتي اين تابع SZTIME ميباشد که با قرار دادن ان در يک EDITBOX و يا MESSAGEBOX ميتوان TIME را بدست آورد . البته اين زماني که ما به دست آورده ايم در هر لحظه که ما ديالوگ را باز ميکنيم زمان همان موقع از ويندوز را به ما نشان ميدهد و براي آنکه زمان را زنده نگه داريم نيازمند بکار گيري از TIMER هستيم که به  اين وسيله TIME  ما بطور زنده اجرا خواهد شد.
 
 
(OnTimer(UINT nIDEvent::
 
جهت ديدن سورس برنامه به همراه هدر آن را از زير ميتوانيد دانلود نماييد.
 
Download File