نمایش نتایج 1 تا 10 از 10

نام تاپیک: تعيين خودكار موقعيت كنترلها (anchor)

  1. #1
    کاربر دائمی آواتار a_mzadeh
    تاریخ عضویت
    تیر 1386
    محل زندگی
    مشهد
    سن
    37
    پست
    122

    تعيين خودكار موقعيت كنترلها (anchor)

    سلام،
    آيا در برنامه هاي mfc ما چيزي به نام anchor داريم كه با استفاده از اون بشه موقعيت و اندازه كنترلها رو در زمان تغيير اندازه فرم تعيين كرد؟
    اگر چنين چيزي نداريم، براي پياده سازي، بايد از كدوم message ديالوگ استفاده كرد.

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

    با تشكر...

  2. #2
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

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

    فکر میکنم تابع MoveWindow کارتون رو راه بندازه .در Msdn حتما ببینید.

    BOOL MoveWindow(

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


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

  3. #3

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

    همواره از پیام WM_SIZE یا WM_EXITSIZEMOVE برای بعد از ول کردن، یا WM_SIZING برای حین drag کردن استفاده کنید و سایز دیالوگ را دریافت و محاسبه کنید.
    سپس در هر لحظه با MoveWindow یا تابع SetWindowPos بدون تغییر موقعیت، فقط اندازه کنترل ها را متناسب با تغییرات دیالوگ، تغییر دهید.

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

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

  4. #4
    کاربر دائمی آواتار a_mzadeh
    تاریخ عضویت
    تیر 1386
    محل زندگی
    مشهد
    سن
    37
    پست
    122

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

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

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

  5. #5
    کاربر دائمی آواتار A_Salimi
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    North khorasan-Esfarayen
    پست
    372

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

    جواب سوالتون رو در این صفحه ببینید .


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

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


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

    virtual void OnCancel() {};
    آخرین ویرایش به وسیله A_Salimi : سه شنبه 10 دی 1387 در 17:31 عصر

  6. #6

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

    برای تنظیم خودکار صفحه (Automatic Layout Management) در MFC میتونید از کتابخانه ResizableLib MFC Automatic Layout Library که برنامه نویسش Paolo Messina هست و در Sourceforge و CodeProject موجود است استفاده کنید.

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

  7. #7

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

    برای کلید ESC هم باید OnCancel رو override کنید.

  8. #8
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

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

    نقل قول نوشته شده توسط C++‎Lover مشاهده تاپیک
    برای کلید ESC هم باید OnCancel رو override کنید.
    در مورد جلوگیری بسته شدن Modal Dialog ها با زدن کلید Enter باید OnOK را Override کنید و تو متد Override شده دیگه متد کلاس پایه را فراخوانی نکنید.
    جناب C++‎Lover اگه ناراحت نميشين ميگم :
    دوستمون گفتن كه
    (و البته اولین برنامه ای هست که با ویژوال سی نوشتم)
    به نظر شما override كردن توابع و يا توابع virtual مسائلي هستن كه تو اولين برخورد با برنامه هاي ويژوالي قابل هضم باشن؟ ميدونم كه شما از اطلاعات جامعي تو سي برخوردارين (از بحثهاتون با mehdi6755 مشخصه) ولي كاربرها رو هم بيزحمت در نظر بگيريد و لينك مطالبي كه محبت ميكنيد رو بذارين تا قابل مراجعه باشن و يا مثل A_Salimi حداقل هدر تابع رو بذاريد.
    بعنوان نمونه آقا نيما Message handeling رو با مثال و ذكر دقيق فلگ موردنظر و معني اينكار ذكر كردن.
    مثلا اگه ممكنه لينك اين كتابخونه رو بدين :
    کتابخانه ResizableLib MFC Automatic Layout Library
    البته اگه جسارت نكرده باشم.
    override كردن OnOk تو 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.
    }
    با تشكر.

  9. #9

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

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

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


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

  10. #10

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

    سپاسگزارم نیما جان.
    چیزایی که میخواستم بگم رو گفتی.

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

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

    پیروز باشید.
    آخرین ویرایش به وسیله C++‎Lover : جمعه 27 دی 1387 در 14:52 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •