Here is the good one attached. Sorry for the trouble. Please discard the previous one. a+ ChangeLog: - Fix how the size of the dialog is computed and the child component placed. -- Maxime Bellengà <maxime.bellenge@laposte.net> Index: wine/dlls/commdlg/filedlg95.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/filedlg95.c,v retrieving revision 1.90 diff -u -r1.90 filedlg95.c --- wine/dlls/commdlg/filedlg95.c 7 Mar 2003 20:29:31 -0000 1.90 +++ wine/dlls/commdlg/filedlg95.c 16 Mar 2003 22:24:15 -0000 @@ -516,53 +516,52 @@ GetClientRect(hwndParentDlg,&rectParent); GetClientRect(hwndChildDlg,&rectChild); + /* + There are two possibilities to add components to the default file dialog box. + + By default, all the new components are added below the standard dialog box (the else case). + + However, if there is a static text component with the stc32 id, a special case happens. + The x and y coordinates of stc32 indicate the top left corner where to place the standard file dialog box + in the window and the cx and cy indicate how to size the window. + Moreover, if the new component's coordinates are on the left of the stc32 , it is placed on the left + of the standard file dialog box. If they are above the stc32 component, it is placed above and so on.... + + */ if(hwndStc32) { GetWindowRect(hwndStc32,&rectStc32); MapWindowPoints(0, hwndChildDlg,(LPPOINT)&rectStc32,2); - CopyRect(&rectTemp,&rectStc32); + CopyRect(&rectTemp,&rectStc32); - SetRect(&rectStc32,rectStc32.left,rectStc32.top,rectStc32.left + (rectParent.right-rectParent.left),rectStc32.top+(rectParent.bottom-rectParent.top)); - SetWindowPos(hwndStc32,0,rectStc32.left,rectStc32.top,rectStc32.right-rectStc32.left,rectStc32.bottom-rectStc32.top,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE); - - ptParentClient.x = max((rectParent.right-rectParent.left),(rectChild.right-rectChild.left)); - if(rectStc32.right < rectTemp.right) - ptMoveCtl.x = 0; - else - ptMoveCtl.x = (rectStc32.right - rectTemp.right); - - ptParentClient.y = max((rectParent.bottom-rectParent.top),(rectChild.bottom-rectChild.top)); - if(rectStc32.bottom < rectTemp.bottom) - ptMoveCtl.y = 0; - else - ptMoveCtl.y = (rectStc32.bottom - rectTemp.bottom); + ptParentClient.x = (rectParent.right-rectParent.left)+(rectChild.right-rectChild.left)-(rectStc32.right-rectStc32.left); + ptMoveCtl.x = (rectParent.right-rectParent.left) ; + + ptParentClient.y = (rectParent.bottom-rectParent.top)+(rectChild.bottom-rectChild.top)-(rectStc32.bottom-rectStc32.top) ; + ptMoveCtl.y = (rectParent.bottom-rectParent.top) ; } else { - if( (GetWindow(hwndChildDlg,GW_CHILD)) == NULL) return; - SetRectEmpty(&rectTemp); ptParentClient.x = max((rectParent.right-rectParent.left),(rectChild.right-rectChild.left)); ptParentClient.y = (rectParent.bottom-rectParent.top) + (rectChild.bottom-rectChild.top); ptMoveCtl.y = rectParent.bottom-rectParent.top; - ptMoveCtl.x=0; + ptMoveCtl.x = rectParent.right - rectParent.left; + SetRect(&rectTemp,0,0,ptParentClient.x,ptMoveCtl.y); } + /* Set the new size of the window from the extra space needed */ SetRect(&rectParent,rectParent.left,rectParent.top,rectParent.left+ptParentClient.x,rectParent.top+ptParentClient.y); AdjustWindowRectEx( &rectParent,GetWindowLongA(hwndParentDlg,GWL_STYLE),FALSE,GetWindowLongA(hwndParentDlg,GWL_EXSTYLE)); - SetWindowPos(hwndChildDlg, 0, 0,0, ptParentClient.x + ptMoveCtl.x,ptParentClient.y + ptMoveCtl.y, SWP_NOZORDER ); - SetWindowPos(hwndParentDlg, 0, rectParent.left,rectParent.top, (rectParent.right- rectParent.left) + ptMoveCtl.x, - (rectParent.bottom-rectParent.top) + ptMoveCtl.y,SWP_NOMOVE | SWP_NOZORDER); - + SetWindowPos(hwndChildDlg, 0, 0,0, ptParentClient.x,ptParentClient.y, SWP_NOZORDER ); + SetWindowPos(hwndParentDlg, 0, rectParent.left,rectParent.top, (rectParent.right- rectParent.left), + (rectParent.bottom-rectParent.top),SWP_NOMOVE | SWP_NOZORDER); + + /* + This part moves the child components below the file dialog box if stc32 is not present + and place them accordinf to stc32 if it is present. + */ hwndChild = GetWindow(hwndChildDlg,GW_CHILD); - if(hwndStc32) - { - GetWindowRect(hwndStc32,&rectStc32); - MapWindowPoints( 0, hwndChildDlg,(LPPOINT)&rectStc32,2); - } - else - SetRect(&rectStc32,0,0,0,0); - if (hwndChild ) { do @@ -575,33 +574,28 @@ MapWindowPoints( 0, hwndParentDlg,(LPPOINT)&rectCtrl,2); /* - Check the initial position of the controls relative to the initial - position and size of stc32 (before it is expanded). + If stc32 is present, moves the child components as required. -- Maxime Bellengà <maxime.bellenge@wanadoo.fr> */ - if (rectCtrl.left >= rectTemp.right && rectCtrl.top >= rectTemp.bottom) - { - rectCtrl.left += ptMoveCtl.x; - rectCtrl.top += ptMoveCtl.y; - } - else if (rectCtrl.left >= rectTemp.right) - { - rectCtrl.left += ptMoveCtl.x; - rectCtrl.right += ptMoveCtl.x; + if ((rectCtrl.left >= rectTemp.right) && ((rectCtrl.left+ptMoveCtl.x)<rectParent.right)){ + rectCtrl.left += ptMoveCtl.x; + rectCtrl.right +=ptMoveCtl.x; } - else if (rectCtrl.top >= rectTemp.bottom) - { + if ((rectCtrl.top > rectTemp.bottom) && ((rectCtrl.top+ptMoveCtl.y)<rectParent.bottom)){ rectCtrl.top += ptMoveCtl.y; - rectCtrl.bottom += ptMoveCtl.y; + rectCtrl.bottom += ptMoveCtl.y; } - + SetWindowPos( hwndChild, 0, rectCtrl.left, rectCtrl.top, rectCtrl.right-rectCtrl.left,rectCtrl.bottom-rectCtrl.top, SWP_NOSIZE | SWP_NOZORDER ); } } while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != NULL); - } - hwndChild = GetWindow(hwndParentDlg,GW_CHILD); + } + /* + This part moves the components of the default file dialog box according to the stc32 coordinates. + */ + hwndChild = GetWindow(hwndParentDlg,GW_CHILD); if(hwndStc32) { GetWindowRect(hwndStc32,&rectStc32); @@ -616,7 +610,7 @@ { if (GetWindowLongA( hwndChild, GWL_STYLE ) & WS_MAXIMIZE) continue; - GetWindowRect(hwndChild,&rectCtrl); + GetWindowRect(hwndChild,&rectCtrl); MapWindowPoints( 0, hwndParentDlg,(LPPOINT)&rectCtrl,2); rectCtrl.left += ptMoveCtl.x; @@ -684,7 +678,6 @@ fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE) { HINSTANCE hinst; - if (fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE) { hinst = 0;
Index: wine/dlls/commdlg/filedlg95.c =================================================================== RCS file: /home/wine/wine/dlls/commdlg/filedlg95.c,v retrieving revision 1.90 diff -u -r1.90 filedlg95.c --- wine/dlls/commdlg/filedlg95.c 7 Mar 2003 20:29:31 -0000 1.90 +++ wine/dlls/commdlg/filedlg95.c 16 Mar 2003 22:24:15 -0000 @@ -516,53 +516,52 @@ GetClientRect(hwndParentDlg,&rectParent); GetClientRect(hwndChildDlg,&rectChild); + /* + There are two possibilities to add components to the default file dialog box. + + By default, all the new components are added below the standard dialog box (the else case). + + However, if there is a static text component with the stc32 id, a special case happens. + The x and y coordinates of stc32 indicate the top left corner where to place the standard file dialog box + in the window and the cx and cy indicate how to size the window. + Moreover, if the new component's coordinates are on the left of the stc32 , it is placed on the left + of the standard file dialog box. If they are above the stc32 component, it is placed above and so on.... + + */ if(hwndStc32) { GetWindowRect(hwndStc32,&rectStc32); MapWindowPoints(0, hwndChildDlg,(LPPOINT)&rectStc32,2); - CopyRect(&rectTemp,&rectStc32); + CopyRect(&rectTemp,&rectStc32); - SetRect(&rectStc32,rectStc32.left,rectStc32.top,rectStc32.left + (rectParent.right-rectParent.left),rectStc32.top+(rectParent.bottom-rectParent.top)); - SetWindowPos(hwndStc32,0,rectStc32.left,rectStc32.top,rectStc32.right-rectStc32.left,rectStc32.bottom-rectStc32.top,SWP_NOMOVE|SWP_NOZORDER | SWP_NOACTIVATE); - - ptParentClient.x = max((rectParent.right-rectParent.left),(rectChild.right-rectChild.left)); - if(rectStc32.right < rectTemp.right) - ptMoveCtl.x = 0; - else - ptMoveCtl.x = (rectStc32.right - rectTemp.right); - - ptParentClient.y = max((rectParent.bottom-rectParent.top),(rectChild.bottom-rectChild.top)); - if(rectStc32.bottom < rectTemp.bottom) - ptMoveCtl.y = 0; - else - ptMoveCtl.y = (rectStc32.bottom - rectTemp.bottom); + ptParentClient.x = (rectParent.right-rectParent.left)+(rectChild.right-rectChild.left)-(rectStc32.right-rectStc32.left); + ptMoveCtl.x = (rectParent.right-rectParent.left) ; + + ptParentClient.y = (rectParent.bottom-rectParent.top)+(rectChild.bottom-rectChild.top)-(rectStc32.bottom-rectStc32.top) ; + ptMoveCtl.y = (rectParent.bottom-rectParent.top) ; } else { - if( (GetWindow(hwndChildDlg,GW_CHILD)) == NULL) return; - SetRectEmpty(&rectTemp); ptParentClient.x = max((rectParent.right-rectParent.left),(rectChild.right-rectChild.left)); ptParentClient.y = (rectParent.bottom-rectParent.top) + (rectChild.bottom-rectChild.top); ptMoveCtl.y = rectParent.bottom-rectParent.top; - ptMoveCtl.x=0; + ptMoveCtl.x = rectParent.right - rectParent.left; + SetRect(&rectTemp,0,0,ptParentClient.x,ptMoveCtl.y); } + /* Set the new size of the window from the extra space needed */ SetRect(&rectParent,rectParent.left,rectParent.top,rectParent.left+ptParentClient.x,rectParent.top+ptParentClient.y); AdjustWindowRectEx( &rectParent,GetWindowLongA(hwndParentDlg,GWL_STYLE),FALSE,GetWindowLongA(hwndParentDlg,GWL_EXSTYLE)); - SetWindowPos(hwndChildDlg, 0, 0,0, ptParentClient.x + ptMoveCtl.x,ptParentClient.y + ptMoveCtl.y, SWP_NOZORDER ); - SetWindowPos(hwndParentDlg, 0, rectParent.left,rectParent.top, (rectParent.right- rectParent.left) + ptMoveCtl.x, - (rectParent.bottom-rectParent.top) + ptMoveCtl.y,SWP_NOMOVE | SWP_NOZORDER); - + SetWindowPos(hwndChildDlg, 0, 0,0, ptParentClient.x,ptParentClient.y, SWP_NOZORDER ); + SetWindowPos(hwndParentDlg, 0, rectParent.left,rectParent.top, (rectParent.right- rectParent.left), + (rectParent.bottom-rectParent.top),SWP_NOMOVE | SWP_NOZORDER); + + /* + This part moves the child components below the file dialog box if stc32 is not present + and place them accordinf to stc32 if it is present. + */ hwndChild = GetWindow(hwndChildDlg,GW_CHILD); - if(hwndStc32) - { - GetWindowRect(hwndStc32,&rectStc32); - MapWindowPoints( 0, hwndChildDlg,(LPPOINT)&rectStc32,2); - } - else - SetRect(&rectStc32,0,0,0,0); - if (hwndChild ) { do @@ -575,33 +574,28 @@ MapWindowPoints( 0, hwndParentDlg,(LPPOINT)&rectCtrl,2); /* - Check the initial position of the controls relative to the initial - position and size of stc32 (before it is expanded). + If stc32 is present, moves the child components as required. */ - if (rectCtrl.left >= rectTemp.right && rectCtrl.top >= rectTemp.bottom) - { - rectCtrl.left += ptMoveCtl.x; - rectCtrl.top += ptMoveCtl.y; - } - else if (rectCtrl.left >= rectTemp.right) - { - rectCtrl.left += ptMoveCtl.x; - rectCtrl.right += ptMoveCtl.x; + if ((rectCtrl.left >= rectTemp.right) && ((rectCtrl.left+ptMoveCtl.x)<rectParent.right)){ + rectCtrl.left += ptMoveCtl.x; + rectCtrl.right +=ptMoveCtl.x; } - else if (rectCtrl.top >= rectTemp.bottom) - { + if ((rectCtrl.top > rectTemp.bottom) && ((rectCtrl.top+ptMoveCtl.y)<rectParent.bottom)){ rectCtrl.top += ptMoveCtl.y; - rectCtrl.bottom += ptMoveCtl.y; + rectCtrl.bottom += ptMoveCtl.y; } - + SetWindowPos( hwndChild, 0, rectCtrl.left, rectCtrl.top, rectCtrl.right-rectCtrl.left,rectCtrl.bottom-rectCtrl.top, SWP_NOSIZE | SWP_NOZORDER ); } } while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != NULL); - } - hwndChild = GetWindow(hwndParentDlg,GW_CHILD); + } + /* + This part moves the components of the default file dialog box according to the stc32 coordinates. + */ + hwndChild = GetWindow(hwndParentDlg,GW_CHILD); if(hwndStc32) { GetWindowRect(hwndStc32,&rectStc32); @@ -616,7 +610,7 @@ { if (GetWindowLongA( hwndChild, GWL_STYLE ) & WS_MAXIMIZE) continue; - GetWindowRect(hwndChild,&rectCtrl); + GetWindowRect(hwndChild,&rectCtrl); MapWindowPoints( 0, hwndParentDlg,(LPPOINT)&rectCtrl,2); rectCtrl.left += ptMoveCtl.x; @@ -684,7 +678,6 @@ fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE) { HINSTANCE hinst; - if (fodInfos->ofnInfos->Flags & OFN_ENABLETEMPLATEHANDLE) { hinst = 0;