Что такое код deferwindowpos

Что такое код deferwindowpos

Здравствуйте, Лемминг, Вы писали:

Л>А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?

А ты сначала докажи, что не работает.

От: Лемминг
Дата: 16.02.10 12:04
Оценка:

Здравствуйте, kero, Вы писали:

K>Здравствуйте, Лемминг, Вы писали:

Л>>А мне нужно, чтобы WM_WINDOWPOSCHANGING не посылылось, иначе возможно зацикливание. Что делать?

K>А ты сначала докажи, что не работает.

У меня не работает. Говорит, Invalid Parameter. Без этого флага работает на ура.

От: kero
Дата: 16.02.10 13:20
Оценка:

Здравствуйте, Лемминг, Вы писали:

Л>У меня не работает. Говорит, Invalid Parameter. Без этого флага работает на ура.

Код? (И винда какая?)

От: Лемминг
Дата: 16.02.10 15:59
Оценка:

Здравствуйте, kero, Вы писали:

K>Код? (И винда какая?)

Винда XP Pro. А код примерно такой:

От: kero
Дата: 16.02.10 18:49
Оценка:

Здравствуйте, Лемминг, Вы писали:

Л>Винда XP Pro. А код примерно такой:
[. ]

Так вот вы о чем. Ну, см. MSDN — «EndDeferWindowPos Function»:

Remarks
The EndDeferWindowPos function sends the WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to each window identified in the internal structure.

А вы включаете SWP_NOSENDCHANGING и удивляетесь, что не работает

И с чего вы взяли, что «иначе возможно зацикливание»? Честно набросал себе пример (сдвиг нескольких кнопок по WM_SIZE их паренту) — таки OK.

От: Лемминг
Дата: 17.02.10 09:52
Оценка:

Remarks
K>The EndDeferWindowPos function sends the WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to each window identified in the internal structure.

K>А вы включаете SWP_NOSENDCHANGING и удивляетесь, что не работает

K>И с чего вы взяли, что «иначе возможно зацикливание»? Честно набросал себе пример (сдвиг нескольких кнопок по WM_SIZE их паренту) — таки OK.

Так и SetWindowPos посылает эти сообщения. Но если поставить флаг, то WM_WINDOWPOSCHANGING не посылается. Я наивно полагал, что EndDeferWindowPos будет вести себя так же. В документации по самой DeferWindowPos этот флаг описан как ни в чем не бывало (как всегда писали доку копипастом и забыли убрать лишнее ).

Насчет зацикливания — если в двух словах, у меня не только кнопки двигаются по WM_SIZE пэренту, но и размер пэрента может корректироваться по наличию в нем кнопок, отсюда и зацикливание. Конечно, оно маловероятно, но если сейчас оставить эти грабли, то рано или поздно я на них наступлю. Так что придется, наверное, вернуться к обычному SetWindowPos.

Кстати, есть информация, как именно работает EndDeferWindowPos — одномоментно перемещает все окна и затем рассылает им сообщения или поочередно перемещает каждое окно и сообщает ему об этом, как SetWindowPos в цикле? Если второе, то пожалуй и смысла в этой бодяге никакого.

От: kero
Дата: 17.02.10 13:32
Оценка:

Здравствуйте, Лемминг, Вы писали:

Л>Кстати, есть информация, как именно работает EndDeferWindowPos —
Л>одномоментно перемещает все окна и затем рассылает им сообщения
Л>или поочередно перемещает каждое окно и сообщает ему об этом, как SetWindowPos в цикле?

Все же есть некоторая разница между *ED и *ING:

WM_WINDOWPOSCHANGING Notification
.
Remarks
.
An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS.

Как узнать, вызвал ли DeferWindowPos () перераспределение?

Допустим, у меня есть следующий код для изменения размера элемента управления вкладкой в окне:

Возможно, что DeferWindowPos вызвал увеличение размера базовой структуры, например, если есть больше страниц, чем первоначально указано. В этом случае hDWPUpdated будет дескриптором обновленной структуры позиции. Есть ли способ обнаружить это обновление размера структуры? Я думал о сравнении hDWP и hDWPUpdated :

но в документации только говорится, что:

[. ] Дескриптор, возвращаемый этой функцией, может отличаться от дескриптора, переданного функции.

что наводит меня на мысль, что, хотя размер конструкции не изменился, маркеры могут не совпадать. Можно ли предположить, что если ручки не одинаковые, то размеры разные? Если нет, как я мог это сделать?

1 ответ

Дескриптор разработан, чтобы скрыть все детали реализации. Вы не можете сравнивать содержимое структуры за дескриптором и ничего не можете сделать, когда дескриптор изменяется.

Единственное, что вы можете сделать, — это самостоятельно отслеживать количество вызовов DeferWindowPos . Я спрашиваю, стоит ли оно того, поскольку DeferWindowPos предназначен для работы независимо от того, предсказали ли вы количество перемещаемых окон или нет. Любой аспект эффективности, вероятно, будет потерян в шуме. Но если вы настаиваете, я предлагаю создать класс, который отслеживает все это для вас и предоставляет немного RAII.

DeferWindowPos

winapi Функция DeferWindowPos

Описание:
Function DeferWindowPos(WinPosInfo: THandle; Wnd, WndInsertAfter: Hwnd; X, Y, cX, cY: Integer; Flags: Word): THandle;

Обновляет WinPosInfo для окна, опpеделяемого Wnd.

Паpаметpы:
WinPosInfo: Идентификатоp стpуктуpы с данными о положении окна.
Wnd: Окно, о котоpом хpанится инфоpмация обновления.
WndInsertAfter: Окно, после котоpого вставляется Wnd.
X, Y: Положение веpхнего левого угла окна.

cX, cY: Новая шиpина окна.
Flags: Флаги установки положения окна

Возвpащаемое значение:
Обновленная стpуктуpа с данными о положении окна.

Материал взят из:
Русская спpавка по Windows API

Как узнать, вызвало ли перераспределение DeferWindowPos()?

Допустим, у меня есть следующий код для изменения размера элемента управления вкладки внутри окна:

Возможно, что DeferWindowPos вызвало увеличение размера базовой структуры, например, если есть больше страниц, чем было указано первоначально. В этом случае hDWPUpdated будет дескриптором обновленной структуры позиции. Есть ли способ определить это обновление размера структуры? Я думал о сравнении hDWP и hDWPUpdated :

но в документации только указано, что:

[. ] Ручка, возвращаемая этой функцией, может отличаться от дескриптора, переданного функции.

что заставляет меня думать, что, хотя размер структуры не изменился, ручки могут быть не одинаковыми. Могу ли я предположить, если ручки не совпадают, тогда размеры разные? Если нет, как я могу это сделать?

Илон Маск рекомендует:  Что такое код pdf_arcn

1 ответ

Ручка предназначена для скрытия всех деталей реализации. Вы не можете сравнивать содержимое структуры за дескриптором, и не можете вывести что-либо при изменении дескриптора.

Единственное, что вы можете сделать, это отслеживать количество звонков на DeferWindowPos самостоятельно. Я сомневаюсь, стоит ли это, поскольку DeferWindowPos предназначен для работы независимо от того, предсказываете ли вы количество перемещаемых окон или нет. Любой аспект эффективности, вероятно, будет потерян в шуме. Но если вы настаиваете, мое предложение состоит в том, чтобы создать класс, который отслеживает все это для вас и предоставляет немного RAII.

DeferWindowPos weird behaviour

This happens with all ActiveX controls. If I reposition an ActiveX control with DeferWindowPos

it goes there but then moves/resizes to its old rectangle once you click anywhere inside the control. If I use MoveWindow instead

this doesn’t happen.

It doesn’t happen with any other type of control, only with ActiveX controls, but it happens with all of them. I made a test to confirm this, creating a new ActiveX control project and didn’t make any changes, and the problem was still there.

2 Answers 2

You never got an appropriate answer. I’ll try to help out a bit here.

The issue is that MFC hides a lot of the trickiness with hosting an ActiveX control within it’s framework. Specifically, if you step into the MoveWindow call, it is not simply a wrapper around the Win32 MoveWindow function. It calls into the OLE Control Container support classes. This basically says, if we have a control site interface, then call COleControlSite::MoveWindow, otherwise call the standard Win32 MoveWindow. The same occurs with several other window functions handled by CWnd etc. For example COleControlSite::SetWindowPos handles hiding/showing the control, then calls COleControlSite::MoveWindow to move it, and then finally calls ::SetWindowPos (with the move/show flags masked out) to handle the rest.

Once within COleControlSite::MoveWindow, you will notice it does several things: it calls SetExtent, updates it’s internal m_rect member, and then calls SetObjectRects.

Bypassing these for ActiveX controls using the Win32 API directly (eg via DeferWindowPos) causes some of these crucial steps to be missed. Depending on how your code is layed out, usually you can handle this yourself.

DeferWindowPos странное поведение

Это происходит со всеми элементами управления ActiveX. Если я переместю элемент управления ActiveX с помощью DeferWindowPos

он идет там , но затем перемещает/изменяет размер до старого прямоугольника, как только вы нажимаете в любом месте элемента управления. Если я использую MoveWindow вместо

этого не происходит.

Это не происходит с каким-либо другим типом управления, только с элементами управления ActiveX, но это происходит со всеми из них. Я сделал тест, чтобы подтвердить это, создав новый проект управления ActiveX и не внес никаких изменений, и проблема все еще была там.

2 ответа

У вас не было подходящего ответа. Я попробую немного помочь здесь.

Проблема в том, что MFC скрывает много хитрости с размещением элемента управления ActiveX внутри него. В частности, если вы входите в вызов MoveWindow, это не просто оболочка вокруг функции Win32 MoveWindow. Он вызывает классы поддержки OLE Control Container. В основном это говорит о том, что если у нас есть интерфейс интерфейса управления, вызовите COleControlSite:: MoveWindow, иначе вызовите стандартный Win32 MoveWindow. То же самое происходит с несколькими другими функциями окна, обрабатываемыми CWnd и т.д. Например, COleControlSite:: SetWindowPos обрабатывает скрытие/показ элемента управления, затем вызывает COleControlSite:: MoveWindow, чтобы переместить его, а затем, наконец, вызывает:: SetWindowPos (с флажками move/show замаскировано), чтобы справиться с остальными.

Как только внутри COleControlSite:: MoveWindow вы заметите, что он выполняет несколько действий: вызывает SetExtent, обновляет его внутренний член m_rect, а затем вызывает SetObjectRects.

Обход этих элементов управления ActiveX с использованием API Win32 напрямую (например, через DeferWindowPos) приводит к пропущению некоторых из этих важных шагов. В зависимости от того, как выкладывается ваш код, обычно вы можете справиться с этим самостоятельно.

Что такое этот элемент управления ActiveX?

Кроме того, считайте, что DeferWindowPos предназначен для одновременного размещения нескольких окон. Концепция заключается в том, что вы вводите инструкцию begin, меняете кучу позиций окна для нового макета, а затем завершаете фактическое перемещение и применение новых позиций и размеров.

Если вы не обновляете несколько окон, вместо этого используйте SetWindowPos.

Считайте также, что вы можете получать сообщение для перемещения, изменения размера или изменения положения окна во время отсрочки. Чтобы предотвратить это, если это то, что происходит, передайте флаг SWP_NOSENDCHANGING в каждом вызове DeferWindowPos , чтобы он не был отправлен или не обработал сообщение и не очистил все биты структуры WINDOWPOS , полученные для предотвращения нежелательных изменений.

Также возможно, чтобы этот вызов вышел из строя. вы проверяете возвращаемое значение?

Что такое код deferwindowpos

Updates the specified multiple-window – position structure for the specified window. The function then returns a handle to the updated structure. The EndDeferWindowPos function uses the information in this structure to change the position and size of a number of windows simultaneously. The BeginDeferWindowPos function creates the structure.

Syntax

Parameters

Type: HDWP

A handle to a multiple-window – position structure that contains size and position information for one or more windows. This structure is returned by BeginDeferWindowPos or by the most recent call to DeferWindowPos.

Type: HWND

A handle to the window for which update information is stored in the structure. All windows in a multiple-window – position structure must have the same parent.

hWndInsertAfter [in, optional]

Type: HWND

A handle to the window that precedes the positioned window in the Z order. This parameter must be a window handle or one of the following values. This parameter is ignored if the SWP_NOZORDER flag is set in the uFlags parameter.

Илон Маск рекомендует:  Использование шаблонов при программировании web приложений

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.

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.

Places the window at the top of the Z order.

Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated.

Type: int

The x-coordinate of the window’s upper-left corner.

Type: int

The y-coordinate of the window’s upper-left corner.

Type: int

The window’s new width, in pixels.

Type: int

The window’s new height, in pixels.

Type: UINT

A combination of the following values that affect the size and position of the window.

Value Meaning
HWND_BOTTOM ((HWND)1)
HWND_NOTOPMOST ((HWND)-2)
HWND_TOP ((HWND)0)
HWND_TOPMOST ((HWND)-1)

Draws a frame (defined in the window’s class description) around the window.

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.

Hides the window.

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).

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.

Retains the current position (ignores the x and y parameters).

Does not change the owner window’s position in the Z order.

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.

Same as the SWP_NOOWNERZORDER flag.

Prevents the window from receiving the WM_WINDOWPOSCHANGING message.

Retains the current size (ignores the cx and cy parameters).

Retains the current Z order (ignores the hWndInsertAfter parameter).

Displays the window.

Return value

Type: HDWP

The return value identifies the updated multiple-window – position structure. The handle returned by this function may differ from the handle passed to the function. The new handle that this function returns should be passed during the next call to the DeferWindowPos or EndDeferWindowPos function.

If insufficient system resources are available for the function to succeed, the return value is NULL. To get extended error information, call GetLastError.

Remarks

If a call to DeferWindowPos fails, the application should abandon the window-positioning operation and not call EndDeferWindowPos.

If SWP_NOZORDER is not specified, the system places the window identified by the hWnd parameter in the position following the window identified by the hWndInsertAfter parameter. If hWndInsertAfter is NULL or HWND_TOP, the system places the hWnd window at the top of the Z order. If hWndInsertAfter is set to HWND_BOTTOM, the system places the hWnd window at the bottom of the Z order.

All coordinates for child windows are relative to the upper-left corner of the parent window’s client area.

A window can be made a topmost window either by setting hWndInsertAfter to the HWND_TOPMOST flag and ensuring that the SWP_NOZORDER flag is not set, or by setting the 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. An application 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.

A topmost window is no longer topmost if it is repositioned to the bottom (HWND_BOTTOM) of the Z order or after any non-topmost window. When a topmost window is made non-topmost, its owners and its owned windows are also made non-topmost windows.

A non-topmost window may own a topmost window, but not vice versa. 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.

Requirements

Minimum supported client

Windows 2000 Professional [desktop apps only]

c++ уроки Отменить DeferWindowPos

mfc visual studio 2013 (2)

Единственная ссылка на любую функцию «прервать», которую я вижу, такова:

Если какое-либо из окон в структуре с несколькими окнами имеет флаг SWP_HIDEWINDOW или SWP_SHOWWINDOW, ни одно из окон не будет перемещено.

Я делаю серию изменения размера окна с использованием функции DeferWindowPos. Предположим, что я уже открыл дескриптор DeferWindowPos и ​​несколько раз назвал DeferWindowPos, и теперь я хочу отменить все: не вызывать EndDeferWindowPos. Я попробовал CloseHandle (hDWP), но он не работает (сбой). Если я просто вернусь от своей функции, я предполагаю, что это приведет к утечке дескриптора. Можно ли отключить DeferWindowPos без вызова EndDeferWindowPos?

Если это невозможно, я просто накапливаю их во временном векторе и назовуте материал Defer в конце, когда я уверен, что хочу сделать все.

«Если это невозможно, я просто накапливаю их во временном векторе и называю материал« Отсрочка »в конце, когда я уверен, что хочу сделать все».

Это было бы правильным решением. Каков ваш аргумент в пользу нерешительности относительно того, какие окна переместятся между BeginDeferWindowPos , DeferWindowPos и EndDeferWindowPos ? Это, по-видимому, больше связано с проблемой потоковой передачи, которую вы можете решить, используя соответствующую блокировку.

Ответ Аркадия не отменяет ничего. Насколько я понимаю документацию Win32 , вы просто не можете комбинировать операции show / hide с операциями репозиционирования . Другими словами, вы не отменяете операцию , операции show / hide просто имеют приоритет, и те, которые будут выполняться.

Я инкапсулировал отображение / скрытие и перемещение в управляемой библиотеке: расширение библиотеки классов классов .

Отмена DeferWindowPos

December 2020

467 раз

Я делаю серию изменения размеров окна с помощью функции DeferWindowPos. Предположим, что я уже раскрылись DeferWindowPos ручки, и называется DeferWindowPos немного времени, и теперь я хочу, чтобы отменить все: не называйте EndDeferWindowPos. Я попытался CloseHandle (hDWP), но он не работает (сбой). Если бы я просто вернулся из моей функции, я полагаю, он будет течь в ручку. Можно прекратить DeferWindowPos без вызова EndDeferWindowPos?

Если это не возможно, я просто накапливать их во временном векторе, и назвать вещи Перенести в конце концов, когда я уверен, что я хочу сделать их всех.

2 ответы

«Если это не возможно, я просто накапливать их во временном векторе, и назвать вещи Перенести в конце концов, когда я уверен, что я хочу сделать их всех.»

Это было бы правильное решение. Что ваш аргумент в нерешительности относительно которых окон позиционирования между BeginDeferWindowPos , DeferWindowPos и EndDeferWindowPos ? Это , кажется, относится больше к проблеме нарезания резьбы , которые можно решить с помощью соответствующей блокировки.

Arkadiy «ответ s не„отмена“ничего. Насколько я понимаю документацию Win32 , вы просто не можете комбинировать показать / скрыть операции с репозицией операциями . Другими словами, вы не отмените операцию , то показать / скрыть операции просто имеют приоритет и те из них , которые будут выполнены.

Я инкапсулированный показ / скрытие и репозиционирование в управляемой библиотеке: Framework Class Library Extension .

Конкретная RepositionWindows() функция находится в Whathecode.System.Windows.WindowManager и берет на себя как показа / скрытия и изменения положения.

Единственная ссылка на какой-либо «прервать» функциональность я вижу это:

Если какие-либо из окон в многослойной структуре в оконной позиции имеет SWP_HIDEWINDOW или установлен флаг SWP_SHOWWINDOW, ни одно из окон не приложены.

Функции поддержки окон. Данные класса окна. , страница 3

Пример применения функции DeferWindowPos

EnableWindow • Windows 98 • Windows 2000

Функция EnableWindow применяется для разрешения и запрещения окон. Эта функция чаще всего используется для запрещения элементов управления редактированием и кнопок, чтобы пользователь не мог ввести данные или активизировать кнопку.

BOOL EnableWindow( HWND hwnd, BOOL ЪЕпаЫе)

HWND. Дескриптор окна, которое должно быть разрешено или запрещено.

BOOL. Устанавливается в TRUE для разрешения использования окна и устанавливается в FALSE для запрещения.

BOOL. Если использование окна запрещено, возвращаемым значением является TRUE; в ином случае возвращаемым значением является FALSE.

SetFocus, GetFocus, SetActiveWindow

В следующем примере приложение создает элемент управления редактированием в качестве дочернего окна главного окна приложения. При выборе опции меню Test! элементу управления редактированием будет запрещено воспринимать ввод с клавиатуры. Элемент управления редактированием можно разрешить, вызвав функцию EnableWindow с параметром ЬЕпаЫе, установленным в TRUE. ;

См. /local -sources/chap04/04-08. txt \

EndDeferWindowPos • Windows 98 • Windows 2000

Функция EndDeferWindowPos является третьей и последней функцией в ряду функций BeginDeferWindowPos, DeferWindowPos и EndDeferWindowPos.

Эта функция одновременно обновляет положение и размеры одного или нескольких окон, которые были переданы функции DeferWindowPos. Функция EndDeferWindowPos может применяться для быстрого перемещения одного или нескольких окон с обновлением экрана только один раз.

BOOL EndDeferWindowPos( HDWP hdwp )

HDWP. Дескриптор структуры с описанием нескольких окон, который был возвращен при последнем вызове функции DeferWindowPos. Эта структура содержит информацию о размерах и позиции одного или нескольких окон.

BOOL. TRUE, если функция была выполнена успешно, и FALSE в противном случае.

BeginDeferWindowPos, DeferWindowPos, MoveWindow

См. пример для функции DeferWindowPos.

EnumChildWindows • Windows 98 «• Windows 2000

Функция EnumChildWindows отправляет функции обратного вызова дескрипторы дочерних окон, принадлежащих родительскому окну. Выполнение функции EnumChildWindows продолжается до тех пор, пока не будут обработаны все дочерние окна или пока функция обратного вызова не вернет значение FALSE.

Функция EnumChildWindows может применяться для последовательной обработки всех дочерних окон, если не известно количество дочерних окон.

BOOL EnumChildWindows( HWND hwndParent, WNDENUMPROC wndenmprc, LPARAM IParam )

HWND. Дескриптор родительского окна дочерних окон, которые должны быть перечислены.

WNDENUMPROC. Указатель на функцию обратного вызова, определенную в приложении.

LPARAM. 32-разрядное значение, которое должно быть отправлено в функцию обратного вызова для каждого дочернего окна. См. приведенное ниже описание функции обратного вызова.

BOOL. TRUE, если функция была выполнена успешно, и FALSE в противном случае.

EnumProps, EnumPropsEx, EnumThreadWindows, EnumWindows

Синтаксис обратного вызова

BOOL CALLBACK EnumChildProcf HWND hwnd, LPARAM IParam )

Параметры обратного вызова

HWND. Дескриптор дочернего окна.

LPARAM. 32-разрядное значение, которое было передано в параметр IParam функции EnumChildWindows.

В следующем примере (рис. 4.2) функция EnumChildWindows применяется . для изменения текста элементов управления редактированием, созданных в приложении. Строка, которая должна быть установлена в качестве текста элемента управления редактированием, передается в виде параметра IParam функции EnumChildProc. Имя класса каждого дескриптора окна, передаваемого функции EnumChildProc, проверяется с целью изменения только элементов управления редактированием.

Илон Маск рекомендует:  Оптимизационная стратегия
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Value Meaning
SWP_DRAWFRAME 0x0020
SWP_FRAMECHANGED 0x0020
SWP_HIDEWINDOW 0x0080
SWP_NOACTIVATE 0x0010
SWP_NOCOPYBITS 0x0100
SWP_NOMOVE 0x0002
SWP_NOOWNERZORDER 0x0200
SWP_NOREDRAW 0x0008
SWP_NOREPOSITION 0x0200
SWP_NOSENDCHANGING 0x0400
SWP_NOSIZE 0x0001
SWP_NOZORDER 0x0004
SWP_SHOWWINDOW 0x0040