مشاهده نسخه کامل
: تغییر مکان دیالوگ با استفاده از دستور :
cpplover
17-01-2008, 22:02
مدتی هست که قصد دارم یه message box متحرک بسازم یعنی قصد دارم با استفاده از تغییر دادن xpos و ypos (مثلا در یک حلقه for ) این کار رو انجام بدم و position دیالوگ رو تغییر بدم حالا ممکنه که بگید چه دستوری در visual c++2005 کار set کردن رو انجام میده ؟
با تشکر
با متد MoveWindow میتونین اینکار رو انجام بدین منتها چون باید مختصات چهار سمت پنجره رو بهش بدین , اول مختصات جاری رو به GetWindowRect میگیریم و بعد از جابجایی با متد MoveToXY , مختصات جدید رو با تابع MoveWindow اعمال میکنیم :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته این کد چون توی یکی از متد های کلاس Dialog نوشته شده خود Dialog رو جابجا میکنه. اگه شما کنترل دیگه ای مد نظرتون هست میتونین از متد های اون استفاده کنین.(مثلا MyControl->MoveWindow)
در ضمن رمتد های دیگه ای دیگه ای هم واسه این کار هست...
سلام!
روشی که دوستمون گفتن متاسفانه در مورد MessageBox کاربرد نداره.
چون در MFC و نظایر اون MessageBox یک Object یا کلاس نیست و صرفا یک تابع هست.
دو تا راه حل وجود داره :
1- یک فرم خودتون برای MessageBox بنویسین و به تعریف دیگه اون رو سفارشی کنین.
2- گرفتن Handle پنجره ی MessageBox و تغییر اون با استفاده از SetWindowPos
که من مورد دوم رو توضیح میدم :
در مرحله اول Timer Event برنامه رو فعال میکنیم . با استفاده از SetTimer در OnInitDialog
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
من یک Button روی فرم قرار دادم که با کلیک روی اون یک پیغام ظاهر میشه :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای تغییر وضعیت MessageBox نیاز به یک شمارنده هم داریم ، کافیه یک متغییر private از نوع
int به کلاس اضافه کنیم : (در فایل h)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مقدار این counter رو در OnInitDialog صفر در نظر می گیریم :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا به OnTimer کد زیر رو اضافه میکنیم :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یه توضیح کوتاه :
با استفاده از FindWindow دستگیره و یا Handle مربوط به پنجره ای که اسمش Message باشه
رو میگیریم. (دقت کنین که Caption پنجره ی MessageBox رو در FindWindow بنویسین.)
اگه این Handle درست بود ، با استفاده از SetForegroundWindow اون رو پیش زمینه می کنیم (به علت وجود یه Bug !)
و بعدش با استفاده از SetWindowPos محل اون رو تغییر میدیم.
دقت کنین که MessageBox از Screen خارج نشه!!
موفق باشین.
ظاهرا دوستمون میخواستن خودشون یک MessageBox بسازن و همونطور که گفتن position دیالوگ رو تغییر بدن نه اینکه MessageBox ی که ایجاد شده رو حرکت بدن. به اون خاطر من کد مربوط به حرکت دیالوگ رو گذاشتم...
cpplover
18-01-2008, 20:09
با سلام
هر دو روش از لحاظی زیبا و قابل تامل بودند
مثلا روش دوستمون m3hrz4d از لحاظ کوچک بودن عالی بود و من اون رو به صورت زیر به کار بردم
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
}
اما تنها عیبی که این روش داشت این بود که در زمان حرکت دیالوگ هیچ شیئی روی دیالوگ دیده نمی شد
روش دوستمون someone هم به خاطر استفاده از تایمر جالب بود اما من به توصیه ایشون دقت نکردم و در حین کار بسته شدن برنامه واسم غیر ممکن شد و کامپیوتر رو دستی restart کردم !!!
میشه بگید آی دی تایمر ما در اینجا چیه تا اون رو kill کنیم ؟
با تشکر
ظاهرا دوستمون میخواستن خودشون یک MessageBox بسازن و همونطور که گفتن position دیالوگ رو تغییر بدن نه اینکه MessageBox ی که ایجاد شده رو حرکت بدن. به اون خاطر من کد مربوط به حرکت دیالوگ رو گذاشتم...
بله ، درسته و من دقت نکردم.
-----------------------------------------------------------------------------------
اما تنها عیبی که این روش داشت این بود که در زمان حرکت دیالوگ هیچ شیئی روی دیالوگ دیده نمی شد
دلیلش به خاطر استفاده از حلقه هست. تا زمانی که برنامه از حلقه خارج نشه ، برنامه به هیچکدوم از Event ها توجه نمیکنه.
در اینجاست که بهتره به جای حلقه از Thread
استفاده بشه.
میشه بگید آی دی تایمر ما در اینجا چیه تا اون رو kill کنیم ؟
عدد یک 1
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.