[RESOLVED] CEdit::Create & GetWindowRect
CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Page 1 of 3 123 LastLast
Results 1 to 15 of 32

Thread: [RESOLVED] CEdit::Create & GetWindowRect

  1. #1
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    [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;
    }
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

  2. #2
    GCDEF is offline Elite Member Power Poster
    Join Date
    Nov 2003
    Posts
    12,069

    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.
    Last edited by GCDEF; February 17th, 2009 at 08:13 PM.

  3. #3
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    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.
    Attached Images Attached Images  
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

  4. #4
    GCDEF is offline Elite Member Power Poster
    Join Date
    Nov 2003
    Posts
    12,069

    Re: CEdit::Create & GetWindowRect

    Quote Originally Posted by Mybowlcut View Post
    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.

  5. #5
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    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);
    Last edited by Mybowlcut; February 17th, 2009 at 09:35 PM.
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

  6. #6
    GCDEF is offline Elite Member Power Poster
    Join Date
    Nov 2003
    Posts
    12,069

    Re: CEdit::Create & GetWindowRect

    Quote Originally Posted by Mybowlcut View Post
    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.

  7. #7
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    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.
    Last edited by Mybowlcut; February 17th, 2009 at 10:24 PM.
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

  8. #8
    Join Date
    May 1999
    Location
    DELAWARE, USA
    Posts
    9,915

    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?
    There are only 10 types of people in the world:
    Those who understand binary and those who do not.

  9. #9
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    Re: CEdit::Create & GetWindowRect

    Quote Originally Posted by JohnCz View Post
    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.
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

  10. #10
    Join Date
    May 1999
    Location
    DELAWARE, USA
    Posts
    9,915

    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.
    Last edited by JohnCz; February 18th, 2009 at 08:26 PM. Reason: Typo
    There are only 10 types of people in the world:
    Those who understand binary and those who do not.

  11. #11
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    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.
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

  12. #12
    GCDEF is offline Elite Member Power Poster
    Join Date
    Nov 2003
    Posts
    12,069

    Re: CEdit::Create & GetWindowRect

    Quote Originally Posted by Mybowlcut View Post
    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.
    Last edited by GCDEF; February 18th, 2009 at 07:21 AM.

  13. #13
    GCDEF is offline Elite Member Power Poster
    Join Date
    Nov 2003
    Posts
    12,069

    Re: CEdit::Create & GetWindowRect

    Quote Originally Posted by Mybowlcut View Post
    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.

  14. #14
    Join Date
    May 1999
    Location
    DELAWARE, USA
    Posts
    9,915

    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 View Post
    simply replace class inserted by wizard with your derived class. Make sure appropriate headers are available.
    There are only 10 types of people in the world:
    Those who understand binary and those who do not.

  15. #15
    Join Date
    Nov 2006
    Location
    Australia
    Posts
    1,569

    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:
    Once dialog resource is saved, all information is written to a resource file as ASCII script.
    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:
    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:
    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.
    Last edited by Mybowlcut; February 18th, 2009 at 11:15 PM.
    Good judgment is gained from experience. Experience is gained from bad judgment.
    Cosy Little Game | SDL | GM script | VLD | Syntax Hlt | Can you help me with my homework assignment?

Page 1 of 3 123 LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Azure Activities Information Page

Windows Mobile Development Center


Click Here to Expand Forum to Full Width

This is a CodeGuru survey question.


Featured


HTML5 Development Center