PDA

View Full Version : سوال: تغییز فونت قسمتی از متن text box یا rich text



imi
دوشنبه 01 تیر 1388, 15:48 عصر
سلام
من می خوام مثل نرم افزار ورد قسمتی از نوشته رو که در یک textbox یا rech text فونتش رو عوض کنم. یا یک خط با رنگ دلخواه زیرش بکشم. باید چه کار کنم. به طور واضح تر:
1. با موس یه قسمتی از متن رو انتخاب می کنم و فونت دلخواه رو هم دارم. می خوام اون قسمت به فونت دلخواه من در بیاد. یا ایتالیک بشه.
2. بدون موس و با کد در برنامه چطور کار کنم؟ مثلا چطور از کاراکتر 5 تا 10 رو زیرش خط بکشیم.
ممنون

Nima_NF
دوشنبه 01 تیر 1388, 20:35 عصر
برنامه های پیشرفته مثل word سیستم طراحی شده خودشان را دارند و از editbox های معمولی استفاده نمی کنند، بلکه سفارشی editbox می سازند که همه گونه امکان در آن وجود دارد.

خوشبختانه RichEdit امکاناتی در اختیار قرار می دهد که در EditBox نیست، مانند تغییر فونت و رنگ و ...

مثلا اگر قرار هست بخش انتخاب شده خط زیر و bold داشته باشد از SetSelectionCharFormat استفاده کنید:




CHARFORMAT cf;

cf.dwMask = CFM_UNDERLINE | CFM_BOLD;
cf.dwEffects = CFE_BOLD | CFE_UNDERLINE;
RichEditCtrl1->SetSelectionCharFormat(cf);


اگر قرار هست بخشی از رشته تغییر رنگ دهد از SetDefaultCharFormat استفاده کنید و رشته را به قسمت های مختلف بشکنید و رسم کنید:



// Text part 1
RichEditCtrl1->SetSelectionCharFormat(cf);

// Text part 2
cf.dwMask = CFM_COLOR;
cf.crTextColor = RGB(255,0,0);
RichEditCtrl1->SetSelectionCharFormat(cf);

// ....

imi
سه شنبه 02 تیر 1388, 16:16 عصر
ممنون از جوابتون یه سوال دیگه داشتم.
چطور میشه روی همون rich text وقتی راست کلیک می کنیم بفهمیم روی کدوم کلمه راست کلیک شده. اگه بشه فهمید روی چندمین کاراکتر راست کلیک شده و اگه از قبل در موقع تایپ اول و آخر کلمه ها رو مکانشون رو داشته باشیم می تونیم این کار رو بکنیم.
پس چطور میشه فهمید راست کلیک روی چندمین کاراکتر انجام شده؟
یا اگه راه بهتری دارید من رو راهنمایی کنید.
بازم ممنون.

Nima_NF
سه شنبه 02 تیر 1388, 18:32 عصر
چیزی که به نظرم می آید این روش هست:
وقتی در جایی از آن راست کلیک می کنید، کرسر موس در آن نقطه قرار می گیرد که می توانید از استفاده کنید:



long StartPos, EndPos;
RichEditCtrl1->GetSel(StartPos, EndPos);

حال هر دو یکی هستند و به پنجره پیام راست کلیک ارسال می شود. برای اینکه پیام کیبرد را دریافت کنید، باید از طریق آن را بگیرید و سپس با SetEventMask پیام موس را اضافه کنید و فعال کنید (هنگام شروع برنامه):




pmyRichEditCtrl->SetEventMask(pmyRichEditCtrl->GetEventMask() | ENM_MOUSEEVENTS);



حال هر گاه راست کلیک شد در پیام WM_NOTIFY داخل پنجره والد که richedit دز آن قرار دارد پیام EN_MSGFILTER ارسال می شود که شامل تمامی پیام های مرسوم موس ،موقعیت موس و غیره هست.

سپس می توانید مثلا یک واحد یک واحد یک واحد جلو بروید (به راست و چپ) تا یک کلمه را پیدا کنید (تا رسیدن به space) و نهایتا با با GetTextRange آن را بگیرید:



// ... search...
RichEditCtrl1->GetTextRange(StartPos + num1 , EndPos + num2 , str);


در کل نوشتن یک کنترل EditBox سفارشی برای این جور کارها بهتر هست و همه چیز دست خودمان هست.