select کردن قسمتی از رشته در Edit Box
سلام
در حال ساخت برنامه ای هستم ولی به مشکلی بر خوردم، این برنامه چنتا ادیت باکس داره
میخوام وقتی کاربر بخشی از متن یکی از ادیت باکسارو انتخاب کرد در یک ادیت باکس دیگه
رشته ی انتخاب بشه.
خودم یه جستجویی کردم فهمیدم میشه از پیام EM_GETSEL برای فهمیدن موقعیی که رشته انتخاب شده
استفاده کرد. ولی نمی دونم چطور وقتی کاربر رشته رو انتخاب کرد من از پیام EM_GETSEL استفاده کنم.
ممنون میشم راهنمایی کنید.
کامپایلر VC++ 2005، به صورت Win32
با تشکر
نقل قول: select کردن قسمتی از رشته در Edit Box
در دیالوگ باکس با SendDlgItemMessage ، مثلا:
DWORD begin , begin ;
SendDlgItemMessage(hDlg, IDC_EDIT, EM_GETSEL,
(WPARAM) &begin , (LPARAM) &end);
نقل قول: select کردن قسمتی از رشته در Edit Box
ممنون ببت جوابتون، حالا اگه بخام در یک ادیت باکس دیگه با همین اطلاعات یک رشته رو select کنم چی کار کنم.
نقل قول: select کردن قسمتی از رشته در Edit Box
اگر EditBox دیگری هم همین نوشته ها را دارد از EM_SETSEL به همان شکل قبل با دو متغیر بدست آمده عمل کنید.
1 ضمیمه
نقل قول: select کردن قسمتی از رشته در Edit Box
ممنون بابت جواب باز به مشکلی برخودم، نمی دونم چطور بفهمم کاربر کی متن رو انتخاب کرده،
مثلا من از WM_LBUTTONUP استفاده کردم ولی جواب نمیده.
مشکل دیگمم استفاده از EM_SETSEL وقتی ازش استفاده میکنم طبق موقعیتی که میدم
رشته انتخاب نمیشه، میخوام کاربر قسمتی که انتخاب شده رو ببینه
مثلا این کدو ببینین، چکارش کنم که درست کار کنه
و ممنون بابت وقتی که میزارین، با تشکر
نقل قول: 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 خودکار ارسال می شود.
نقل قول: select کردن قسمتی از رشته در Edit Box
ممنون بابت توضیحات کاملتون، خوب من همین کارو کردم ادیت باکسارو به Rich Edit تبدیل کردم.
الان میتونم رنگ رشته و پس زمینشو که انتخاب شده رو عوض کنم.
ولی در استفاده از پیام ها مثل EN_SELCHANGE یا EN_CHANGE مشکل پیدا کردم،
به نظر میاد اصلا با شیوه ای که با ادیت باکس کار میکردم فرق میکنه، اگه مثالی در این زمینه دارید ممنون میشم بزارید.
با تشکر
نقل قول: 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;
روش به شکل فوق هست
موفق باشید
نقل قول: select کردن قسمتی از رشته در Edit Box
این کد در کدوم قسمت باید وارد کنم DialogProc یا EditProc ، با توجه به نمونه اون کدی گزاشته بودم
نمیدونم هر جور امتحان میکنم وارد WM_NOTIFY نمیشه
ممنون
نقل قول: select کردن قسمتی از رشته در Edit Box
وقتی Rich Edit را ساختید برایش یک والد در نظر گرفتید (احتمالا همان دیالوگ) ، به والد آن پیام ارسال می شود یعنی همان دیالوگ، به کد دسترسی ندارم تا دقیق تست کنم.
خودتان خط بعد از WM_NOTIFY (و قبل از if) راست کلیک کنید و سپس Debug ، سپس دستکاری در Rich Edit انجام دهید و ببینید وارد آن می شود.
1 ضمیمه
نقل قول: select کردن قسمتی از رشته در Edit Box
نمی دونم هر جور تست میکنم نمیشه تو حالت Debug هم برسی کردم وارد این پیام نمیشه
این نمونه کدمه اگه براتون زحمتی نیست یه نگاهی بکنید
با تشکر