PDA

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



hoax3r
پنج شنبه 17 مرداد 1387, 14:06 عصر
سلام

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

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

با تشکر

Nima_NF
پنج شنبه 17 مرداد 1387, 15:08 عصر
در دیالوگ باکس با SendDlgItemMessage ، مثلا:



DWORD begin , begin ;

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

hoax3r
جمعه 18 مرداد 1387, 00:27 صبح
ممنون ببت جوابتون، حالا اگه بخام در یک ادیت باکس دیگه با همین اطلاعات یک رشته رو select کنم چی کار کنم.

Nima_NF
جمعه 18 مرداد 1387, 11:12 صبح
اگر EditBox دیگری هم همین نوشته ها را دارد از EM_SETSEL به همان شکل قبل با دو متغیر بدست آمده عمل کنید.

hoax3r
جمعه 18 مرداد 1387, 23:35 عصر
ممنون بابت جواب باز به مشکلی برخودم، نمی دونم چطور بفهمم کاربر کی متن رو انتخاب کرده،
مثلا من از WM_LBUTTONUP استفاده کردم ولی جواب نمیده.
مشکل دیگمم استفاده از EM_SETSEL وقتی ازش استفاده میکنم طبق موقعیتی که میدم
رشته انتخاب نمیشه، میخوام کاربر قسمتی که انتخاب شده رو ببینه

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

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

Nima_NF
شنبه 19 مرداد 1387, 01:24 صبح
روش درست هست فقط دقت کنید که:

- انتخاب یک رشته در یک 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 خودکار ارسال می شود.

hoax3r
شنبه 19 مرداد 1387, 17:00 عصر
ممنون بابت توضیحات کاملتون، خوب من همین کارو کردم ادیت باکسارو به Rich Edit تبدیل کردم.
الان میتونم رنگ رشته و پس زمینشو که انتخاب شده رو عوض کنم.

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

با تشکر

Nima_NF
شنبه 19 مرداد 1387, 20:34 عصر
به این شکل پیام خودکار ارسال می شود و لازم نیست شما ارسال کنید:




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;

روش به شکل فوق هست

موفق باشید

hoax3r
شنبه 19 مرداد 1387, 22:31 عصر
این کد در کدوم قسمت باید وارد کنم DialogProc یا EditProc ، با توجه به نمونه اون کدی گزاشته بودم
نمیدونم هر جور امتحان میکنم وارد WM_NOTIFY نمیشه

ممنون

Nima_NF
یک شنبه 20 مرداد 1387, 01:17 صبح
وقتی Rich Edit را ساختید برایش یک والد در نظر گرفتید (احتمالا همان دیالوگ) ، به والد آن پیام ارسال می شود یعنی همان دیالوگ، به کد دسترسی ندارم تا دقیق تست کنم.

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

hoax3r
یک شنبه 20 مرداد 1387, 01:26 صبح
نمی دونم هر جور تست میکنم نمیشه تو حالت Debug هم برسی کردم وارد این پیام نمیشه
این نمونه کدمه اگه براتون زحمتی نیست یه نگاهی بکنید

با تشکر