|
But are taking whatever text is already present in the edit control and adding CRLF to the end of it?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
The text is included in the count for the cold I count as 1 character for porpouses of selection not 2 bytes
|
|
|
|
|
I misunderstood what you were attempting.
You are using the GetSel() method to get the starting and ending positions of the control's selected text, correct? I tried that and with all of the text in the control selected, I found that CR and LF are (like I would expect) considered two separate characters. In other words, start = 0 and end = 7.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
I use the Streamout api to get whatever is in the control the edit control has 4 lines at the end of each line is X0D0A CRLF I have to count the 0X0D0A as 1 character for the SetSel api when determining the pos I want to use in the selection
thanks
|
|
|
|
|
So your end game is just to programmatically insert/replace some characters some place in the edit control?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
modified 9-Mar-16 12:22pm.
|
|
|
|
|
I have 16 pieces of text in the 4 line edit control any one of whom I could potentially replace
|
|
|
|
|
I just tried this with an ordinary Edit control, and it returns both CR LF in the count.
|
|
|
|
|
You did not try this in a Multi Threaded Environment, as explained in the question previous of this
Bram van Kampen
|
|
|
|
|
Sorry, but I am not sure what relevance that has to the counting of characters.
|
|
|
|
|
Well,
This is Familiar, in particular with the multi threaded question you asked earlier.
MFC cannot realy handle multiple threads. No one seems to know why, I have asked the question before.
At any rate, the only way MFC objects can communicate between threads is with the Old Fashioned WDK Kernel Function ::SendMessage(hWnd, Param1,Param2);
In MFC you create your Message as WM_USER+(X), Create a Message Handler, and, manually add it to the message map.
Any attempt to call an MFC Object from a different thread than in which it was created always ultimately lead to failure.
The Symptoms are: Works, Add a Virtual Function: It stops Working
Hope this helps
Bram van Kampen
modified 9-Mar-16 21:08pm.
|
|
|
|
|
... and I don't think you meant to post this message to me.
|
|
|
|
|
|
Relevance?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
EM_GETSELTEXT is explicit
This message returns the number of characters copied, not including the terminating null character.
The call is terminated by the null character and if you have CR,LF they will count as characters
The return is a CHARACTER COUNT, if your edit box is unicode mode it still reflects the character NOT THE NUMBER OF BYTES.
Hence when providing a buffer you are best to use an array of TCHAR rather than a standard byte array to allow for size difference.
Also note when size a TCHAR array use _countof DO NOT use sizeof for the same reason. Standard unicode aware coding practice.
Several of the comments have confusion between CHARACTER and BYTE within the meaning of the windows API. No such confusion exists.
In vino veritas
modified 16-Mar-16 2:46am.
|
|
|
|
|
hello,
I had a confusion that why we can use :: sign in calling static member function of class.
while in the case of calling simple member function using :: sign shows error .. in c++.
Please explain .
|
|
|
|
|
Member functions need qualifiers in order for the compiler to know which function your code refers to. In the case of a static function the qualifer must be the class name, since static functions belong to the class: hence Class::Function() . For member functions the qualifer must be the instance reference, as non-static functions are attached to individual objects: hence object.Function() or objectpointer->Function() .
|
|
|
|
|
thank you so much for clearing my doubt
|
|
|
|
|
Dear Friend,
After adding all necessary message handler to support to edit label in CTreeView
void CMyTreeView::OnBeginLabelEdit( NMHDR* , LRESULT* pResult)
{
CTreeCtrl &ctlFiles = GetTreeCtrl();
ctlFiles.GetEditControl()->LimitText( 127 );
*pResult = 0;
}
void CMyTreeView::OnEndLabelEdit( NMHDR * pNMHDR, LRESULT * pResult )
{
*pResult = TRUE;
}
BOOL CMyTreeView::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_KEYDOWN )
{
CTreeCtrl &ctlFiles = GetTreeCtrl();
CEdit* edit = ctlFiles.GetEditControl();
if (edit)
{
if( GetKeyState( VK_CONTROL ) && pMsg->wParam == VK_C )
{
edit->Copy();
return TRUE;
}
if( GetKeyState( VK_CONTROL ) && pMsg->wParam == VK_V )
{
edit->Paste();
return TRUE;
}
if( GetKeyState( VK_CONTROL ) && pMsg->wParam == VK_X )
{
edit->Cut();
return TRUE;
}
if( GetKeyState( VK_CONTROL ) && pMsg->wParam == VK_Z )
{
edit->Undo();
return TRUE;
}
if( pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_CONTROL || pMsg->wParam == VK_INSERT )
{
edit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
return TRUE;
}
}
}
return CTreeView::PreTranslateMessage(pMsg);
}
If I press a character 'a' to 'z' and 'A' to 'z' then MFC throwing Assertion.
I don't know what I am missing out to avoid this issue.
Kindly help me on this.
Thanks,
S Shanmuga Raja
|
|
|
|
|
Which line does it occur on when you step through it, and what is the assertion being hit?
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment
"Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst
"I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
|
|
|
|
|
shanmugarajaa wrote: ...MFC throwing Assertion. Exactly what assertion is being thrown?
shanmugarajaa wrote: Kindly help me on this. Have you stepped through the code using the debugger?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
You should avoid overriding PreTranslateMessage ... in your case, you can solve more elegant your task overriding WM_CUT[^], WM_COPY[^], and WM_PASTE[^].
|
|
|
|
|
I have a dialog based MFC application that I am rewriting in VS2010 from its original VC++ 6.0 source. Everything works fine in VC++ 6.0
The main dialog contains many child dialogs (not pop-ups) in which one child dialog is used to draw a plot based on the values sent from main dialog. The main dialog calls a function (Draw_Points) within the child dialog and the child dialog draws it and it does as long as the plot hits the edge and then it calls OnPaint message to refresh the dialog so that it can start afresh from left.
void CPlotDlg::Draw_Points(double value1, double value2)
{
if(m_LastPoint1.x < (m_time_rect.right-2))
{
m_CurrentPoint1.x = m_LastPoint1.x + 1;
m_CurrentPoint2.x = m_LastPoint2.x + 1;
m_Data1[m_DataCounter] = value1;
m_Data2[m_DataCounter++] = value2;
CWnd *Ctrl = GetDlgItem(IDE_PLOTS);
CDC *cdc = Ctrl->GetDC();
HGDIOBJ original = NULL;
original = cdc->SelectObject(GetStockObject(DC_PEN));
cdc->SelectObject(pen1);
cdc->MoveTo(m_LastPoint1);
cdc->LineTo(m_CurrentPoint1);
cdc->SelectObject(pen2);
cdc->MoveTo(m_LastPoint2);
cdc->LineTo(m_CurrentPoint2);
cdc->SelectObject(original);
Ctrl->ReleaseDC(cdc);
m_LastPoint1 = m_CurrentPoint1;
m_LastPoint2 = m_CurrentPoint2;
}
else
{
OnPaint();
Reset_PlotData();
}
}
void CPlotDlg::OnPaint()
{
CPaintDC dc(this); if(m_BUpdate)
{
CDialogEx::OnPaint();
CWnd *Ctrl = GetDlgItem(IDE_PLOTS);
Ctrl->InvalidateRect(NULL,true);
Ctrl->UpdateWindow();
}
}
It crashes when the Draw_points function calls OnPaint function in its else section, and when OnPaint() function executes CPaintDC dc(this);
Any suggestions?
thanks
PKNT
|
|
|
|
|
|
Thanks for your reply Richard. Could you suggest a better way to refresh my child dialog edit control where I draw these lines?
PKNT
|
|
|
|
|
Well, you need to rethink your design. You should collect all the information related to the drawing as a result of user interaction, file processing etc. You then call InvalidateRect to tell Windows that your data has changed, and your window/client needs to be repainted. Then in the control you call your paint function in response to receiving a WM_PAINT message. It is at that point that you draw your lines, shapes, text etc.
|
|
|
|