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

نام تاپیک: select کردن قسمتی از رشته در Edit Box

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

    select کردن قسمتی از رشته در Edit Box

    سلام

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

    کامپایلر VC++‎ 2005، به صورت Win32

    با تشکر

  2. #2

    نقل قول: select کردن قسمتی از رشته در Edit Box

    در دیالوگ باکس با SendDlgItemMessage ، مثلا:

    DWORD begin , begin ;

    SendDlgItemMessage(hDlg, IDC_EDIT, EM_GETSEL,
    (WPARAM) &begin , (LPARAM) &end);

  3. #3
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: select کردن قسمتی از رشته در Edit Box

    ممنون ببت جوابتون، حالا اگه بخام در یک ادیت باکس دیگه با همین اطلاعات یک رشته رو select کنم چی کار کنم.

  4. #4

    نقل قول: select کردن قسمتی از رشته در Edit Box

    اگر EditBox دیگری هم همین نوشته ها را دارد از EM_SETSEL به همان شکل قبل با دو متغیر بدست آمده عمل کنید.

  5. #5
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: select کردن قسمتی از رشته در Edit Box

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

    مثلا این کدو ببینین، چکارش کنم که درست کار کنه

    و ممنون بابت وقتی که میزارین، با تشکر
    فایل های ضمیمه فایل های ضمیمه

  6. #6

    نقل قول: select کردن قسمتی از رشته در Edit Box

    روش درست هست فقط دقت کنید که:

    - انتخاب یک رشته در یک editbox به این معنی هست که focus روی می باشد یا باید برود.

    - در SETSEL برخلاف GETSEL باید مقادیر را به تابع بفرستید نه آدرس آن ها را،پس بدون &

    - شما پیام را به دیالوگ باید بفرستید نه خود کنترل، hDlg کنترل هست، پس از GetParent استفاده کنید.

    LRESULT APIENTRY EditProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch(message)
    {
    case WM_LBUTTONUP:
    SetFocus( GetDlgItem(hDlg,IDC_INPUT ));
    SendDlgItemMessage(GetParent(hDlg), IDC_INPUT, EM_GETSEL,
    (WPARAM) &startPos, (LPARAM) &endPos);

    SetFocus( GetDlgItem(GetParent(hDlg),IDC_OUTPUT ));
    SendDlgItemMessage(GetParent(hDlg), IDC_OUTPUT, EM_SETSEL,
    (WPARAM) startPos, (LPARAM) endPos);
    break;
    }

    return CallWindowProc( OldEdit, hDlg, message, wParam, lParam);
    }

    - در نمونه کد فوق setfocus را سفارشی کنید تا بهتر عمل کند.

    - اگر می خواهید جلوه highlight روی نوشته ها دو editbox نمایش داده شود باید از خاصیت تغییر background نوشته یا تغییر رنگ سفارشی استفاده کنید و به نوعی این قابلیت را بسازید (در همان EditProc)

    - اگر به جای EditBox معمولی از یک Rich Edit استفاده کنید قابلیت های بیشتری دارد، مثلا با آن دیگر نیازی نیست رویداد راست کلیک را پیاده سازی کنید، بلکه پیام EN_SELCHANGE خودکار ارسال می شود.

  7. #7
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: select کردن قسمتی از رشته در Edit Box

    ممنون بابت توضیحات کاملتون، خوب من همین کارو کردم ادیت باکسارو به Rich Edit تبدیل کردم.
    الان میتونم رنگ رشته و پس زمینشو که انتخاب شده رو عوض کنم.

    ولی در استفاده از پیام ها مثل EN_SELCHANGE یا EN_CHANGE مشکل پیدا کردم،
    به نظر میاد اصلا با شیوه ای که با ادیت باکس کار میکردم فرق میکنه، اگه مثالی در این زمینه دارید ممنون میشم بزارید.

    با تشکر

  8. #8

    نقل قول: select کردن قسمتی از رشته در Edit Box

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


    case WM_NOTIFY:
    // -------------------------------------------
    // or use this :
    // NMHDR * nmhdr = (NMHDR*)lParam;
    // nmhdr ->idFrom == IDC_INPUT
    //-------------------------------------------------------

    if (((LPNMHDR) lParam)->idFrom == IDC_INPUT )
    {
    switch (((LPNMHDR) lParam)->code)
    {
    case EN_SELCHANGE :

    SELCHANGE * selStruct = (SELCHANGE*) lParam;

    // now selStruct is filled so use it, for example:
    // beg = selStruct->chrg->cpMin;
    // end = selStruct->chrg->cpMax;

    break;
    }
    }
    return 0;
    روش به شکل فوق هست

    موفق باشید

  9. #9
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: select کردن قسمتی از رشته در Edit Box

    این کد در کدوم قسمت باید وارد کنم DialogProc یا EditProc ، با توجه به نمونه اون کدی گزاشته بودم
    نمیدونم هر جور امتحان میکنم وارد WM_NOTIFY نمیشه

    ممنون

  10. #10

    نقل قول: select کردن قسمتی از رشته در Edit Box

    وقتی Rich Edit را ساختید برایش یک والد در نظر گرفتید (احتمالا همان دیالوگ) ، به والد آن پیام ارسال می شود یعنی همان دیالوگ، به کد دسترسی ندارم تا دقیق تست کنم.

    خودتان خط بعد از WM_NOTIFY (و قبل از if) راست کلیک کنید و سپس Debug ، سپس دستکاری در Rich Edit انجام دهید و ببینید وارد آن می شود.

  11. #11
    کاربر دائمی آواتار hoax3r
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تهران
    پست
    171

    نقل قول: select کردن قسمتی از رشته در Edit Box

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

    با تشکر
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله hoax3r : یک شنبه 20 مرداد 1387 در 15:46 عصر

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

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