|
Hi guys. I hope someone can help beacuse I am new at MFC and I am running out of time.
I need to write a MFC program which will simply read some text file and display it. The other thing is that I need to add a search option to the program. When you search some word, and if it is found in the displayed text it should be displayed in different color.
I have been fighting with this for a week and still no success. Can someone at least tell me how to start on the right track, wich base class should i use, how should I display the text, and finally, how to color the words that have been found?????
Any links or code samples would really help.......
thanx
|
|
|
|
|
Try using CFileDialog and search it up on MSDN
|
|
|
|
|
I used CFileDialog just to open the file. And I managed to display the text with DrawText function within a rectangule of variable dimensions. But how can I display let's say one word in yellow color and one word in red? I only managed to display whole text in one color.....
|
|
|
|
|
Are you using a CEdit editbox? I don't think it's possible to highlight in different colors in a CEdit. I haven't worked in MFC a lot, but you can try Rich Edit and see if there's a function in there.
|
|
|
|
|
Call TextOut or DrawText twice, with a call to SetTextColor before painting each of the two words.
|
|
|
|
|
the problem is that drawtext uses CRect in it. So i would than have to determine a exact rectangule position each time I want to change the color of the text. I don't think that this is a good solution.
Any other idea? if it is easier, do you know how to draw a rectangle over the word you searched for in the text?
|
|
|
|
|
I think there's no easier way, except maybe using CRichEditCtrl.
|
|
|
|
|
You can generate a project to do this in Visual Studio.
Almost all point and click (a tiny bit of typing).
Use the Add new project dialog -
Choose MFC application, give it a name
Do NOT choose Unicode option
Choose doc/view support and pick SDI or MDI.
Change the app file types/extensions to "Text", "txt", etc.
In the generated classes tab, change the view base class to CEditView
Build the project - you have a working text editor.
Edit the menu resource and add a "Find..." item to the "Edit" popup (give it the id "ID_EDIT_FIND")
Build the project - you now have text search capability.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I tried that, but the problem is that when i press the button search and let's say that searched word was "mfc", then in one click all mfc should be highlighted in the whole text.
I hope you understood what I need to achive. Me and my english language......
thanx
|
|
|
|
|
I thought so, but I thought I'd throw that out there just in case.
As others have mentioned, you'll need to render the text yourself or use a richedit control.
Either way you'll need to search the text and keep track of where the found items are.
If you use a richedit control, the control will do the rendering for you - all you need to do is
change the text color of all the found items.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
How do I keep track of where the founded words are exactly?
I used the SetWindowText to display the text and it works.
Do you have any idea how ti keep track of the founded words?
p.s. yes, i use now RichEditBox
|
|
|
|
|
Mark Salsbery wrote: Do NOT choose Unicode option
Now that's a refreshing change.
And I thought I was the only one.
|
|
|
|
|
LOL I must admit, using a Unicode build in that case required extra steps that
I was way too lazy to figure out (for free).
It was just a 3 minute text editor solution.
Cheers!
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I was little slow on the draw to offer solution but since I am working on similar stuff here is my 2 cents worth.
I ended up replacing CEditCtrl with CRichEditCtrl.
The color change is not too difficult. Here are my test functions straight from the MS documentation.
void CCC_RichEdit::OnReplaceAll( LPCTSTR lpszFind,
LPCTSTR lpszReplace, BOOL bCase, BOOL bWord )
{
int m_nNumReplaced;
CWaitCursor wait;
// no selection or different than what we are looking for
if (!FindText(lpszFind, bCase, bWord))
{
CRichEditView::OnTextNotFound( lpszFind );
return;
}
GetRichEditCtrl().HideSelection(TRUE, FALSE);
m_nNumReplaced = 0;
do
{
// change text color
OnCharUnderline();
//GetRichEditCtrl().SetBackgroundColor(FALSE, RGB(155,0, 0));
GetRichEditCtrl().ReplaceSel(lpszReplace);
m_nNumReplaced++; // Record the number of replacements
} while (FindTextSimple(lpszFind));
GetRichEditCtrl().HideSelection(FALSE, FALSE);
}
void CCC_RichEdit::OnCharUnderline ()
{
CHARFORMAT cf;
cf = GetCharFormatSelection ();
if (!(cf.dwMask & CFM_UNDERLINE) || !(cf.dwEffects & CFE_UNDERLINE))
{
cf.dwEffects = CFE_UNDERLINE;
}
else
cf.dwEffects = 0;
// change text color
cf.dwMask = CFM_UNDERLINE |CFM_COLOR ;
cf.crTextColor = RGB(255,0, 0);
SetCharFormat (cf);
}
This code does not change background color, work in progress.
Few observations - it seem that CFE_AUTOCOLOR is not set as default and does not have to be removed to make color changes.
Right now I cannot make "regular" pop up to work.
My question to the group - where is the documentation stating that double click on text selects it? Obviously I need to "override" that pretty useless action.
Thanks guys. Very helpful discussion.
|
|
|
|
|
hello,
How can i open a text file i excel using a schell command in c++.
if there is another it is ok.
10x regards
dghdfghdfghdfghdgh
|
|
|
|
|
ellllllllie wrote: How can i open a text file i excel using a schell command in c++.
Read the "Shell" API documentation. Note, it is NOT "Schell", you won't find it using that.
ellllllllie wrote: if there is another it is ok.
There is also the Excel Object Model. Again you should read the documentation
|
|
|
|
|
|
Isnt it "excel.exe" - sorry if I am wrong :p
--PerspX
"Nowadays, security guys break the Mac every single day. Every single day, they come out with a total exploit, your machine can be taken over totally. I dare anybody to do that once a month on the Windows machine." - Bill Gates
BSoD during a Win98 presentation
|
|
|
|
|
it isn't important: using ShellExecute you can open what file you want with the application you want (if it can). Look to its help.
Or explain more details if it doesn't help.
Russell
|
|
|
|
|
Hello. I have this DLL that is used by three programs. Now, I was requested to modify program1.exe and the DLL, without --of course-- affecting program2.exe and program3.exe. Now, I made changes in both program1.exe and the DLL. To this one, I added other classes and functions. The question is, do I have to recompile program1.exe and program2.exe?
AFAIK, I don't have to recompile since it is a dynamic-linking library... but, just to be sure.
Thanks in advance.
Hope is the negation of reality - Raistlin Majere
|
|
|
|
|
Generally, you do have to recompile if you want to be safe. However, unless you have changed the interfaces of those classes that used to be in the DLL before your modifications, you should run well without recompiling. Again, there are cases when this is not true. One example is if you access functions in that DLL by their ordinals - add or remove a function and you're probably in trouble.
Bottom line - you can never be 100% sure (that's why COM is better than regular DLLs), but you definitely may try leaving those executables as they are. Test empirically. If it works for you, it'll work for your users also.
|
|
|
|
|
Generally, no. If your changes added new function exports and did not change the ordinals of the existing ones, or if the other EXE's link functions by name and not ordinal, you should be OK.
Not so sure if you exported a new data item (variable), however...
Changing the binary layout of anything that is already being used by the DLL and EXEs may cause problems as well, because when the EXEs were compiled, they were built to expect a certain binary/size of any objects used in/by/from the DLL.
Peace!
-=- James Please rate this message - let me know if I helped or not!<HR> If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! See DeleteFXPFiles
|
|
|
|
|
Hello,
could someone help me to find a way to write an MDI application that draws lines with variable degree angle, the choice of the angle should be set in the same application?
Thanks a lot.
a novice in programming .
|
|
|
|
|
|
Thank you Maximilien!
ooops, really complicated...
I got older version of VS (vs2003.net), it is impossible to load the sample created with VS2005.net
|
|
|
|