Malaja
|
|
« : 16-03-2005 10:00 » |
|
Люди, кто помнит, как заполнить LOWORD / HIWORD для LPARAM? Т.е. надо отправить WM_SIZE и указать новые размеры окна. pDlg->PostMessage(WM_SIZE, wparam, lparam) WM_SIZE fwSizeType = wParam; // resizing flag nWidth = LOWORD(lParam); // width of client area nHeight = HIWORD(lParam); // height of client area Если просто написать lParam = 50, то получается заполненным соответственно только nWidth
|
|
« Последнее редактирование: 17-03-2005 12:52 от Malaja »
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #1 : 16-03-2005 10:25 » |
|
а зачем помнить? есть мсдн
WM_SIZE Notification
--------------------------------------------------------------------------------
The WM_SIZE message is sent to a window after its size has changed.
A window receives this message through its WindowProc function.
Syntax
WM_SIZE
WPARAM wParam LPARAM lParam; Parameters
wParam Specifies the type of resizing requested. This parameter can be one of the following values. SIZE_MAXHIDE Message is sent to all pop-up windows when some other window is maximized. SIZE_MAXIMIZED The window has been maximized. SIZE_MAXSHOW Message is sent to all pop-up windows when some other window has been restored to its former size. SIZE_MINIMIZED The window has been minimized. SIZE_RESTORED The window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies. lParam The low-order word of lParam specifies the new width of the client area. The high-order word of lParam specifies the new height of the client area.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #2 : 16-03-2005 10:31 » |
|
а заполнить соответственно так - WORD nWidth = 100; // LOWORD(lParam); width of client area WORD nHeight = 200; //HIWORD(lParam); height of client area DWORD lParam = nWidth | (nHeight<<16);
|
|
« Последнее редактирование: 16-03-2005 10:45 от Pu »
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #3 : 16-03-2005 10:37 » |
|
а еще есть такой макрос - LPARAM MAKELPARAM( WORD wLow, WORD wHigh ); nWidth = 100; // LOWORD(lParam); width of client area nHeight = 200; //HIWORD(lParam); height of client area lParam = MAKELPARAM( nWidth, nHeight);
#define MAKELONG(a, b) ((LONG)(((WORD)((DWORD_PTR)(a) & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)(b) & 0xffff))) << 16)) #define MAKELPARAM(l, h) ((LPARAM)(DWORD)MAKELONG(l, h))
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Malaja
|
|
« Ответ #4 : 16-03-2005 10:49 » |
|
Заяц, миленький, я тебя обожаю! Именно этот макрос я и искала, т.е. я помнила, что он был, но как его звали - не помнила! А что касается побитовых сдвижек, тут я просто пас - ну просачковала я еще на лекзиях эту тему, а потом нигде не надо было, посему я это никогда не помню Говорю же - я женщина забывчивая
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Malaja
|
|
« Ответ #5 : 16-03-2005 11:17 » |
|
Упс, а wm_size что-то не работает. ;-( Создала обычное mdi - приложение, в нем создала диалог как popup / dialog frame, в котором толко title bar есть. Стартую его как немодальный из View, при старте перемещаю в правый верхний угол основного приложения и хочу задать ему определенные размеры. Но это ничего не дает - т.е. окно перемещается куда надо, а вот размеры остаются неизменными. А почему - не пойму... ;-(
LPARAM lparam = MAKELPARAM(50, 50); WPARAM wParam = (WPARAM)SIZE_RESTORED; m_pClockShow->PostMessage(WM_SIZE, wParam, lparam);
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #6 : 16-03-2005 11:36 » |
|
The WM_SIZE message is sent to a window AFTER its size has changed. WM_SIZE - не служит для того чтобы изменить размеры виндоу. Оно посылается окну после того как размеры изменили. И в качестве параметров передается состояние окна текущее.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #7 : 16-03-2005 11:39 » |
|
попробуй вот эту функцию АПИ - The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area.
Syntax
BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint ); Parameters
hWnd [in] Handle to the window. X [in] Specifies the new position of the left side of the window. Y [in] Specifies the new position of the top of the window. nWidth [in] Specifies the new width of the window. nHeight [in] Specifies the new height of the window. bRepaint [in] Specifies whether the window is to be repainted. If this parameter is TRUE, the window receives a message. If the parameter is FALSE, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of moving a child window. Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
|
|
« Последнее редактирование: 20-12-2007 17:57 от Алексей1153++ »
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 16-03-2005 12:36 » |
|
Есть еше одна функция для этих целей The SetWindowPos function changes the size, position, and Z order of a child, pop-up, or top-level window. Child, pop-up, and top-level windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.
BOOL SetWindowPos(
HWND hWnd, // handle of window HWND hWndInsertAfter, // placement-order handle int X, // horizontal position int Y, // vertical position int cx, // width int cy, // height UINT uFlags // window-positioning flags );
Parameters
hWnd
Identifies the window.
hWndInsertAfter
Identifies the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values:
Value Meaning HWND_BOTTOM Places the window at the bottom of the Z order. If the hWnd parameter identifies a topmost window, the window loses its topmost status and is placed at the bottom of all other windows. HWND_NOTOPMOST Places the window above all non-topmost windows (that is, behind all topmost windows). This flag has no effect if the window is already a non-topmost window. HWND_TOP Places the window at the top of the Z order. HWND_TOPMOST Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated.
For more information about how this parameter is used, see the following Remarks section.
X
Specifies the new position of the left side of the window.
Y
Specifies the new position of the top of the window.
cx
Specifies the new width of the window, in pixels.
cy
Specifies the new height of the window, in pixels.
uFlags
Specifies the window sizing and positioning flags. This parameter can be a combination of the following values:
Value Meaning SWP_DRAWFRAME Draws a frame (defined in the window's class description) around the window. SWP_FRAMECHANGED Sends a WM_NCCALCSIZE message to the window, even if the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE is sent only when the window's size is being changed. SWP_HIDEWINDOW Hides the window. SWP_NOACTIVATE Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter parameter). SWP_NOCOPYBITS Discards the entire contents of the client area. If this flag is not specified, the valid contents of the client area are saved and copied back into the client area after the window is sized or repositioned. SWP_NOMOVE Retains the current position (ignores the X and Y parameters). SWP_NOOWNERZORDER Does not change the owner window's position in the Z order. SWP_NOREDRAW Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of the window being moved. When this flag is set, the application must explicitly invalidate or redraw any parts of the window and parent window that need redrawing. SWP_NOREPOSITION Same as the SWP_NOOWNERZORDER flag. SWP_NOSENDCHANGING Prevents the window from receiving the WM_WINDOWPOSCHANGING message. SWP_NOSIZE Retains the current size (ignores the cx and cy parameters). SWP_NOZORDER Retains the current Z order (ignores the hWndInsertAfter parameter). SWP_SHOWWINDOW Displays the window.
Return Values
If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
If the SWP_SHOWWINDOW or SWP_HIDEWINDOW flag is set, the window cannot be moved or sized. All coordinates for child windows are client coordinates (relative to the upper-left corner of the parent window's client area). A window can be made a topmost window either by setting the hWndInsertAfter parameter to HWND_TOPMOST and ensuring that the SWP_NOZORDER flag is not set, or by setting a window's position in the Z order so that it is above any existing topmost windows. When a non-topmost window is made topmost, its owned windows are also made topmost. Its owners, however, are not changed.
If neither the SWP_NOACTIVATE nor SWP_NOZORDER flag is specified (that is, when the application requests that a window be simultaneously activated and its position in the Z order changed), the value specified in hWndInsertAfter is used only in the following circumstances:
· Neither the HWND_TOPMOST nor HWND_NOTOPMOST flag is specified in hWndInsertAfter. · The window identified by hWnd is not the active window.
An application cannot activate an inactive window without also bringing it to the top of the Z order. Applications can change an activated window's position in the Z order without restrictions, or it can activate a window and then move it to the top of the topmost or non-topmost windows. If a topmost window is repositioned to the bottom (HWND_BOTTOM) of the Z order or after any non-topmost window, it is no longer topmost. When a topmost window is made non-topmost, its owners and its owned windows are also made non-topmost windows.
A non-topmost window can own a topmost window, but the reverse cannot occur. Any window (for example, a dialog box) owned by a topmost window is itself made a topmost window, to ensure that all owned windows stay above their owner. If an application is not in the foreground, and should be in the foreground, it must call the SetForegroundWindow function.
|
|
« Последнее редактирование: 20-12-2007 17:59 от Алексей1153++ »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Malaja
|
|
« Ответ #9 : 16-03-2005 12:51 » |
|
Pu,
Это идея, но возникает проблема - мне известны чистые размеры окна (без учета title bar). Для MoveWindow надо указать полные размеры... Т.е. как посчитать полную высоту (а точнее, как вычислить высоту title bar обычного диалога)?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 16-03-2005 13:16 » |
|
Есть функция GetSystemMetrics. Её вызовы с параметрами SM_CYCAPTION и SM_CYMENU, и SM_CXBORDER, и SM_CYBORDER тебе дадут размеры не клиентской области. The GetSystemMetrics function retrieves various system metrics and system configuration settings.
System metrics are the dimensions (widths and heights) of Windows display elements. All dimensions retrieved by GetSystemMetrics are in pixels.
int GetSystemMetrics(
int nIndex // system metric or configuration setting to retrieve );
Parameters
nIndex
Specifies the system metric or configuration setting to retrieve. All SM_CX* values are widths. All SM_CY* values are heights. The following values are defined:
Value Meaning SM_ARRANGE Flags specifying how the system arranged minimized windows. For more information about minimized windows, see the following Remarks section. SM_CLEANBOOT Value that specifies how the system was started:0 Normal boot1 Fail-safe boot2 Fail-safe with network bootFail-safe boot (also called SafeBoot) bypasses the user's startup files. SM_CMOUSEBUTTONS Number of buttons on mouse, or zero if no mouse is installed. SM_CXBORDER, SM_CYBORDER The width and height, in pixels, of a window border. This is equivalent to the SM_CXEDGE value for windows with the 3-D look. SM_CXCURSOR, SM_CYCURSOR Width and height, in pixels, of a cursor. These are the cursor dimensions supported by the current display driver. The system cannot create cursors of other sizes. SM_CXDLGFRAME, SM_CYDLGFRAME Same as SM_CXFIXEDFRAME and SM_CYFIXEDFRAME. SM_CXDOUBLECLK, SM_CYDOUBLECLK Width and height, in pixels, of the rectangle around the location of a first click in a double-click sequence. The second click must occur within this rectangle for the system to consider the two clicks a double-click. (The two clicks must also occur within a specified time.) SM_CXDRAG, SM_CYDRAG Width and height, in pixels, of a rectangle centered on a drag point to allow for limited movement of the mouse pointer before a drag operation begins. This allows the user to click and release the mouse button easily without unintentionally starting a drag operation. SM_CXEDGE, SM_CYEDGE Dimensions, in pixels, of a 3-D border. These are the 3-D counterparts of SM_CXBORDER and SM_CYBORDER. SM_CXFIXEDFRAME, SM_CYFIXEDFRAME Thickness, in pixels, of the frame around the perimeter of a window that has a caption but is not sizable. SM_CXFIXEDFRAME is the width of the horizontal border and SM_CYFIXEDFRAME is the height of the vertical border. Same as SM_CXDLGFRAME and SM_CYDLGFRAME. SM_CXFRAME, SM_CYFRAME Same as SM_CXSIZEFRAME and SM_CYSIZEFRAME. SM_CXFULLSCREEN, SM_CYFULLSCREEN Width and height of the client area for a full-screen window. To get the coordinates of the portion of the screen not obscured by the tray, call the SystemParametersInfo function with the SPI_GETWORKAREA value. SM_CXHSCROLL, SM_CYHSCROLL Width, in pixels, of the arrow bitmap on a horizontal scroll bar; and height, in pixels, of a horizontal scroll bar. SM_CXHTHUMB Width, in pixels, of the thumb box in a horizontal scroll bar. SM_CXICON, SM_CYICON The default width and height, in pixels, of an icon. These values are typically 32x32, but can vary depending on the installed display hardware.The LoadIcon function can only load icons of these dimensions. SM_CXICONSPACING, SM_CYICONSPACING Dimensions, in pixels, of a grid cell for items in large icon view. Each item fits into a rectangle of this size when arranged. These values are always greater than or equal to SM_CXICON and SM_CYICON. SM_CXMAXIMIZED, SM_CYMAXIMIZED Default dimensions, in pixels, of a maximized top-level window. SM_CXMAXTRACK, SM_CYMAXTRACK Default maximum dimensions, in pixels, of a window that has a caption and sizing borders. The user cannot drag the window frame to a size larger than these dimensions. A window can override these values by processing the WM_GETMINMAXINFO message. SM_CXMENUCHECK, SM_CYMENUCHECK Dimensions, in pixels, of the default menu check-mark bitmap. SM_CXMENUSIZE, SM_CYMENUSIZE Dimensions, in pixels, of menu bar buttons, such as multiple document (MIDI) child close. SM_CXMIN, SM_CYMIN Minimum width and height, in pixels, of a window. SM_CXMINIMIZED, SM_CYMINIMIZED Dimensions, in pixels, of a normal minimized window. SM_CXMINSPACING SM_CYMINSPACING Dimensions, in pixels, of a grid cell for minimized windows. Each minimized window fits into a rectangle this size when arranged. These values are always greater than or equal to SM_CXMINIMIZED and SM_CYMINIMIZED. SM_CXMINTRACK, SM_CYMINTRACK Minimum tracking width and height, in pixels, of a window. The user cannot drag the window frame to a size smaller than these dimensions. A window can override these values by processing the WM_GETMINMAXINFO message. SM_CXSCREEN, SM_CYSCREEN Width and height, in pixels, of the screen. SM_CXSIZE, SM_CYSIZE Width and height, in pixels, of a button in a window's caption or title bar. SM_CXSIZEFRAME, SM_CYSIZEFRAME Thickness, in pixels, of the sizing border around the perimeter of a window that can be resized. SM_CXSIZEFRAME is the width of the horizontal border and SM_CYSIZEFRAME is the height of the vertical border. Same as SM_CXFRAME and SM_CYFRAME. SM_CXSMICON, SM_CYSMICON Recommended dimensions, in pixels, of a small icon. Small icons typically appear in window captions and in small icon view. SM_CXSMSIZE SM_CYSMSIZE Dimensions, in pixels, of small caption buttons. SM_CXVSCROLL, SM_CYVSCROLL Width, in pixels, of a vertical scroll bar; and height, in pixels, of the arrow bitmap on a vertical scroll bar. SM_CYCAPTION Height, in pixels, of normal caption area. SM_CYKANJIWINDOW For double-byte character set versions of Windows, height, in pixels, of the Kanji window at the bottom of the screen. SM_CYMENU Height, in pixels, of single-line menu bar. SM_CYSMCAPTION Height, in pixels, of a small caption. SM_CYVTHUMB Height , in pixels, of the thumb box in a vertical scroll bar. SM_DBCSENABLED TRUE or nonzero if the double-byte character set (DBCS) version of USER.EXE is installed; FALSE, or zero otherwise. SM_DEBUG TRUE or nonzero if the debugging version of USER.EXE is installed; FALSE, or zero, otherwise. SM_MENUDROPALIGNMENT TRUE, or nonzero if drop-down menus are right-aligned relative to the corresponding menu-bar item; FALSE, or zero if they are left-aligned. SM_MIDEASTENABLED TRUE if the system is enabled for Hebrew/Arabic languages. SM_MOUSEPRESENT TRUE or nonzero if a mouse is installed; FALSE, or zero, otherwise. SM_MOUSEWHEELPRESENT Windows NT only: TRUE or nonzero if a mouse with a wheel is installed; FALSE, or zero, otherwise. SM_NETWORK The least significant bit is set if a network is present; otherwise, it is cleared. The other bits are reserved for future use. SM_PENWINDOWS TRUE or nonzero if the Microsoft Windows for Pen computing extensions are installed; zero, or FALSE, otherwise. SM_SECURE TRUE if security is present, FALSE otherwise. SM_SHOWSOUNDS TRUE or nonzero if the user requires an application to present information visually in situations where it would otherwise present the information only in audible form; FALSE, or zero, otherwise. SM_SLOWMACHINE TRUE if the computer has a low-end (slow) processor, FALSE otherwise. SM_SWAPBUTTON TRUE or nonzero if the meanings of the left and right mouse buttons are swapped; FALSE, or zero, otherwise.
Return Values
If the function succeeds, the return value is the requested system metric or configuration setting. If the function fails, the return value is zero. GetLastError does not provide extended error information.
Remarks
System metrics may vary from display to display. The SM_ARRANGE setting specifies how the system arranges minimized windows, and consists of a starting position and a direction. The starting position can be one of the following values.
Value Meaning ARW_BOTTOMLEFT Start at lower-left corner of screen (default position). ARW_BOTTOMRIGHT Start at lower-right corner of screen. Equivalent to ARW_STARTRIGHT. ARW_HIDE Hide minimized windows by moving them off of the visible area of the screen. ARW_TOPLEFT Start at upper-left corner of screen. Equivalent to ARV_STARTTOP. ARW_TOPRIGHT Start at upper-right corner of screen. Equivalent to ARW_STARTTOP | SRW_STARTRIGHT.
The direction in which to arrange can be one of the following values.
Value Meaning ARW_DOWN Arrange vertically, top to bottom. ARW_LEFT Arrange horizontally, left to right. ARW_RIGHT Arrange horizontally, right to left. ARW_UP Arrange vertically, bottom to top.
|
|
« Последнее редактирование: 20-12-2007 18:01 от Алексей1153++ »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Malaja
|
|
« Ответ #11 : 16-03-2005 13:59 » |
|
Finch, спасибочки!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Malaja
|
|
« Ответ #12 : 17-03-2005 13:08 » |
|
Люди, опять караул, но с другой стороны : опять же есть MDI, т.е. MainFrame снаружи и View внутри. Сверху еще болтается немодальный диалог. Мне надо при изменении размеров Frame-a (т.е. самого внешнего окна) изменять размеры View таким образом, чтобы окно View всегда было в пределах окна Frame. Попыталась сделать так : void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) { CMDIFrameWnd::OnSizing(fwSide, pRect);
CRect rect1, rect2, rect3; int nWidth1, nHight1, nWidth2, nHight2;
CTest_visuView* pView = NULL;
getView(&pView); if (pView) { // view pView->GetClientRect(&rect1); nWidth1 = rect1.Width(); nHight1 = rect1.Height();
// the main frame this->GetClientRect(&rect2); nWidth2 = rect2.Width(); nHight2 = rect2.Height(); if (nWidth1 < nWidth2 && nHight1 < nHight2) { return; }
int nTBp = 0, nFS_Xp = 0, nFS_Yp = 0, nMS_Yp = 0;
// width of the title bar nTBp = GetSystemMetrics(SM_CYCAPTION); // Thickness, in pixels, of the sizing border around the perimeter of a // window that can be resized. nFS_Xp = GetSystemMetrics(SM_CXFRAME); nFS_Yp = GetSystemMetrics(SM_CYFRAME); // width of the menu bar nMS_Yp = GetSystemMetrics(SM_CYMENUSIZE);
// resize the view pView->SetWindowPos(&wndNoTopMost, rect1.left, rect1.top, nWidth2,nHight2, SWP_DEFERERASE | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE); // // pView->MoveWindow(rect1.left, rect1.top, nWidth2 - 2 * nFS_Yp, // nHight2 - nTBp - nMS_Yp - 2 * nFS_Xp, TRUE); pView->Invalidate(); Invalidate(); } }
Не помогает ;-( Т.е. размеры окна View, судя по всему, меняются (видно из debuga), но чисто визуально не меняется ничего... А почему - не пойму, ведь Paint явно вызывается, во-первых, с помощью Invalidate, а во-вторых, флагом SWP_DRAWFRAME | SWP_FRAMECHANGED!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 17-03-2005 13:33 » |
|
pView->SetWindowPos(&wndNoTopMost, rect1.left, rect1.top, nWidth2,nHight2, SWP_DEFERERASE | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE);
Сразу предупрежу, Я не знаком с MFC. Поэтому первое: Что есть такое wndNoTopMost и почему в функцию посылается его указатель. Если это подрузомевался параметр HWND hWndInsertAfter. То можно смело ставить NULL. Так как он должен игнорироваться согласно SWP_NOZORDER Retains the current Z order (ignores the hWndInsertAfter parameter).
Ну и второе: заместо rect1.left, rect1.top можно просто указать нули, так как эти параметры игнорируются SWP_NOMOVE Retains the current position (ignores the X and Y parameters).
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Malaja
|
|
« Ответ #14 : 17-03-2005 13:57 » |
|
Finch, это были остатки предыдущих попыток Но проблемы это, к сожалению, не решает...
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #15 : 17-03-2005 14:16 » |
|
Где то теряется посылка на обновление окна. Вот где. Нужно искать. Есть пара коментариев: 1. Ты где либо запретила обновление окна. 2. У сообшения на обновление (WM_PAINT) есть два свойства. а) Это сообшение имеет очень низкий приоритет т.е. выполняется в самую последнюю очередь. б) Функции BeginPaint, EndPaint Которые обычно ставятся в обработчике сообшения WM_PAINT. Убивают все остальные сообшения WM_PAINT в очереди. 3. Посмотри в дебаге. Может быть твои попытки на изменение размеров провалились. Поля размеров остались прежними.
|
|
« Последнее редактирование: 17-03-2005 14:23 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Malaja
|
|
« Ответ #16 : 17-03-2005 14:36 » |
|
да я с самого начала посмотрела - поменялись, но не перерисовались ;-(
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #17 : 17-03-2005 14:39 » |
|
В MFC не знаю, в Borland VCL сам факт изменения координат, уже вел к отрисовке, насколько я знаю.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #18 : 17-03-2005 15:31 » |
|
pView->Invalidate(); Invalidate();
Да кстати, Если pView является дочерним окном. То в принципе должно быть достаточно вызова на прорисовку родительского окна. И оно само автоматом даст команду на прорисовку всем дочерним окнам.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #19 : 17-03-2005 15:35 » |
|
Вот еше нашел The WM_SIZE message is sent to a window after its size has changed.
WM_SIZE fwSizeType = wParam; // resizing flag nWidth = LOWORD(lParam); // width of client area nHeight = HIWORD(lParam); // height of client area
Parameters
fwSizeType
Value of wParam. Specifies the type of resizing requested. This parameter can be one of the following values:
Value Meaning SIZE_MAXHIDE Message is sent to all pop-up windows when some other window is maximized. SIZE_MAXIMIZED Window has been maximized. SIZE_MAXSHOW Message is sent to all pop-up windows when some other window has been restored to its former size. SIZE_MINIMIZED Window has been minimized. SIZE_RESTORED Window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies.
nWidth
Value of the low-order word of lParam. Specifies the new width of the client area.
nHeight
Value of the high-order word of lParam. Specifies the new height of the client area.
Return Values
If an application processes this message, it should return zero.
Remarks
If the SetScrollPos or MoveWindow function is called for a child window as a result of the WM_SIZE message, the bRedraw parameter should be nonzero to cause the window to be repainted. Although the width and height of a window are 32-bit values, the nWidth and nHeight parameters of the WM_SIZE message contain only the low-order 16 bits.
В нашем случае интересен выделенный абзац. Ненадо давать на прорисовку. Просто надо "bRedraw parameter should be nonzero"
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Hooter
|
|
« Ответ #20 : 17-03-2005 20:37 » |
|
void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) А почему ты говоришь об обработке сообщения WM_SIZE, а используешь OnSizing? OnSizing - это обработчик сообщения WM_SIZING в MFC afx_msg void OnSizing(UINT nSide, LPRECT lpRect);
Обработчик WM_SIZE вообще другой вид имеет: afx_msg void OnSize(UINT nType, int cx, int cy);
Имхо, ты просто не туда ткнула в ClassWizard'е Для решения твоей задачи тебе именно OnSize нужно использовать. Вот пример кода из MSDN: // Resize the list control contained in the view to // fill the entire view when the view's window is // resized. CMyView is a CView derived class. void CMyView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // Resize list to fill the whole view. m_List.MoveWindow (0, 0, cx, cy); }
И работает без Paint или Invalidate.
|
|
« Последнее редактирование: 20-12-2007 18:05 от Алексей1153++ »
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #21 : 18-03-2005 07:46 » |
|
Finch, Hooter,
Я взяла WM_SIZING для более плавной перерисовки картинки (т.к. у меня еще сверху на всем этом немодальный диалог болтается, который должен всегда находиться в правом верхнем углу View). Проблема заключается в том, что вне зависимости от обработчика (WM_SIZING или WM_SIZЕ) и функции ( MoveWindow(..., TRUE) или SetWindowPos ) размеры View меняются, но его перерисовка не происходит, т.е. визуально он остается все время одного размера.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Hooter
|
|
« Ответ #22 : 18-03-2005 23:09 » |
|
Слушай, а зачем тебе вот это условие? if (nWidth1 < nWidth2 && nHight1 < nHight2) { return; }
Если у тебя View меньше, чем мейнфрейм или развернут на весь мейнфрейм, то условие всегда истинно. И код, который после условия - там, где ты пытаешься резмеры изменить - не выполняется. Я вот сгенерил приложеньце и вставил твой код. Не работало. Убрал условие - все нормально стало. Или я что-то не понял в твоем коде?
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #23 : 21-03-2005 08:24 » |
|
Hooter,
согласна - условие можно убрать. Но и при этом перерисовка не происходит, т.е. при старте изначально View меньше MainFrame, если я тяну контур MainFrame, то ничего не меняется, хотя я и меняю размер View. Xотя я ожидаю, что при первом же изменении размера MainFrameразмер View будет изменен (согласно кода в обработчике OnSize()).
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Hooter
|
|
« Ответ #24 : 21-03-2005 18:49 » |
|
Тогда давай попробуем "плясать от печки", как говорится... Попробуй убрать всё в OnSizing, оставь только минимум кода. И никаких относительных координат для View - при создании View сделай ему RECT{0, 0, 0, 0}, а в OnSizing задай размеры жестко. Например, так: void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) { CMDIFrameWnd::OnSizing(fwSide, pRect); getView(&pView); if (pView) { pView->MoveWindow(0, 0, 1024, 1024); } }
Посмотрим, что получится...
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #25 : 22-03-2005 08:39 » |
|
Hooter,
пробовала - не спасает ;-( Ситуация какая-то бредовая - если тянешь сам View, то resize срабатывает правильно и область перерисовывается. Если же тянешь MainFrame, то resize срабатывает правильно, но область View НЕ перерисовывается, а точнее перерисовывается только та область, которая не больше изначально при старте нарисованной. Если же новая область меньше изначально нарисованной, то только эта новая и перерисовывается, а остальное - нет... А почему - не пойму!!! Ведь View получает свой OnSize!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #26 : 22-03-2005 08:55 » |
|
Malaja, я просмотрел топики и понял, что ничего не понял. Например как View может быть меньше MianFrame? Он вообще безразмерный - те заполняет всегда клиентскую область. Самое идеальное - если у тебя есть тестовый проектик - кинь на мыло.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Malaja
|
|
« Ответ #27 : 22-03-2005 09:10 » |
|
Dgon, spasibochki - uge skinula!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #28 : 22-03-2005 13:58 » |
|
В общем как я и думал... Речь идёт о MDI под изменением View наверно понимается изменение размеров CChildFrame. В CMainFrame достаточно реагировать на WM_MOVE, обычно все ing-овые означают процесс, непосредственное действие (проще говоря начало действия, а не конечный результат) WM_SIZE отлавливается в самом View, что она и сделала. Недостаёт только перемещений CChldFrame в пределах клиенской области CMainFrame.
Malaja, не удержался (может ещё кому-нить будет полезно):
bool CTest_visuView::moveDlg() { CRect rect1, rect2; GetClientRect(&rect1); ClientToScreen(&rect1); if(rect1.Width()!=0 && rect1.Height()!=0) { m_pClockShow->GetWindowRect(&rect2); m_pClockShow->MoveWindow(rect1.right - rect2.Width(), rect1.top, rect2.Width(), rect2.Height(), TRUE); return true; } return false; }
В CChildFrame добавь: 1. #include "test_visuDoc.h" в .срр 2. #include "test_visuView.h" в .срр 3. ON_WM_MOVE() 4.
void CChildFrame::OnMove(int x, int y) { CMDIChildWnd::OnMove(x, y); CView *pView = GetActiveView(); if(pView) { ((CTest_visuView*)pView)->moveDlg(); } }
CMainFrame
1. OnSize можешь выкинуть - непонятно зачем оно вообще нужно? 2. OnMoving можешь выкинуть 3. View можно проще достать,вернее говоря твоя ф-я
CView* CTest_visuApp::getView() { POSITION pos = this->GetFirstDocTemplatePosition(); CDocTemplate* templ = this->GetNextDocTemplate(pos); POSITION posD = templ->GetFirstDocPosition(); CDocument* docTmp = templ->GetNextDoc(posD); POSITION posV = docTmp->GetFirstViewPosition(); CView* pView = docTmp->GetNextView(posV); return pView; }
возвращает ТОЛЬКО первый View ТОЛЬКО первого документа, а если это не первый? тогда как? обычно для иттераций необходимо доп. условие поиска, тогда ты бежишь по всем въю всех документов пока не найдёшь нужный)
View активного документа (именно его ты перемещаешь и видишь) CView *CMainFrame::GetActiveView() { CMDIChildWnd *pChild = (CMDIChildWnd*)GetActiveFrame(); if(pChild && pChild->IsKindOf(RUNTIME_CLASS(CChildFrame))) { return ((CChildFrame*)pChild)->GetActiveView(); } return NULL; }
4. Вместо ON_WM_MOVING используй ON_WM_MOVE
void CMainFrame::OnMove(int x, int y) { CMDIFrameWnd::OnMove(x,y); CView *pView = GetActiveView(); if (pView) { ((CTest_visuView*)pView)->moveDlg(); } }
5. Вместо (CTest_visuApp*)AfxGetApp() проще использовать theApp
В общем изменённый проект я тебе на мыло кину. Только я не уверен, что ты именно этого хотела - я имею ввиду привязку диалога к View. Но тут уже действует логика технического задания.
|
|
« Последнее редактирование: 22-03-2005 14:08 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|