Resend of the Fix for ArrangeCtrlPositions in commdlg
Maxime Bellengé
maxime.bellenge at laposte.net
Sun Mar 16 07:06:37 CST 2003
As requested by Alexandre, I send the patch with more comments.
I have made several test cases under windows and taken screenshot to
compare with wine. If someone is interested in seeing them, send me a
mail.
ChangeLog:
- Fix how the size of the dialog is computed and the child component
placed.
--
Maxime Bellengé <maxime.bellenge at 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 13:00:00 -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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: filedlg95.patch
Type: text/x-patch
Size: 5079 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-patches/attachments/20030316/cc283286/filedlg95.bin
More information about the wine-patches
mailing list