PDA

View Full Version : سوال: تعيين خودكار موقعيت كنترلها (anchor)



a_mzadeh
دوشنبه 09 دی 1387, 22:25 عصر
سلام،
آيا در برنامه هاي mfc ما چيزي به نام anchor داريم كه با استفاده از اون بشه موقعيت و اندازه كنترلها رو در زمان تغيير اندازه فرم تعيين كرد؟
اگر چنين چيزي نداريم، براي پياده سازي، بايد از كدوم message ديالوگ استفاده كرد.

مي دونم اينكه چند تا سوال تو يه پست مطرح بشه، كار درستي نيست ولي ممنون ميشم اگر بفرمايين چطوري ميشه كاري كرد كه وقتي كاربر بر روي يك ديالوگ كليد اينتر رو ميزنه فرم بسته نشه.

با تشكر...

A_Salimi
دوشنبه 09 دی 1387, 23:40 عصر
فکر میکنم تابع MoveWindow کارتون رو راه بندازه .در Msdn حتما ببینید.



BOOL MoveWindow(

HWND hWnd,
int X,
int Y,
int nWidth,
int nHeight,
BOOL bRepaint
);



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

Nima_NF
سه شنبه 10 دی 1387, 01:53 صبح
همواره از پیام WM_SIZE یا WM_EXITSIZEMOVE برای بعد از ول کردن، یا WM_SIZING برای حین drag کردن استفاده کنید و سایز دیالوگ را دریافت و محاسبه کنید.
سپس در هر لحظه با MoveWindow یا تابع SetWindowPos بدون تغییر موقعیت، فقط اندازه کنترل ها را متناسب با تغییرات دیالوگ، تغییر دهید.

در QT این امکان به طور خود کار هست، اما در MFC باید همین طوری دستی پیاده سازی کنید.
ضمنا مثلا می توانید کلیه کنترل های child را با یک شمارش child پیدا کنید و سایز کنونی همه آن ها را به علاوه یا منهای مقدار مورد نیاز کنید، این طوری اتومات هم می شود.


وقتي كاربر بر روي يك ديالوگ كليد اينتر رو ميزنه فرم بسته نشه.وقتی فرم بسته می شود که مثلا focus روی کنترل exit یا ok باشد که عمل بسته شدن برنامه را انجام می دهند.
پس با تابع SetFocus (در هنگام باز شدن دیالوگ) focus را به مثلا خود دیالوگ بدهید نه بر روی button ها.

a_mzadeh
سه شنبه 10 دی 1387, 14:20 عصر
وقتی فرم بسته می شود که مثلا focus روی کنترل exit یا ok باشد که عمل بسته شدن برنامه را انجام می دهند.سلام, از شما دوست عزیز متشکرم.
برنامه ای که من نوشتم (و البته اولین برنامه ای هست که با ویژوال سی نوشتم) یک دیالوگ اصلی داره که از اون برای کنترل برنامه استفاده میشه. اولین کاری که من در طراحی این دیالوگ انجام دادم این بود که کلیدهای OK و Cancel رو از فرم حذف کردم, ولی وقتی که کلید اینتر یا Esc زده میشه, بدون در نظر گرفتن کنترلی که الآن فعال هست, برنامه بسته میشه. چرا و چطوری میشه مانع این کار شد؟ آیا با handle کردن کیبورد میشه این مشکل رو حل کرد؟

مجددا از شما تشکر می کنم...

A_Salimi
سه شنبه 10 دی 1387, 17:02 عصر
جواب سوالتون رو در این صفحه (http://www.codeproject.com/KB/dialog/DisableReturnEsc.aspx) ببینید .


البته اگر قصد غیر فعال کردن دکمه Esc را دارید میتوانید اول پیغام OnClose() را به برنامه اضافه کنید و داخل تابع آن را به صورت زیر تغییر دهید:



void CTestDlg::OnClose()
{
CDialog::OnCancel();
}


و OnCancelرا در هدر (.h ) اضافه نمایید.




virtual void OnCancel() {};

C++Lover
دوشنبه 16 دی 1387, 13:24 عصر
برای تنظیم خودکار صفحه (Automatic Layout Management) در MFC میتونید از کتابخانه ResizableLib MFC Automatic Layout Library که برنامه نویسش Paolo Messina هست و در Sourceforge و CodeProject موجود است استفاده کنید.

در مورد جلوگیری بسته شدن Modal Dialog ها با زدن کلید Enter باید OnOK را Override کنید و تو متد Override شده دیگه متد کلاس پایه را فراخوانی نکنید.

C++Lover
دوشنبه 16 دی 1387, 13:34 عصر
برای کلید ESC هم باید OnCancel رو override کنید.

Saeed_m_Farid
جمعه 27 دی 1387, 03:45 صبح
برای کلید ESC هم باید OnCancel رو override کنید.

در مورد جلوگیری بسته شدن Modal Dialog ها با زدن کلید Enter باید OnOK را Override کنید و تو متد Override شده دیگه متد کلاس پایه را فراخوانی نکنید.جناب C++Lover اگه ناراحت نميشين ميگم :
دوستمون گفتن كه
(و البته اولین برنامه ای هست که با ویژوال سی نوشتم) به نظر شما override كردن توابع و يا توابع virtual مسائلي هستن كه تو اولين برخورد با برنامه هاي ويژوالي قابل هضم باشن؟ ميدونم كه شما از اطلاعات جامعي تو سي برخوردارين (از بحثهاتون با mehdi6755 (http://barnamenevis.org/forum/member.php?u=41233) مشخصه) ولي كاربرها رو هم بيزحمت در نظر بگيريد و لينك مطالبي كه محبت ميكنيد رو بذارين تا قابل مراجعه باشن و يا مثل A_Salimi حداقل هدر تابع رو بذاريد.
بعنوان نمونه آقا نيما Message handeling رو با مثال و ذكر دقيق فلگ موردنظر و معني اينكار ذكر كردن.
مثلا اگه ممكنه لينك اين كتابخونه رو بدين :

کتابخانه ResizableLib MFC Automatic Layout Libraryالبته اگه جسارت نكرده باشم.
override كردن OnOk (http://msdn.microsoft.com/en-us/library/66b3y2ab%28VS.80%29.aspx) تو msdn:

/* MyDialog.cpp */
#include "MyDialog.h"

void CMyDialog::OnOK()
{
// TODO: Add extra validation here

// Ensure that your UI got the necessary input
// from the user before closing the dialog. The
// default OnOK will close this.
if ( m_nMyValue == 0 ) // Is a particular field still empty?
{
AfxMessageBox("Please enter a value for MyValue");
return; // Inform the user that he can't close the dialog without
// entering the necessary values and don't close the
// dialog.
}

CDialog::OnOK(); // This will close the dialog and DoModal will return.
}با تشكر.

Nima_NF
جمعه 27 دی 1387, 12:09 عصر
به نظر شما override كردن توابع و يا توابع virtual مسائلي هستن كه تو اولين برخورد با برنامه هاي ويژوالي قابل هضم باشن؟
در MFC کسی که اولین برنامه را می نویسد باید این موضوع را یاد گرفته باشد.
override کردن در MFC معمولا در اکثر موارد به صورت اتومات هست و با انتخاب پیام یا کلیک بر روی کنترل ها ایجاد می شود.


مثلا اگه ممكنه لينك اين كتابخونه رو بدين
اگر هرکسی نام کتابخانه ای را که ذکر کردند در google جستجو کند، اولین سایتی که نشان داده می شود لینک سورس کد آن هست. در این مورد ذکر لینک چندان مهم نبود.


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

C++Lover
جمعه 27 دی 1387, 14:20 عصر
سپاسگزارم نیما جان.
چیزایی که میخواستم بگم رو گفتی.

Saeed_m_Farid عزیز، من هم فکر میکنم معمولا کسی که در MFC برنامه نویسی میکنه مفهوم و روش Override کردن رو بلده. اگر کسی سوالی داشته باشه یا توضیح بیشتر بخواد فقط باید بگه و هر کدوم از دوستان هم که میتونه و وقت داره کمک میکنه.


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

پیروز باشید.