WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема API, стиль окна К предыдущему сообщению На следующее сообщение Программирование

Отправил ABTOMAH в 18:27 18.12.2002[Ответить]
Private Declare Function SetWindowLong Lib user32 Alias SetWindowLongA _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const WS_EX_CLIENTEDGE = &H200&
Private Const GWL_EXSTYLE = (-20)

Private Sub MDIForm_Load()
SetWindowLong Me.hwnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE
End Sub

Константа WS_EX_CLIENTEDGE задаёт рамку и делает её утопленной см. Pic 1.

Pic 1

Если не задавать стиль (по умолчанию), окно имеет вид см. Pic 2.

Pic 2

Вопрос: Какой стиль имеет окно см. Pic 3? И как его задать?

Pic 3


Отправил Dushes в 08:31 19.12.2002[Ответить]
[u]Такое окно создается при помощи функции API:[/u]
HWND CreateWindow(
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu or child-window identifier
HANDLE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);
где используются стандартные стили описания окна - данное окно является просто overlapped....

WS_OVERLAPPED Creates an overlapped window. An overlapped window usually has a caption and a border.

WS_OVERLAPPEDWINDOW Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles.

проблем вроде не должно быть :xz:


Отправил Dushes в 08:45 19.12.2002[Ответить]
в догонку:
можно попробовать дополнительно с WS_OVERLAPPEDWINDOW еще WS_CLIPCHILDREN


Отправил ABTOMAH в 22:48 19.12.2002[Ответить]
Благодарю за внимание.

Похоже, что Visual Basic 6.0 не поддерживает CreateWindow
Пишет: Run-time error '453':
Can't find Dll entry point CreateWindowA in user32

Зато поддерживает CreateWindowEx
Я даже нашёл пример как эту функцию использовать
http://mostdelta.hut.ru/wincommander/winapI32.shtml

Но в моём случае нужно ИЗМЕНИТЬ уже готовую MDIForm-у
(иначе придется, чуть ли не заново начинать учить букварь:)
Возможно, нужное решение лежит в комбинации констант.

Так, например WS_MINIMIZEBOX даёт стиль см. Pic 4
SetWindowLong Me.hwnd, GWL_EXSTYLE, WS_MINIMIZEBOX

Pic 4

В моём случае мне не обязательно именно такой стиль как на Pic 3.
Мне нужно чтобы меню отделялась от ToolBar-a (но не просто полосой).
Подойдёт и стиль как на Pic 1, вот толка бы уменьшить глубину бордюра.


Отправил Dushes в 10:04 20.12.2002[Ответить]
дык а что тебе мешает вместо GWL_EXSTYLE использовать стандратные стили GWL_STYLE - установи стиль overlapped + WS_CLIPCHILDREN
WS_CLIPCHILDREN ! WS_OVERLAPPEDWINDOW ?


Отправил ABTOMAH в 14:05 20.12.2002[Ответить]
SetWindowLong Me.hwnd, GWL_STYLE, WS_CLIPCHILDREN Or WS_OVERLAPPED

Pic 5

SetWindowLong Me.hwnd, GWL_STYLE, WS_CLIPCHILDREN Or WS_OVERLAPPED Or WS_CAPTION

Pic 6


Отправил Dushes в 14:23 20.12.2002[Ответить]
БЛИН
а старые стили кто запоминать будет?

::SetWindowLong(Me.hwnd, GWL_STYLE, ::GetWindowLong(Me.hwnd,GWL_STYLE) ! WS_CLIPCHILDREN ! WS_OVERLAPPEDWINDOW )




Отправил ABTOMAH в 15:15 20.12.2002[Ответить]
Получается Pic 2

SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) Or WS_CLIPCHILDREN Or WS_OVERLAPPED

Похоже VisualBasic не пддерживает WS_OVERLAPPEDWINDOW (WS_OVERLAPPED поддерживает)
SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, GWL_STYLE) Or WS_CLIPCHILDREN Or WS_OVERLAPPEDWINDOW
Тут тоже Pic 2


Отправил Dushes в 08:12 23.12.2002[Ответить]
из winuser.h
................................................................
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED !
WS_CAPTION !
WS_SYSMENU !
WS_THICKFRAME !
WS_MINIMIZEBOX !
WS_MAXIMIZEBOX)

#define WS_POPUPWINDOW (WS_POPUP !
WS_BORDER !
WS_SYSMENU)
...........................................
попробуй дополнительно с WS_OVERLAPPED дополнительно использовать WS_POPUP!WS_BORDER.....

больше ничего на ум не приходит :xz:


Отправил ABTOMAH в 15:02 23.12.2002[Ответить]
Всё равно получается Pic 2.
Благодарю за уделённое мне внимание.


Отправил greg в 08:59 29.12.2002[Ответить]
В комплекте VC++6.0 поставляется удивительная утилитка Spy++.
Она вам покажет и класс окна, и стили окна.


Отправил ABTOMAH в 17:03 29.12.2002[Ответить]
Благодарю.

Дык у меня SpyWorks Professional еся, с него то я и начал. Но, похоже, тут не в стилях дело.
Наверное, дело в том, что VB имеет свою менюшку. И к меню верхнего уровня хрен подлезешь.
А использовать менюшку стороннего производителя не хотса т.к. они не поддерживают горячие клавиши с русскими буквами, самолично отслеживать нажатия геморойно.