Re: OnPaint, SetWindowPos and recursion
If you ask me you are doing your resizing in the wrong place. You should do
it in response to WM_SETTEXT.
Something like this:
BEGIN_MESSAGE_MAP(CAutoSizeStaticCtrl, CStatic)
ON_MESSAGE(WM_SETTEXT,OnSetText)
END_MESSAGE_MAP()
LRESULT CAutoSizeStaticCtrl::OnSetText(WPARAM ,LPARAM lParam)
{
LRESULT Ret = Default();
CDC *pDC = GetDC();
CRect Rect;
GetClientRect(Rect);
CString Text((LPCSTR)lParam);
pDC->DrawText(Text,&Rect,DT_SINGLELINE|DT_CALCRECT);
SetWindowPos(NULL,0,0,Rect.Width(),Rect.Height(),SWP_NOMOVE|SWP_NOZORDER);
ReleaseDC(pDC);
return Ret;
}
AliR.
"mosfet" <john.doe@anonymous.org> wrote in message
news:467801b9$0$6221$426a34cc@news.free.fr...
HI,
I would like to write a CStatic that automatically resize itself according
to its content.
in my code when I detect my control is too small (nDiff < 0 in my code)
I call SetWindowPos but when I do that I enter an infinite loop and my
Cxstatic draw some nice stairs.
How can I fix that ?
void CxStatic::DrawText(CDC* pDCMem, CRect* pRect, CString csText)
{
DWORD dwStyle = m_dwTxtFlags;
DWORD dwFlags = 0;
MAP_STYLE( SS_RIGHT, DT_RIGHT );
MAP_STYLE( SS_CENTER, DT_CENTER );
MAP_STYLE( SS_LEFT, DT_LEFT );
//MAP_STYLE( SS_CENTERIMAGE, DT_VCENTER | DT_SINGLELINE );
MAP_STYLE( SS_NOPREFIX, DT_NOPREFIX );
// MAP_STYLE( SS_WORDELLIPSIS, DT_WORD_ELLIPSIS );
MAP_STYLE( SS_ENDELLIPSIS, DT_END_ELLIPSIS );
// MAP_STYLE( SS_PATHELLIPSIS, DT_PATH_ELLIPSIS );
// TAb expansion
if (csText.Find( _T('\t') ) != -1)
dwFlags |= DT_EXPANDTABS;
//csText.Replace(
// TEXT WRAPPING - Inspired by Chen-Cha Hsu and improved
CRect newRC;
TEXTMETRIC tag;
CSize sz;
::GetTextExtentPoint32(pDCMem->GetSafeHdc(), csText,csText.GetLength(),
&sz);
CStringArray asText;
int nLine = 0;
CString s2;
int nX = 0;
int nId = 0;
TCHAR nCR = 0;
// Autowrapping mode enabled
if ( m_bAutoWrapping ){
for (int i = 1; i <= csText.GetLength(); i++){
s2 = csText.Left(i);
//CARRIAGE RETURN not recognised with SS_CENTERIMAGE - manual handling
if (csText.GetAt(i-1) == '\r' || csText.GetAt(i-1) == '\n'){
if (nCR == 0){
nCR = csText.GetAt(i-1);
}
else if (nCR != csText.GetAt(i-1)){ // "\r\n" or "\n\r"
s2 = csText.Left(i-2);
asText.Add(s2);
csText = csText.Mid(i);
i = nCR = 0;
}
}
::GetTextExtentPoint32(pDCMem->GetSafeHdc(), s2, s2.GetLength(), &sz);
if ( sz.cx > pRect->Width() ){// We found how many letters fits
s2 = csText.Left(i-1);
if ( IsASingleWord(s2) ){
asText.Add(s2);
csText = csText.Mid(i-1);
i = 0;
}
else{ // Do not break a word
nId = s2.ReverseFind(' ');
s2 = s2.Left(nId);
asText.Add(s2);
csText = csText.Mid(nId + 1);
i = 0;
}
}
}
if ( ! csText.IsEmpty() )
asText.Add(csText);
}
else{// Standard CStatic behaviour
asText.SetAtGrow(0, csText);
}
nLine = asText.GetSize();
pDCMem->GetTextMetrics(&tag);
newRC = *pRect;
LONG nTextHeight = tag.tmHeight * nLine;
LONG nDiff = (pRect->bottom - pRect->top) - (nTextHeight);
if (dwStyle & SS_CENTERIMAGE)
pRect->top = nDiff/2;
//TRACE( "The value of nDiff is %d\n", nDiff );
if (m_bAutoAdjustFont){
if (nDiff < 0){
//SetWindowPos(NULL, 0,0, pRect->Width(), nTextHeight,
SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
//Notify parent
}
//pDCMem->SelectObject( m_pFont ); TODO CHECK WITH AUTOADJUST
//RedrawWindow();
}
for (int j = 0; j < nLine; j++){
newRC.top = pRect->top + tag.tmHeight * j;
pDCMem->DrawText(asText[j], &newRC,dwFlags);
//DrawTextEx(pDCMem->GetSafeHdc(), asText[j],
asText[j].GetLength(),&newRC, dwFlags|DT_END_ELLIPSIS);
if (m_bFont3d){
if (m_3dType == Raised)
newRC.OffsetRect(-1,-1);
else
newRC.OffsetRect(1,1);
//DrawTextEx(pDCMem->GetSafeHdc(), asText[j],
asText[j].GetLength(),&newRC, dwFlags|DT_END_ELLIPSIS);
pDCMem->DrawText(asText[j], &newRC,dwFlags);
}
}
}