|
Is it possible to simulate a carriage return in VC++? Basically I’m trying to have my application "push the enter key" on a specified event.
Thanks in advance for your help!
Rob
|
|
|
|
|
Do you want to add a carriage return to a text box, push OK, or what ?
Christian
#include "std_disclaimer.h"
People who love sausage and respect the law should never watch either one being made.
The things that come to those who wait are usually the things left by those who got there first.
|
|
|
|
|
Try
this->PostMessage(WM_OK);
Or if you want to SEE the click, your going to have get Spy++ out
and capture all the WM_COMMAND message & parameters and figure out
which one(s) to Post/Send to the window.
Julien.
|
|
|
|
|
To simulate a carriage return all you need to do is called CWnd::GetWindowText() giving the CString obj you want to fill. Next you append the "\n" (Newline Character in C/C++) to the end of the CString obj using the "+=" operator. Lastly, you use CWnd::SetWindowText().
This is for MFC only.
Check MSDN on how to use CWnd::GetWindowText(), the "+=" operator, and CWnd::SetWindowText().
|
|
|
|
|
Can anyone tell me how to convert a:
BYTE *btArray ==> CStringArray
I would really appreciate it.
Thanks in advance,
Dan
|
|
|
|
|
Hmm. I believe you need to convert it to a CString, not to a CStringArray.
CString is a string class (like the STL 'string'), while CStringArray is an array of strings (like an STL 'vector<string>').
I guess btArray is a pointer to an array of characters (a 'C' string).
To convert it to a CString, this should be enough:
CString s = btArray;
CStringArray can hold many CStrings, and it resizes dynamically.
You can, for example: CStringArray sa; sa.Add(s); sa.Add("Hello");
After this, sa[0] is a CString and you can do:
sa[0] = "SomeString";
printf("My String is: %s\n", (LPCTSTR)sa[0]);
Hope this helps,
Pavlos
|
|
|
|
|
Doesn't work...I get:
const CString& CString::operator=(LPCTSTR lpsz)
{
ASSERT(lpsz == NULL || AfxIsValidString(lpsz)); <=========== Error is here!
AssignCopy(SafeStrlen(lpsz), lpsz);
return *this;
}
HERE is an example of the code:
//BYTE btArr[3] = {67,245,67}; <========= I can see this!
BYTE *btArr = lpVal[3].Value.bin.lpb;
CString s = _T("");
s = btArr; <=========================== Error!
s = lpVal[3].Value.bin.lpb[0]; <======== Error!
MessageBox(0,s,"",0);
Thanks in advance,
Dan
|
|
|
|
|
>> AfxIsValidString(lpsz)
This function checks if the address you have passed in points to memory that your program has 'read' access to. This routine looks for a terminating NULL char, since all valid 'C' and windows strings must have terminating NULL. All characters between the starting address and the terminating NULL must be in valid 'read' access memory.
Looking at your samp,e code, you appear to be passing the address of an array that has no terminating NULL, so this is why the attempt to load the CString from this memory is failing.
The bigger question is why you want to load and array 'byte' data, which does not appear to be a valid string value, into a CString ??
|
|
|
|
|
I have written a program that processes mails from Outlook into a Database. I noticed that the Messages are being cut off after 255 characters. When reading the message text I am using:
"CString csBody = lpVal[3].Value.lpszA;" which gives be only 255. another value is:
"lpVal[3].Value.bin.lpb;" which returns a LPBYTE...see below (from MSDN). I have also looked at "lpVal[3].Value.bin.cb;" which returns "8792808"?? I am basically really confused!
typedef struct _SBinary
{
ULONG cb;
LPBYTE lpb;
} SBinary, FAR *LPSBinary;
Members
cb
Count of bytes in the lpb member.
lpb
Pointer to the PT_BINARY property value.
Thanks in advance,
Dan
|
|
|
|
|
Ok. You will need to rethink this, or approach things fromn another angle. The "lpVal[3].Value.bin.lpb" variable is NOT a suitable pointer to initialize a CString with. By definition, a CString is useful for holding NULL terminated plain text. It IS possible to make a CString hold binary info, but that's a topic for another day (and a much longer discussion!)
What you need to do first is find out why you only get 255 chars from the "lpVal[3].Value.lpszA" pointer. I don't knowe the Outlook format at all, but this sounds like the data you want - yet it's being truncated. Chase that down first.
If you find that you really do need to process the binary data in order to get the full body of text (sounds strange, but might be true), then I'd suggest the STL vector (or perhaps stringstream) as a better container for working with the binary data you want to process.
|
|
|
|
|
Thanks for you help...because I took a look from a far, I can now read the entire body of the message. The way I did this was first of all, I "Read the ____ing Manual". MAPI says that if you have a large message to read, you should do the following (I felt you deserved how I got it to work!:
hr = pmsgRoute->OpenProperty(PR_BODY, STGM_READ, (LPUNKNOWN FAR *) &lpstreamBody);
if(S_OK != GetScode(hr))
{
DebugTraceResult(OpenProperty, hr);
goto err;
}
hr = lpstreamBody->Stat(&statstg, STATFLAG_NONAME);
if(S_OK != GetScode(hr))
{
DebugTrace("IStream::Stat failed");
goto err;
}
Assert(statstg.cbSize.HighPart == 0);
if(MAPIAllocateBuffer(statstg.cbSize.LowPart + 1, (LPVOID FAR *) &lpszNoteText))
{
goto err;
}
hr = lpstreamBody->Read(lpszNoteText, statstg.cbSize.LowPart, &cb);
if(S_OK != GetScode(hr))
{
DebugTrace("IStream::Read failed");
goto err;
}
lpszNoteText[statstg.cbSize.LowPart] = '\0';
SetDlgItemText(hDlg, IDC_RTNOTE, lpszNoteText);
MAPIFreeBuffer(lpszNoteText);
lpszNoteText = NULL;
lpstreamBody->Release();
lpstreamBody = NULL;
Thanks in advance,
Dan
|
|
|
|
|
I have declared a pointer to a function like this :
double (*pF)(double);
I have a function in a class CTest declared like this : double CTest::Compute(double);
the following code : pF =&Compute, doesn't work ????
The message error is :
"& : illegal operation on bound member function expression"
for compiler the function nammed Compute is Virtual...
So, How can I point a class member function ???
Leon
|
|
|
|
|
in general, you can't use member functions with function pointers unless the function is declared "static".
-c
------------------------------
Smaller Animals Software, Inc.
http://www.smalleranimals.com
|
|
|
|
|
There is no need of assigning the address like pF = &Compute;
The right way is pF = Compute;
|
|
|
|
|
Because the type of the Compute function is double (CTest::*)(double) .
--Mike--
http://home.inreach.com/mdunn/
"Holding the away team at bay with a non-functioning phaser was an act of unmitigated gall. I admire gall."
-- Lt. Cmdr. Worf
|
|
|
|
|
Hi,
You need to write pF = Compute, and not pF =&Compute.
Lose the & .
I hope that helps
|
|
|
|
|
Member function are different from global / static functions because they have an implicit this pointer as argument.
You have to declare a pointer to a class member function like this:
double (CTest::*pF)(double);
Read pF is a ptr to a member of CTest with takes double and returns double.
To assign the member function to the pointer do this:
pF = CTest::Compute;
To call the member function you need an instance of the class (because of the needed this pointer):
CTest test;
CTest* pTest = &test;
The call looks like this:
(pTest->*pF)(42);
Oliver
|
|
|
|
|
I use a CStringList to store all my outputs and everytime I finish an operation, I save the output to this list and print the whole CStringList out to the screen. and I have a scrollbar to let user to scroll back to see some previous outputs.
I have a touchscreen and I use WindowProc in view.cpp to wait for the "touch" and extract the window message and get the touch coordinate. These coordinates will store in a CList and also save to the CStringList for output.
OK.....when I touch the screen, and my program keeps displaying the touch coordinate. But after awhile, something strange......sometimes...the screen scroll backward!!!!! sometimes, it cannot display any more touch(just hear the beep sound...but no more output...) Another example, I display some values from the touchscreen and using a loop to do it.....that means i can do it forever until I stop it. Sometimes.....after awhile, the output will "overlap"....and strange characters....
This situation is more worse and happen faster in Win9x...... WinNT is more stable...but this situation did happen too in WinNT.....
What's going on ?????
|
|
|
|
|
I am using a third-party product and I pass a device context to their function to print a bar code. The return value is the size of the bar code (height and width). There is no way for me to know the height and width of the bar code prior to this call. Is there some way to call this function to get the height and width and NOT actually draw the bar code? My current solution is to use CreateCompatibleDC, pass that handle to the function, and delete the DC once I have obtained the height and width. I would appreciate any better ideas.
|
|
|
|
|
That sounds like the right approach to me.
The only other thing you might try, and this might not work depending on what the function does, would be to set the clip region of the DC to something silly, so that the rendering would not be apparent - some thing like:
CRgn rgn;
rgn.CreateRectRgn(0,0,1,1);
DC.SelectObject(&rgn);
DC.SelectClipRgn(&rgn, RGN_COPY);
...
Thats the MFC version, assuming a CDC. Will be similar for straight GDI.
Your solution is safer, I think, but this might let you get by without creating another DC if the third party function doesn't mess with the clipping region.
|
|
|
|
|
Greetings,
I was wondering how can I have multiple fonts per line using DrawTextEX?
I am stuck using DrawTextEX instead of TextOut(which you can use the msdn example "Drawing text from diferent fonts on the same line) due to a proprietary set of sdk functions which I cannot change that are built on DrawtextEX.
An approach that I have taken is that I have divided each line into seperate segments of text based upon what each segment should have for a font. Any font changes, and I place it in a seperate segment (which is a string array for now).
I then loop through the array and change the font of the dc to what the segment requires, and then I do a "DrawTextExtentPoint32" on each segment(array position), and use that to create my rect size per line to output the text. Which I follow with a call that is similar to DrawtextEx for outputting my text.
The PROBLEM I am having is that the I can't seem to get each text segment to draw so that it blends seamlessly. So that some text's rects draw the text in a higher Ascent than others. The result gives a line of text that draws the text starting in the corner, so that if a segment of text is a smaller font size than the next the smaller font text will appear higher on the screen than the next one.
If anyone knows of a better way to do multiple fonts per line using DrawTextEX, or a way to fix my rect feel free to drop me a comment. I am stuck right now.
Thanks in advance for any help!
|
|
|
|
|
Try setting the DC's aligment mode with
SetTextAlign( dc, TA_BASELINE )
Hope this helps !
|
|
|
|
|
Thanks for the GREAT suggestion (I hadn't thought of that one), but unfortunately it causes the text to vanish if I have it anything but TA_TOP|TA_LEFT [The default from msdn]. Oh, well back to the drawing board.
|
|
|
|
|
Greetings all,
After many hours of sweat and tears I think I figured out a solution to my problem.
1.) First loop through all the fonts to find the largest font.
- Do a "GetTextExtent32()" to get the SIZE, and then do a "GetTextMetrics()".
SIZE MySize; TEXTMETRIC tm;
int nMaxAscent; int MaxLineHeight;
Now add the (MySize.cy + tm.tmDescent) together, and save them in a variable (MaxLineHeight).
Also save the tm.tmAscent in a variable (nMaxAscent).
2.) When you are drawing the font's segment, check to see if the size is less than the max font size.
- If it is smaller then figure out how much we need to offset the smaller font.
TEXTMETRIC CurrentAscent; // DO a "GetTextMetric" on your current font.
int nOffset = nMaxAscent - CurrentAscent;
Then use the offset with the rect's top.
Rect.top = Rect.top + nOffset;
3.) Finally add the descent the maxline height to the top of the rect to get the bottom.
rect.bottom = rect.top + nMaxLineHeight;
And now finally my text is lined up in a wonderful straight line!!!
It only took almost a whole day of work (and 4 mountain dews) to figure it out, SIGH!!!
Oh well, at least it works.
|
|
|
|
|
Lately my DS crashes consistently when I am closing the DS or randomly while working. The error messages are:
"The instruction at 0x77fca8ac referenced memory at 0x00000005. The memory could not be written."
After OK the above message the next one is :
"The instruction at 0x6c371351 referenced memory at 0x00000004. The memory could not be read."
I posted the addresses for example only. Anybody ran into this? I tried to reinstall VC++ (6.0) with no results, OS W2k.
Thanks
Mihail
|
|
|
|