Thanks for the reply.
SendMessage. So SetFont and SendMessage are equivalent.
As I said earlier that my control was using PostMessage to change the font.
edit box stops resizing. I have no clue why this is happening as there seem
to be no direct link to the change and this side-effect. I was unable to
control) and this makes it harder to debug this issue. Also this behavior of
formatting rectangle not resizing happens only when I use VC++ apllication.
The same control works correctly in VB6 and .NET. Can anyone give me some
"Joseph M. Newcomer" wrote:
Why are you doing a low-level PostMessage to your control instead of just doing
ctl.SetFont(f)
where f is a CFont *? Seems a strange thing to do here.
Changing PostMessage to SendMessage may have fixed the problem, but it is not clear why
you would want to use SendMessage either, when MFC already has a SetFont method for all
CWnd-derived controls. So the decision is not between PostMessage and SendMessage, it is
between using the correct tools for the job and going out of your way to make your life
complex by using low-level mechanisms that are inappropriate.
I just did a little experiment with a dynamically-resized edit control, and none of what
you report appears to be true. The font resizes just fine, for a single-line control, and
the GetRect returns a new value immediately after the SetWindowPos. Here's the code:
void CedittestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if(c_Text.GetSafeHwnd() != NULL)
{
CRect r;
c_Text.GetWindowRect(&r);
ScreenToClient(&r);
c_Text.SetWindowPos(NULL, 0, 0, cx, cy - r.top, SWP_NOMOVE | SWP_NOZORDER);
CRect fmt;
c_Text.GetRect(&fmt);
CRect client;
c_Text.GetClientRect(&client);
CFont * f = c_Text.GetFont();
LOGFONT lf;
f->GetLogFont(&lf);
lf.lfHeight = client.Height();
f->DeleteObject();
f->CreateFontIndirect(&lf);
c_Text.SetFont(f);
f->Detach();
CString s;
s.Format(_T("{%d, %d, %d, %d}, %d, %d: %d"),
fmt.left, fmt.top, fmt.right, fmt.bottom,
fmt.Width(), fmt.Height(), lf.lfHeight);
c_Rect.SetWindowText(s);
}
}
The control c_Text is the text control that is being resized; it is right below a static
control, c_Rect, that displays the coordinates of the GetRect and the font size.
joe
On Tue, 30 Dec 2008 08:06:03 -0800, mhaseeb <mhaseeb@discussions.microsoft.com> wrote:
I use CEdit as part of my control. In the OnFontChanged of my control, I use
the PostMessage(WM_SETFONT, WPARAM(handle), MAKELPARAM(TRUE, 0)) to set the
CEdit's font. In the OnSizeChanged of my control, I use SetWindowPos method
of CEdit to resize the CEdit.
When my control is resized continuously and the font size changed along with
it(like dragging the dialog and increasing the size of my control to fit the
dialog), the font size becomes a default font size once in a while(while
resizing). You can see it as a flicker where the font size suddenly becomes
small and comes back to the size it is being set.
I figured that this might be due to the using of PostMessage which will not
wait for the message to be handled and it looked like the rendering is
happening before the font has been set and then again it renders properly
leading to the flicker I mentioned above.
So I changed the PostMessage call to SendMessage. This seems to have fixed
the issue, but after this change the formatting rectangle of the CEdit(the
rectange in which the text is shown) is not resizing. The CEdit is resizing
as the GetClientRect returns me the correct values. But the GetRect which
returns the formatting rectangle is not changing even after the SetWindowPos
is called.
Can anyone tell me how to control the size of the formatting rectangle?
SetRect only works with multi-line controls.
How to decide between PostMessage and SendMessage?
Is there anything wrong with the way I am doing resizing and font change?
Thanks.
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm