В общем сделал я окно в ресурсах, и захотелось мне сделать так, чтобы при ресайзе некоторые контролы "прилипли" к одному краю, а некоторые - к другому. Для этого при инициализации диалога я запомнил расположение всех контролов, а при ресайзе главного окна я двигаю контролы в нужное место. Но проблема в том, что "нужное" место - совсем не нужное, контролы не на своём месте! Отсюда 2 вопроса: 1)Что я делаю не так? 2)Возможно то, что мне нужно делается гораздо проще. Описание диалога в ресурсах: Код (C): MAINDIAL DIALOGEX 0, 0, 392, 247, 0 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_VISIBLE | WS_DLGFRAME | WS_MINIMIZEBOX | WS_OVERLAPPEDWINDOW EXSTYLE WS_EX_CONTEXTHELP CAPTION "Window" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL FONT 8, "MS Shell Dlg" { CONTROL "TreeView", 0, "SysTreeView32", 0x00000007, 2, 2, 388, 164, WS_EX_CLIENTEDGE CONTROL "ProgressBar", 1, "msctls_progress32", 2, 168, 388, 16, WS_EX_CLIENTEDGE LTEXT "Label1", 2, 2, 186, 32, 8, NOT WS_GROUP PUSHBUTTON "Button1", 3, 290, 232, 100, 12 PUSHBUTTON "Button2", 4, 352, 216, 38, 12 PUSHBUTTON "Button3", 5, 352, 200, 38, 12 PUSHBUTTON "Button4", 6, 2, 232, 38, 12 GROUPBOX "Button5", 7, 124, 192, 162, 52 EDITTEXT 8, 128, 228, 60, 12, NOT WS_BORDER, WS_EX_CLIENTEDGE LTEXT "Label2", 9, 128, 218, 56, 8, NOT WS_GROUP EDITTEXT 10, 220, 228, 60, 12, NOT WS_BORDER, WS_EX_CLIENTEDGE LTEXT "Label3", 11, 220, 218, 54, 8, NOT WS_GROUP PUSHBUTTON "Button6", 12, 352, 186, 38, 12 PUSHBUTTON "Button7", 13, 46, 232, 38, 12, WS_DISABLED } Код программы: Код (C): #define NUM_OF_CONTROLS 14 RECT ControlsRects[NUM_OF_CONTROLS]; const bool Left[NUM_OF_CONTROLS]={true,true,true,false,false,false,true,false,false,false,false,false,false,true}; const bool Top[NUM_OF_CONTROLS]={true,true,true,false,false,false,false,false,false,false,false,false,false,false}; const bool Right[NUM_OF_CONTROLS]={true,true,false,true,true,true,false,true,true,true,true,true,true,false}; const bool Bottom[NUM_OF_CONTROLS]={false,false,false,true,true,true,true,true,true,true,true,true,true,true}; //Реакция на сообщение WM_INITDIALOG BOOL OnCreate(HWND hDial) { RECT StartDlgRect; GetWindowRect(hDial,&StartDlgRect); unsigned int Width=StartDlgRect.right-StartDlgRect.left; unsigned int Height=StartDlgRect.bottom-StartDlgRect.top; for(unsigned int i=0;i<NUM_OF_CONTROLS-1;i++) { HWND h=GetDlgItem(hDial,i); RECT r; GetWindowRect(h,&r); ControlsRects[i].left=r.left; ControlsRects[i].top=r.top; ControlsRects[i].right=Width-r.right; ControlsRects[i].bottom=Height-r.bottom; } return TRUE; } //Реакция на сообщение WM_SIZE BOOL OnResize(HWND hDial) { RECT StartDlgRect; GetWindowRect(hDial,&StartDlgRect); unsigned int Width=StartDlgRect.right-StartDlgRect.left; unsigned int Height=StartDlgRect.bottom-StartDlgRect.top; for(unsigned int i=0;i<NUM_OF_CONTROLS-1;i++) { HWND h=GetDlgItem(hDial,i); RECT r; GetWindowRect(h,&r); if(Left[i]) { r.left=ControlsRects[i].left; } if(Top[i]) { r.top=ControlsRects[i].top; } if(Right[i]) { r.right=Width-ControlsRects[i].right; } if(Left[i]) { r.bottom=Height-ControlsRects[i].bottom; } SetWindowPos(h,0,r.left,r.top,r.right-r.left,r.bottom-r.top,0); } return TRUE; }
Bottom[ i ] вместо Left[ i ] в последнем if'е надо. Кому-то пора уже научиться внимательней читать свои сорцы
А, ну йопта, GetWindowRect() возвращает координаты относительно рабочего стола. ScreenToClient() юзай для каждой пары rect.left+rect.top, rect.right+rect.bottom.
Код (C): void GetChildWindowRect (HWND hwndParent, HWND hwndChild, RECT* rect) { POINT pt; GetWindowRect (hwndChild, rect); pt.x = rect->left; pt.y = rect->top; ScreenToClient (hwndParent, &pt); rect->left = pt.x; rect->top = pt.y; pt.x = rect->right; pt.y = rect->bottom; ScreenToClient (hwndParent, &pt); rect->right = pt.x; rect->bottom = pt.y; }