|
Looking at all methods for richedit
there doesn't seem one to get the number of lines whitin the Client area
was wondering if the following code makes sense
TEXTMETRIC tm;
CDC* pDC = myrichedit->GetDC();
pDC->GetTextMetrics(&tm);
myrichedit->ReleaseDC(pDC);
CRect r;
myrichedit->GetRect(&r);
long numlines = (r.bottom - r.top) * tm.tmHeight;
|
|
|
|
|
you would need a division, not a multiplication.
and then there are some extra factors: rounding to an integer, and when applicable the height of a horizontal scrollbar.
|
|
|
|
|
Just had an idea setting the width and height in EN_REQUESTRESZIE notification handler
void CprogDebug::OnRequestResize( NMHDR* pNMHDR, LRESULT* pResult )
{
if(pNMHDR->code == EN_REQUESTRESIZ)
{
REQRESIZE* prr = (REQRESIZE*)pNMHDR;
TEXTMETRIC tm;
CDC* pDC = myedit->GetDC();
pDC->GetTextMetrics(&tm);
myedit->ReleaseDC(pDC);
myedit->numlines = ((prr->rc.bottom - prr->rc.top) / tm.tmHeight);
myedit->linewidth = ((prr->rc.left - prr->rc.right) / tm.tmAveCharWidth);
}
*pResult = NULL;
}
|
|
|
|
|
Greetings,
My problem is that I am spawning multiple modeless CPropertySheet dialogs from my application but the closure of the CPropertySheet dialog does not destroy the pages that have been added.
I can see from the trace statements that the destructors for the individual pages are called but if I try to re-spawn the CPropertySheet I find it already has pages added????
I have tried creating my own class and using the following code in the destructor
while (this->GetPageCount())
{
this->RemovePage(this->GetPageCount());
}
This compiles ok but fails on execution.
Where am I going wrong?
Many thanksAlan
|
|
|
|
|
Try this as the WM_DESTROY handler for the property sheet -
BOOL CPropsSheet::DestroyWindow()
{
for (int p = GetPageCount () - 1;p > -1;p--)
RemovePage (p);
return CPropertySheet::DestroyWindow();
}
I suspect the problem lies in your RemovePage call. The page count page indices are 0-based; RemovePage(GetPageCount()) is trying to remove a non-existent page.
[edit]
edit for clarity
[/edit]L u n a t i c F r i n g e
modified on Tuesday, March 9, 2010 7:19 PM
|
|
|
|
|
Hi,
1.
aren't the tab pages numbered from 0 to count-1, which would mean you are (not) removing a non-existing page forever?
2.
you could remove the first tab page in a loop, until none remain. simpler code, the drawback is tab pages now could move on the screen while your loop executes.
|
|
|
|
|
Using the DestroyWindow seems to work fine and taking into accout the base for the count makes all the difference ( Doh!)
Thank you both.Alan
|
|
|
|
|
I've spent a lot of time trying to figure this out. I've never seen anything like this.
My main program uses a static library. Both the main program and static library are compiled with VC++ 2008. The static library contains a global variable which is accessed by the main program (I know it's generally considered bad practice, but I'm ok with the undefined initialization order). The global variable is of course defined only once (without the 'extern' keyword), and the 'extern' definition of it is in the relevant header file.
That global variable is a pointer to an object that is dynamically allocated.
The problem is this: While the control flow is in the main program, the global variable is accessible and valid, put the variables of the object it points to (which was dynamically allocated) are empty (set to 0)! This is so weird. Immediately when the control flow is back in the static library, the variables of the object that the global variables point to are ok again.
The global variable (which is a pointer) points to exactly the same memory address both when control flow is in the main program and in the static library.
As if that's not weird enough, during runtime, the debugging "Watch" feature of VC++ 2008 shows that the variables of the object pointed to by the global variable are ok! Only by assigning those problematic variables to other variables I can see that their value is messed up.
Anybody ever experienced anything like this?
Thanks!!!!
|
|
|
|
|
OK, if I understand, you have:
SomeClass.h which contains a declaration of SomeClass and extern SomeClass *globalPtr; This header is used both by your main program and static library.
SomeClass.cpp which contains the implementation of SomeClass and SomeClass *globalPtr = new SomeClass(); This file is only in the static library.
The public data members of *globalPtr do not appear valid in the context of code in the main app.
I would carefully compare the compiler options for the two modules for any discrepancy that might conceivably produce different object layouts.Please do not read this signature.
|
|
|
|
|
Avi you're a genius!! It worked. The problem was that the static library was compiled with "Use Multi-Byte Character Set" and the main program was compiled with "Use Unicode Character Set".
Turns out that the static library linkage is way more fragile than I thought.
Thank you so much Avi! I've been stuck on that problem for a while.
Ofermodified on Tuesday, March 9, 2010 4:46 PM
|
|
|
|
|
how do i create & place a text file named names.dat with names into a directory with an executable file? here are the names that i want to put into the file.:
"Collins, Bill", "Smith, Bart", "Allen, Jim",
"Griffin, Jim", "Stamey, Marty", "Rose, Geri",
"Taylor, Terri", "Johnson, Jill", "Allison, Jeff",
"Looney, Joe", "Wolfe, Bill", "James, Jean",
"Weaver, Jim", "Pore, Bob", "Rutherford, Greg",
"Javens, Renee", "Harrison, Rose", "Setzer, Cathy",
"Pike, Gordon", "Holland, Beth"
|
|
|
|
|
hmmm
- Create the file with you favorite text editor.
- Save the file in the appropriate directory.
If you mean copy the file when you "build" your application, then you could use a post-build event to copy the file (that you manually created) to the destination path (or whatever the name of the variable defined in the post-event editor dialog).
If it's something else, then you need to be more clear in what you want to do.
M.Watched code never compiles.
|
|
|
|
|
CreateFile , WriteFile and CloseHandle will create the text file for you. Where the file is created is determined by the full path that you specify for the lpFileName parameter to CreateFile .
If you mean you want to create this in the same folder of the EXE from which you're creating the text file, it is usually enough to just pass the name of the file without the path as the lpFileName parameter.
Or you can also get the path where the EXE resides using GetModuleFileName and then use PathRemoveFileSpec or _tsplitpath to strip the filename and get the path alone.
|
|
|
|
|
Hello! I have taken up reading "Exploring C++ by Apress" due to my school not even teaching C++ (nice huh? They teach Java, C#, VB, but not C++). I current do all of my programming in C# but I would like to learn C++ since it seems you can do more with it (especially with different platforms).
On a project it wants me to do is create a program that basically calculates the BMI of persons and displays a list at the end of inputting all the information. I'm not to the displaying yet, but I have a problem with just entering a name.
It seems if you enter a single word for the name it works fine, but if I were to enter my first and last name (seperated by a space) it failed with this error code:
Name: Jacob Dixon
Height (cm): /Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/dlight2/bin/nativeexecution/dorun.sh: line 33: 9387 Floating point exceptionsh "${SHFILE}"
Press [Enter] to close the terminal ...
Problem is it goes to the Height (cm) but it never ask me to enter anything. All I did in that example up there was enter my name and press enter.
Here is my code:
void AskInformation(vector<int>& heights,
vector<int>& weights,
vector<int>& bmis,
vector<string>& names,
vector<char>& sexes) {
string name;
int height(0);
int weight(0);
int bmi(0);
char sex('?');
cout << "Name: ";
cin >> name;
cout << "Height (cm): ";
cin >> height;
cout << "Weight (kg): ";
cin >> weight;
cout << "Sex (m or f): ";
cin >> sex;
names.push_back(name);
heights.push_back(height);
weights.push_back(weight);
sexes.push_back(sex);
bmi = ComputeBMI(weight, height);
bmis.push_back(bmi);
cout << "Your BMI is: " << bmi << endl << endl;
}
int main() {
vector<int> heights;
vector<int> weights;
vector<int> bmis;
vector<string> names;
vector<char> sexes;
for (int i(0); i < 6; ++i) {
AskInformation(heights, weights, bmis, names, sexes);
}
return (EXIT_SUCCESS);
}
|
|
|
|
|
things to note :
- Use a structure (or class) to hold each person data :
class Person<br />
{ <br />
int height;<br />
int weight;<br />
int bmi;<br />
string name;<br />
strign sex;<br />
};<br />
- Use 1 vector of the above class/struct instead of having different vectors (easier to manage in the long run).
std::vector<Person> personVector;
- for reading the name (first and last name) , use :
getline(std::cin, name );
Other than that I was able to make it work.
MaxWatched code never compiles.
|
|
|
|
|
I figured a structure would of been better in this case... what I would have done with C# but the book hasn't covered structures yet. It wanted me to use vectors.
getline worked perfect. I'm still curious why just plain ol (cin >> name) caused it to act like that? I will use getline for now on. (Book hasn't mentioned it yet either).
Thanks for the help!
|
|
|
|
|
The >> operator stops on whitespace, so the second word of the name was left in the input buffer for the next call.
|
|
|
|
|
Hi,
Then documentation on MSDN says that FindText
will return the Zero based charcter position
of the text
If what I am searching for is currently not
viewable
would I have to know how many characters
there are in a line of my RichEdit control
to scroll and make it viewable
|
|
|
|
|
You can use CRichEditCtrl::SetSel after FindText so that scrolling will be done automatically.
|
|
|
|
|
I'm writing a console app that uses MessageBox. At runtime I'm trying to use TaskDialog instead, if the OS has the proper 6.1 version of comctl32.dll (Vista or Win7). I'm using the MSDN approach in http://msdn.microsoft.com/en-us/library/bb776779(VS.85).aspx. In order to make TaskDialog work at all (on the OS that supports it), I have to add these two lines, else I get "ordinal 344 could not be located" when I call TaskDialog on a supporting OS.
#pragma comment(lib, "comctl32.lib") // For TaskDialog
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
However, on a non-supporting OS (XP), adding the manifestdependency causes the original MessageBox code to fail - it beeps, but never brings up the diaglog at all. This occurs even if I completely remove any TaskDialog code. What is wrong?
|
|
|
|
|
Hi All
How to implement search functionality to text on the editbox#sanroop#
|
|
|
|
|
Your question makes little sense, please try and explain what you are trying to achieve. txtspeak is the realm of 9 year old children, not developers. Christian Graus
|
|
|
|
|
The found index or (-1) will be returned :
int CYourWnd::TryToFindInBox(const CString& cszWhat)
CString cszBoxText;
GetDlgItemText(IDC_EDIT1, cszBoxText);
return cszBoxText.Find(cszWhat);
} Check your definition of Irrationality[ ^]
1 - Avicenna
5 - Hubbard
3 - Own definition
|
|
|
|
|
In addition to what Eugen Podsypalnikov mentioned, may be you can use EM_SETSEL message to highlight the selected text.
Other option would be to use a Rich Edit control and EM_FINDTEXTEX message.
|
|
|
|
|
I have Developed an application using VC++ 10 (VS 2010 RC) to create a document/view architecture with Ribbon Menus and a Outlook Bar pane with (CMFCOutlookBarTabCtrl) The First time I have created the bar it appears like what my codes were implemented it but after I have customize The bar in running Mode. I can't see changes I have made in code after rebuilding the application. It seems that It save the previous state of outlook bar. what should I do to so that I could see it in the way my code implements.
|
|
|
|