Re: How to resize an Custom class derived from CEdit when it reaches
its max text limit?
On Apr 11, 12:51 am, Joseph M. Newcomer <newco...@flounder.com> wrote:
See below...
On Thu, 10 Apr 2008 10:46:06 -0700 (PDT), sujeet27k...@gmail.com wrote:
On Apr 10, 6:23 pm, Joseph M. Newcomer <newco...@flounder.com> wrote:
In the OnUpdate handler:
CClientDC dc(this);
CFont * f = GetFont();
dc.SelectObject(f);
CString s;
GetWindowText(s);
CSize sz = dc.GetTextExtent(s);
CRect r;
GetClientRect(&r);
if(r.right > sz.cx)
r.right = sz.cx;
if(r.right < MY_MIN_SIZE)
r.right = MY_MIN_SIZE;
r.right += MY_MINIMUM_RIGHT_PADDING;
CalcWindowRect(&r);
CRect w;
GetWindowRect(&w);
if(r.Width() != w.Width())
SetWindowPos(NULL, 0, 0, r.Width(), r.Height(), SWP_NOMOVE | SW=
P_NOZORDER);
This should do the job. I'm typing this in off the top of my head, b=
ut its probably
pretty close to what you will need.
joe
On Thu, 10 Apr 2008 01:55:25 -0700 (PDT), sujeet27k...@gmail.com wrote:=
Hi, I have a class derrived from CEdit. I need to resize it when it
reaches its max text limit in order to accomodate the new character.
****
Max text limit is not an issue; maximum width of the edit control is what =
this is testing
*****
But if I incremant it by a fixed size there is a problem. As each
character is taking different space. like 'l' , '.' and '2' wiil
require different space. So a constant number doesen't fit the bill.
Also when I press backspace the Edit control should decreament by
exact size required by the chartacter (I fill this is somewhat more
difficult as you need to know the size of a character) back space is
going to delete.Please help if anybody has the solution.
Joseph M. Newcomer [MVP]
email: newco...@flounder.com
Web:http://www.flounder.com
MVP Tips:http://www.flounder.com/mvp_tips.htm
Hi, Thanks for posting but I am not getting how this will increse the
size of CEdit control when it reaches the max limit.
****
See above coment on max limit.
****>As I think update
will never occur. I tried this out but its not working .
****
Update *always* occurs when you change the contents. This would have to=
be a reflected
method of the edit control (=EN_UPDATE) which I forgot to mention
****>Now I am getting width of character through GetCharWidth32()
****
There is no need to call GetCharWidth32(), and in any case CDC::GetTextExt=
ent is what you
need to use. What you are doing is not correct.
****>and
increasing Size of CEdit control in OnEnMaxtext()
****
EN_MAXTEXT is sent when the maximum number of characters that can be typed=
is reached, but
this has nothing to do with your problem.
****> but still the
character width is more than the actual space required and also not in
a proper ratio(for various characters).
****
I have no idea what you just said.
****>And when user presses the
backspace the problem of decreasing the size is remains.
****
The algorithm I gave should work no matter what the size is. But it has=
a couple bugs.
Below is the corrected code
****>And second
thing is my CEdit boxes are floating so if first ncreases in size
second should be moved.
****
Well, that's something you have to account for; I just showed how to incre=
ase one. How
you do your geometry management of multiple controls is up to you.
joe
****
// Note: to make this work, you must set AutoHScroll to FALSE
// ExtensibleEdit.h
#pragma once
// CExtensibleEdit
class CExtensibleEdit : public CEdit
{
DECLARE_DYNAMIC(CExtensibleEdit)
public:
CExtensibleEdit();
virtual ~CExtensibleEdit();
protected:
DECLARE_MESSAGE_MAP()
int MinSize;
protected:
afx_msg void OnEnUpdate();
protected:
virtual void PreSubclassWindow();
};
// ExtensibleEdit.cpp : implementation file
//
#include "stdafx.h"
#include "ExtensibleEdit.h"
// CExtensibleEdit
IMPLEMENT_DYNAMIC(CExtensibleEdit, CEdit)
CExtensibleEdit::CExtensibleEdit()
{
}
CExtensibleEdit::~CExtensibleEdit()
{
}
BEGIN_MESSAGE_MAP(CExtensibleEdit, CEdit)
ON_CONTROL_REFLECT(EN_UPDATE, &CExtensibleEdit::OnEnUpdate=
)
END_MESSAGE_MAP()
// CExtensibleEdit message handlers
void CExtensibleEdit::OnEnUpdate()
{
CClientDC dc(this);
CFont * f = GetFont();
dc.SelectObject(f);
//****************************************************************=
// |<---------GetWindowRect().Width()---------->|_________
// BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ^
// B+------------------------------------------+B |
// B| *** =
* * |B |
// B| * * =
** ** |B |
// B| ***** =
* * * |B GetWindowRect().Height()
// B| * * =
* * |B |
// B| * * =
* * |B |
// B+------------------------------------------+B |
// BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB_____V___
//-->| |<--LOWORD(margins) -->| =
|<--HIWORD(margins)
// | |<------dc.GetTextExtent().cx------>| |
//
// The border is indicated by B
//****************************************************************=
int padding = dc.GetTextExtent(_T(" ")).cx;
DWORD margins = GetMargins();
int margin = LOWORD(margins) + HIWORD(margins);
CString s;
GetWindowText(s);
CSize sz = dc.GetTextExtent(s);
// Compute the desired space for the string, and extend the space =
so it has extra
space
sz.cx += margin + padding;
if(sz.cx < MinSize)
sz.cx = MinSize;
CRect r;
GetClientRect(&r);
r.right = sz.cx;
r.right += padding;
CalcWindowRect(&r);
CRect w;
GetWindowRect(&w);
int width = w.Width();
if(r.Width() != width)
SetWindowPos(NULL, 0, 0, r.Width(), w.Height(), SWP_NOMOVE =
| SWP_NOZORDER);
}
void CExtensibleEdit::PreSubclassWindow()
{
ASSERT( (GetStyle() & ES_AUTOHSCROLL) == 0);
CEdit::PreSubclassWindow();
CRect w;
GetClientRect(&w);
DWORD margins = GetMargins();
int margin = LOWORD(margins) + HIWORD(margins);
MinSize = w.Width() - margin;
}
Joseph M. Newcomer [MVP]
email: newco...@flounder.com
Web:http://www.flounder.com
MVP Tips:http://www.flounder.com/mvp_tips.htm- Hide quoted text -
- Show quoted text -- Hide quoted text -
- Show quoted text -
Thanks.Its working.