Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In with Facebook Sign In with Google Sign In with OpenID

Categories

We have migrated to a new platform! Please note that you will need to reset your password to log in (your credentials are still in-tact though). Please contact lee@programmersheaven.com if you have questions.
Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

Converting to dialog units

RX7RX7 Posts: 9Member
Lets say I have a dialog box with a button on it. What I'm trying to do is change the buttons position and/or size, relative to its previous position and size.

I use [b]GetWindowRect()[/b] to retrieve the [b]RECT[/b] of the button. I guess the unit I get is pixels. Then I use [b]GetDialogBaseUnits()[/b] and convert from pixels to dialog untis as stated in the [b]Win32 Programmer's Reference[/b] under [b]GetDialogBaseUnits()[/b]. Finally I use [b]MoveWindow[/b] to move and/or resize the button.

Here is where I have trouble. When I try to "move" it to the same position as it allready is (set in the resource file), it should stay in place, but it moves around. What am I doing wrong?

Sorry, I'm not exactly the king when it comes to explaining stuff. :-)

Comments

  • AsmGuru62AsmGuru62 Posts: 6,519Member
    : Lets say I have a dialog box with a button on it. What I'm trying to do is change the buttons position and/or size, relative to its previous position and size.
    :
    : I use [b]GetWindowRect()[/b] to retrieve the [b]RECT[/b] of the button. I guess the unit I get is pixels. Then I use [b]GetDialogBaseUnits()[/b] and convert from pixels to dialog untis as stated in the [b]Win32 Programmer's Reference[/b] under [b]GetDialogBaseUnits()[/b]. Finally I use [b]MoveWindow[/b] to move and/or resize the button.
    :
    : Here is where I have trouble. When I try to "move" it to the same position as it allready is (set in the resource file), it should stay in place, but it moves around. What am I doing wrong?
    :
    : Sorry, I'm not exactly the king when it comes to explaining stuff. :-)
    :

    'MoveWindow()' uses the same pixels as 'GetWindowRect()' so you do not have to convert anything...



  • RX7RX7 Posts: 9Member
    Thanks for your reply.

    Ok, [b]GetWindowRect()[/b] and [b]MoveWindow()[/b] both use pixels. Then the following piece of code should make the button stay in place, right?

    [code]
    RECT rcWnd;

    GetWindowRect(GetDlgItem(GetActiveWindow(), IDBUTTON), &rcWnd);
    MoveWindow(GetDlgItem(GetActiveWindow(), IDBUTTON), rcWnd.left, rcWnd.top, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, TRUE);
    [/code]

    But it doesn't, why is that?

    Thanks again!

  • SephirothSephiroth Fayetteville, NC, USAPosts: 1,035Member
    : Thanks for your reply.
    :
    : Ok, [b]GetWindowRect()[/b] and [b]MoveWindow()[/b] both use pixels. Then the following piece of code should make the button stay in place, right?
    :
    : [code]
    : RECT rcWnd;
    :
    : GetWindowRect(GetDlgItem(GetActiveWindow(), IDBUTTON), &rcWnd);
    : MoveWindow(GetDlgItem(GetActiveWindow(), IDBUTTON), rcWnd.left, rcWnd.top, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, TRUE);
    : [/code]
    :
    : But it doesn't, why is that?
    :
    : Thanks again!
    :

    Try this:
    [code]
    MoveWindow(GetDlgItem(GetActiveWindow(), IDBUTTON), rcWnd.left, rcWnd.top, , , TRUE);
    [/code]

    -[italic][b][red]S[/red][purple]e[/purple][blue]p[/blue][green]h[/green][red]i[/red][purple]r[/purple][blue]o[/blue][green]t[/green][red]h[/red]


  • AsmGuru62AsmGuru62 Posts: 6,519Member
    That happens, because 'GetWindowRect()' returns pixels relative to the whole screen, but when you 'MoveWindow()' a button - you use coordinates, relative to a dialog, because button is a child in the dialog, the correct code is this:

    RECT rect;
    HWND hButton = GetDlgItem (hDlg, IDC_BUTTON1);

    GetWindowRect (hButton, &rect);
    ScreenToClient (hDlg, (POINT*) &(rect.left));
    ScreenToClient (hDlg, (POINT*) &(rect.right));
    OffsetRect (&rect, 8, 0); // Shift it 8 pixels to the right
    MoveWindow (hButton, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);

    Cheers!


  • RX7RX7 Posts: 9Member
    Is there a better way of getting the dialog handle, than using [b]GetActiveWindow()[/b]?

    Thanks again for your help, I'm grateful!

  • RX7RX7 Posts: 9Member
    I have another question, hope you don't mind.

    I seem to get it to work without using [b]OffsetRect[/b]. But I have another problem. I want to convert the button's posistion and size, from pixels to dialog units, to display them in a [b]MessageBox()[/b] (or whatever). If I haven't moved it after I start the program, I should, when I have converted to dialog units, get the same left, top, width, and height as I set in the resource file right? I try to convert using the following code:
    [code]
    typedef struct DLGRECT {
    LONG left;
    LONG top;
    LONG width;
    LONG height;
    }

    RECT rcWnd;
    DLGRECT rcDlg;
    LONG DlgBaseUnits, BaseUnitX, BaseUnitY;

    DlgBaseUnits = GetDialogBaseUnits();
    BaseUnitX = LOWORD(DlgBaseUnits);
    BaseUnitY = HIWORD(DlgBaseUnits);

    GetWindowRect(GetDlgItem(GetActiveWindow(), IDBUTTON), &rcWnd);

    rcDlg.left = (rcWnd.left * 4) / BaseUnitX;
    rcDlg.width = ((rcWnd.right - rcWnd.left) * 4) / BaseUnitX;
    rcDlg.top = (rcWnd.top * 8) / BaseUnitY;
    rcDlg.height = ((rcWnd.bottom - rcWnd.top) * 8) / BaseUnitY;
    [/code]
    But it doesn't work! I get the wrong dialog units. Can you help?

    Thanks again!


  • AsmGuru62AsmGuru62 Posts: 6,519Member
    : I have another question, hope you don't mind.
    :
    : I seem to get it to work without using [b]OffsetRect[/b]. But I have another problem. I want to convert the button's posistion and size, from pixels to dialog units, to display them in a [b]MessageBox()[/b] (or whatever). If I haven't moved it after I start the program, I should, when I have converted to dialog units, get the same left, top, width, and height as I set in the resource file right? I try to convert using the following code:
    : [code]
    : typedef struct DLGRECT {
    : LONG left;
    : LONG top;
    : LONG width;
    : LONG height;
    : }
    :
    : RECT rcWnd;
    : DLGRECT rcDlg;
    : LONG DlgBaseUnits, BaseUnitX, BaseUnitY;
    :
    : DlgBaseUnits = GetDialogBaseUnits();
    : BaseUnitX = LOWORD(DlgBaseUnits);
    : BaseUnitY = HIWORD(DlgBaseUnits);
    :
    : GetWindowRect(GetDlgItem(GetActiveWindow(), IDBUTTON), &rcWnd);
    :
    : rcDlg.left = (rcWnd.left * 4) / BaseUnitX;
    : rcDlg.width = ((rcWnd.right - rcWnd.left) * 4) / BaseUnitX;
    : rcDlg.top = (rcWnd.top * 8) / BaseUnitY;
    : rcDlg.height = ((rcWnd.bottom - rcWnd.top) * 8) / BaseUnitY;
    : [/code]
    : But it doesn't work! I get the wrong dialog units. Can you help?
    :
    : Thanks again!
    :
    :

    Good link for you:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/hh/winui/dlgboxes_7wfn.asp





  • AsmGuru62AsmGuru62 Posts: 6,519Member
    : Is there a better way of getting the dialog handle, than using [b]GetActiveWindow()[/b]?
    :
    : Thanks again for your help, I'm grateful!
    :

    Well, if you pass an HWND which came into your dialog procedure in every function you write then you get your HDLG everywhere without calling 'GetActiveWindow()' - it can cause problems when you do some background processing in your dialog, but in some moment you switch to another task - it will give you the HWND of the window in that task instead of your dialog...

    [code]
    void InitControls (HWND hDlg)
    {
    }

    void WmCommand (HWND hDlg, WORD wControlID, WORD wNotification)
    {
    }

    BOOL CALLBACK MyDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
    {
    switch (msg) {
    case WM_INITDIALOG:
    InitControls (hDlg);
    break;
    case WM_COMMAND:
    WmCommand (hDlg, LOWORD (wp), HIWORD (wp));
    break;
    default:
    return FALSE;
    }
    return TRUE;
    }
    [/code]



    Another way is to make it global for only this source file when it comes in WM_INITDIALOG:

    [code]
    static HWND st_hDlg;

    BOOL CALLBACK MyDlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
    {
    ...
    case WM_INITDIALOG:
    st_hDlg = hDlg;
    break;
    ...
    }

    [/code]

    But it can cause problems in case you have two of these dialogs running as modeless...


  • AsmGuru62AsmGuru62 Posts: 6,519Member
    I just realized something... if you are trying to resize a button to take the whole sufrace of a dialog you do not need all that:


    [code]
    void ResizeButton (HWND hDlg, int nBtnID)
    {
    RECT dlgRect;
    HWND hButton = GetDlgItem (hDlg, nBtnID);

    GetClientRect (hDlg, &dlgRect);
    MoveWindow (hButton, 0, 0, dlgRect.right, dlgRect.bottom, TRUE);
    }
    [/code]

Sign In or Register to comment.