[RESOLVED] CEdit::Create & GetWindowRect
Hey guys. I'm creating these CEdits, placing them within their parent dialog. I do this by adding offsets from the parent dialog's rect. The only problem is the CEdits end up being offset by a much larger amount than I set them to be. For example, this->GetWindowRect(&rect) sets rect as rect = {top=275 bottom=654 left=393 right=869}. But further down when I test the value of the first CEdit's (at_edit) rect, it's rect = {top=576 bottom=588 left=794 right=834}, which is not correct.
Cheers.
Code:
BOOL WM2000_Simulator::OnInitDialog()
{
Simulator_Base::OnInitDialog();
DWORD style = WS_VISIBLE | WS_CHILD | WS_BORDER |
WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT;
RECT rect;
this->GetWindowRect(&rect);
at_edit.Create(style, CRect(rect.left + 8, rect.top + 26, rect.left + 8 + 40, rect.top + 26 + 12),
this, IDC_EDIT_AT);
ws_edit.Create(style, CRect(rect.left + 148, rect.top + 26, rect.left + 148 + 40, rect.top + 26 + 12),
this, IDC_EDIT_WS);
wd_edit.Create(style, CRect(rect.left + 8, rect.top + 56, rect.left + 8 + 40, rect.top + 56 + 12),
this, IDC_EDIT_WD);
sr_edit.Create(style, CRect(rect.left + 148, rect.top + 56, rect.left + 148 + 40, rect.top + 56 + 12),
this, IDC_EDIT_SR);
rh_edit.Create(style, CRect(rect.left + 78, rect.top + 26, rect.left + 78 + 40, rect.top + 26 + 12),
this, IDC_EDIT_RH);
ra_edit.Create(style, CRect(rect.left + 78, rect.top + 56, rect.left + 78 + 40, rect.top + 56 + 12),
this, IDC_EDIT_RA);
at_edit.GetWindowRect(&rect);
at_edit.SetLimitText(WM2000_MAX_CEDIT_DIGITS);
ws_edit.SetLimitText(WM2000_MAX_CEDIT_DIGITS);
wd_edit.SetLimitText(WM2000_MAX_CEDIT_DIGITS);
sr_edit.SetLimitText(WM2000_MAX_CEDIT_DIGITS);
rh_edit.SetLimitText(WM2000_MAX_CEDIT_DIGITS);
ra_edit.SetLimitText(WM2000_MAX_CEDIT_DIGITS);
return TRUE;
}
Re: CEdit::Create & GetWindowRect
You're mixing up window coordinates and client coordinates I believe. GetWindowRect returns the rect relative to the screen. The rect you pass into create is relative to the parent's client area. So when you say, rect.left + 8, you're specifying the left coordinate to be 401 pixels to the right of the left side of the parent dialog. If you want the edit to be offset by 8, just specify 8, not rect.left+ 8.
1 Attachment(s)
Re: CEdit::Create & GetWindowRect
Oh... that would make sense haha. Cheers GCDEF!
One other question... apart from left justification, how would I make the CEdit up the top look like the editor-placed one below it? I gave the manually created on these styles:
Code:
DWORD style = WS_VISIBLE | WS_CHILD | WS_BORDER |
WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT;
Cheers.
Re: CEdit::Create & GetWindowRect
Quote:
Originally Posted by
Mybowlcut
Oh... that would make sense haha. Cheers GCDEF!
One other question... apart from left justification, how would I make the CEdit up the top look like the editor-placed one below it? I gave the manually created on these styles:
Code:
DWORD style = WS_VISIBLE | WS_CHILD | WS_BORDER |
WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT;
Cheers.
I think that's the client edge style.
Re: CEdit::Create & GetWindowRect
Oh, cheers! I searched around and found this article that explained it. Did I do it correctly? The text is still bolded..
Code:
at_edit.CreateEx(WS_EX_CLIENTEDGE, "EDIT", "", style,
0, 0, 10, 10, this->GetSafeHwnd(), NULL, (HMENU)IDC_EDIT_AT);
Re: CEdit::Create & GetWindowRect
Quote:
Originally Posted by
Mybowlcut
Oh, cheers! I searched around and found
this article that explained it. Did I do it correctly?
Code:
at_edit.CreateEx(WS_EX_CLIENTEDGE, "EDIT", "", style,
0, 0, 10, 10, this->GetSafeHwnd(), NULL, (HMENU)IDC_EDIT_AT);
Try it and see.
Re: CEdit::Create & GetWindowRect
Sorry, edited shortly after I posted. The text is still bolded and it looks very windows 95ish! Haha. Any idea what the style would be to change that?
Edit: I also have a MESSAGE_MAP that doesn't seem to be working (IE the OnEnChangeEdit* functions aren't getting called):
Code:
BEGIN_MESSAGE_MAP(WM2000_Simulator, CDialog)
ON_EN_CHANGE(IDC_EDIT_AT, &WM2000_Simulator::OnEnChangeEditAt)
ON_EN_CHANGE(IDC_EDIT_RA, &WM2000_Simulator::OnEnChangeEditRa)
ON_EN_CHANGE(IDC_EDIT_RH, &WM2000_Simulator::OnEnChangeEditRh)
ON_EN_CHANGE(IDC_EDIT_SR, &WM2000_Simulator::OnEnChangeEditSr)
ON_EN_CHANGE(IDC_EDIT_WD, &WM2000_Simulator::OnEnChangeEditWd)
ON_EN_CHANGE(IDC_EDIT_WS, &WM2000_Simulator::OnEnChangeEditWs)
END_MESSAGE_MAP()
Code:
void WM2000_Simulator::OnEnChangeEditAt()
{
Set_Data_From_CEdit(IDC_EDIT_AT, data.air_temp);
}
void WM2000_Simulator::OnEnChangeEditWd()
{
Set_Data_From_CEdit(IDC_EDIT_WD, data.wnd_dir);
}
void WM2000_Simulator::OnEnChangeEditRh()
{
Set_Data_From_CEdit(IDC_EDIT_RH, data.rel_hum);
}
void WM2000_Simulator::OnEnChangeEditRa()
{
Set_Data_From_CEdit(IDC_EDIT_RA, data.rnfall);
}
void WM2000_Simulator::OnEnChangeEditWs()
{
Set_Data_From_CEdit(IDC_EDIT_WS, data.wnd_spd);
}
void WM2000_Simulator::OnEnChangeEditSr()
{
Set_Data_From_CEdit(IDC_EDIT_SR, data.sol_rad);
}
I declared the MESSAGE_MAP:
Code:
class WM2000_Simulator : public Simulator_Base
{
DECLARE_DYNAMIC(WM2000_Simulator)
public:
WM2000_Simulator(CWnd* pParent = NULL); // standard constructor
virtual ~WM2000_Simulator();
virtual void Do_Command(CSerial& serial);
virtual std::string Get_Data() const;
// Dialog Data
enum { IDD = IDD_WM2000_SIMULATOR };
private:
static const int WM2000_MAX_CEDIT_DIGITS = 6;
WM2000_Data data;
void Set_Data_From_CEdit(int ID, double& data);
protected:
//virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
CEdit at_edit;
CEdit ra_edit;
CEdit rh_edit;
CEdit sr_edit;
CEdit wd_edit;
CEdit ws_edit;
afx_msg void OnEnChangeEditAt();
afx_msg void OnEnChangeEditWd();
afx_msg void OnEnChangeEditRh();
afx_msg void OnEnChangeEditRa();
afx_msg void OnEnChangeEditWs();
afx_msg void OnEnChangeEditSr();
};
Cheers.
Re: CEdit::Create & GetWindowRect
I continue to faill understanding why you are creating controls instead letting OS use dialog template to do it for you.
If you want to resize controls at the run time it would be less difficult than your approach.
If you insert edit controls using dialog editor, client edge is implied.
When you attach window handle to any MFC control using Create member, passing WS_BORDER style, control will be created with this style, not WS_EX_CLIENTEDGE.
Create control without WS_BORDER and modify extended style adding WS_EX_CLIENTEDGE or use CreateWindowEx.
Furthermore: your homemade control is using system font (default). Template controls use font used by template (the same font dialog is using).
In order to display the same font you will have to assign one using SetFont and passing a pointer to a dialog font or creating control’s own font.
As for using DoDataExchange for validation, you can still do it, providing homemade control has the same ID and you either replace variable name inserted by wizard, with a name you are using to call Create.
I still fail understanding why you are creating controls instead letting OS use dialog template to do it for you.
Is it an exercise?
Re: CEdit::Create & GetWindowRect
Quote:
Originally Posted by
JohnCz
I continue to faill understanding why you are creating controls instead letting OS use dialog template to do it for you.
If you want to resize controls at the run time it would be less difficult than your approach.
If you insert edit controls using dialog editor, client edge is implied.
When you attach window handle to any MFC control using Create member, passing WS_BORDER style, control will be created with this style, not WS_EX_CLIENTEDGE.
Create control without WS_BORDER and modify extended style adding WS_EX_CLIENTEDGE or use CreateWindowEx.
Furthermore: your homemade control is using system font (default). Template controls use font used by template (the same font dialog is using).
In order to display the same font you will have to assign one using SetFont and passing a pointer to a dialog font or creating control’s own font.
As for using DoDataExchange for validation, you can still do it, providing homemade control has the same ID and you either replace variable name inserted by wizard, with a name you are using to call Create.
I still fail understanding why you are creating controls instead letting OS use dialog template to do it for you.
Is it an exercise?
I'm creating them myself because otherwise I don't know how to change the type to my derived edit class.
Re: CEdit::Create & GetWindowRect
Hmmmm, why you did not mention it in your first post?
In VS 6.0 after deriving class from CEdit (or any other window control) use class wizard to insert variable. Pick your class from the "Variable Type" drop box.
In later versions of the VS, or if you want to change type of variable after inserting it, simply replace class inserted by wizard with your derived class. Make sure appropriate headers are available.
That is it.
Re: CEdit::Create & GetWindowRect
But if you add a variable via the add variable wizard, it isn't placed onto the visual editor. I've already got the CEdits working fine though, so it doesn't matter. Cheers for the font advice as well.
Re: CEdit::Create & GetWindowRect
Quote:
Originally Posted by
Mybowlcut
I'm creating them myself because otherwise I don't know how to change the type to my derived edit class.
I told you days ago. In the header file change the control variable type from CEdit to your CEdit derived class. That's all you have to do.
If that's the reason, I would strongly and I mean strongly recommend throwing away this code and doing it properly. It'll be easier for you to maintain, whoever works on it after you will be happier, it's really easy to do, and you can't jump through all these hoops every time you need to use a control class you've created yourself.
One thing about being a good programmer is knowing when you're headed down the wrong path and not creating a convoluted workaround because you're stuck on a simple problem.
Re: CEdit::Create & GetWindowRect
Quote:
Originally Posted by
Mybowlcut
But if you add a variable via the add variable wizard, it isn't placed onto the visual editor. I've already got the CEdits working fine though, so it doesn't matter. Cheers for the font advice as well.
Pick CEdit and change it manually. There's nothing to id.
Re: CEdit::Create & GetWindowRect
Mybowlcut:
You keep asking questions even though they are already answered. You have to pay attention.
Quote:
Originally Posted by
me earlier
simply replace class inserted by wizard with your derived class. Make sure appropriate headers are available.
Re: CEdit::Create & GetWindowRect
Guys... I know how to change the type of a variable. My problem has always been what I said above. That if I add the controls via the visual editor, they aren't created as instances and so I didn't know how to change their type. John, you said it yourself:
Quote:
Once dialog resource is saved, all information is written to a resource file as ASCII script.
Quote:
I told you days ago. In the header file change the control variable type from CEdit to your CEdit derived class. That's all you have to do.
If that's the reason, I would strongly and I mean strongly recommend throwing away this code and doing it properly. It'll be easier for you to maintain, whoever works on it after you will be happier, it's really easy to do, and you can't jump through all these hoops every time you need to use a control class you've created yourself.
One thing about being a good programmer is knowing when you're headed down the wrong path and not creating a convoluted workaround because you're stuck on a simple problem.
That's not what I meant at all. I meant:
Quote:
I'm creating them myself because otherwise, if I place them visually, I don't know how to change the type to my derived edit class.
I don't know how to change their type if they were placed visually with the editor. When I place them with the editor, there are no instances created that I can edit:
Quote:
As you realize now, once control is placed in a dialog template you do not have to create it.
So, I have two options. 1) Add them via the add variable wizard. They're created as instances and I can change their type (I always understood how do to that). But if I do it that way, then I have to position them manually... which is harder.
2) Create them with the visual editor by placing them on the dialog. Easier to do but there is no way to change their type as there are no instances created and I have not yet found a way to change their type via properties or anything else like that.