
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.62] |
![]() |
|
Сообщ.
#1
,
|
|
|
Как сделать окно без заголовка (гольный Canvas) не на форме, а прямо на рабочем столе?
(типа как WinAmp делает, или как окошечки хинтов) |
Сообщ.
#2
,
|
|
|
Ну сделать BorderStyle:=bsNone; - для окна... так тебе label или окно на рабочем столе надо?
Если label, то натянуть какоу-нить label на это окно, поставить Align:=alClient; вроде все... ![]() |
Сообщ.
#3
,
|
|
|
нужно задать какие-то правильные параметры в CreateWindow. Какаие именно - никак не пойму.
(И нужно выбрать правильный WindowClass.) Label собственно мне не нужна |
Сообщ.
#4
,
|
|
|
Цитата swe, 14.07.04, 07:59 нужно задать какие-то правильные параметры в CreateWindow. dwStyle = WS_POPUP размеры и положение = по своему усмотрению ![]() hWndParent = GetDesktopWindow ... |
Сообщ.
#5
,
|
|
|
2ZEE спасибо, всё работает. Только на ТаскБаре при запуске такого окошка появляется кнопка (которая позволяет сделать окно активным). Можно ли сделать так, чтобы этой кнопки не было?
|
Сообщ.
#6
,
|
|
|
тада надо сделать одно окошко на Десктопе и сделать его не видимым - т.е. без WS_VISIBLE, потом другое у кот. hWndParent = первому окошку, а стили = WS_POPUP or WS_VISIBLE - думаю так
Добавлено в : хотя щас подумал о др. варианте: можно попробывать вместо WS_POPUP поставить WS_CHILD но я такой способ не проверял... |
Сообщ.
#7
,
|
|
|
swe, можно
![]() ![]() SetWindowLong(Handle, GWL_EXSTYLE, (GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_APPWINDOW)) or WS_EX_TOOLWINDOW); |
Сообщ.
#8
,
|
|
|
Итак, резюме:
Чтобы получить самое простое (по виду похожее на Label) окно прямо на рабочем столе, чтобы при этом не появилась кнопка в TaskBar'е нужно: вместо CreateWindow использовать CreateWindowEx, где первый параметр - расширенный стиль окна должен быть WS_EX_TOOLWINDOW (чтобы не было кнопки на панели задач). Стиль окна должен быть (должен включать) WS_POPUP, чтобы окно было без заголовка и, кроме того, родительским окном должна быть переменная типа HWnd полученная с помощью функции GetDesktopWindow вот пример кода: ![]() ![]() var hMyWnd : HWnd; (* наше простое окно *) hWndDeskTop : HWnd; (* окно DeskTop - родительское для нашего *) WinClassNm : string; (* имя оконного класса *) //... begin hWndDeskTop := GetDesktopWindow; WinClassNm := 'STATIC'; (* это класс для Label либо надо зарегистрировать свой класс *) hMyWnd := CreateWindowEx( WS_EX_TOOLWINDOW, // - чтобы не было кнопки на панели задач WinClassNm, // - имя оконного класса '', // - имя окна (* стиль окна *) WS_POPUP or // $8000 0000 - без заголовка окна WS_BORDER, // $0080 0000 - тоненькая граница цвета Border 0, 0, // x0 , y0 300, 100, // width, height hWndDeskTop, // hParentWindow, 0, // hMenu hInstance, // глобальная переменная модуля SysInit Nil ); end; |
Сообщ.
#9
,
|
|
|
Как создать класс содержащий в себе процедуры открытия различных окон.
Ещё , охото иметь "продвинутое" окно , которо можно двигать , сворачивать и с кнопочками :). С уважением , |
Сообщ.
#10
,
|
|
|
oygan - задавай вопросы в отдельной теме
![]() |
![]() |
Сообщ.
#11
,
|
|
Вопрос, в общем-то, продолжает тему. Но лучше все-таки создать отдельную
![]() |
Сообщ.
#12
,
|
|
|
Цитата P.O.D @ 15.07.04, 10:13 swe, можно ![]() ![]() SetWindowLong(Handle, GWL_EXSTYLE, (GetWindowLong(Handle, GWL_EXSTYLE) and (not WS_EX_APPWINDOW)) or WS_EX_TOOLWINDOW); можно так, а еще в коде программы вставить примерно такую строчку Application.ShowForm:=false |
![]() |
Сообщ.
#13
,
|
|
тута нет Application - только чистый Window API
|
Сообщ.
#14
,
|
|
|
Как двигать окно с помощью мыши при нажатой левой кнопке:
![]() ![]() var PMSave : TPoint; (* в PMSave сохраняем абсолютные координаты мыши *) procedure Win_Move(h:HWnd); var dx,dy : integer; r : TRect; PM : TPoint; begin GetCursorPos(PM); (* получить абсолютную текущую позицию мыши *) dx := PM.X - PMSave.X; dy := PM.Y - PMSave.Y; (* изменения координат *) if (dx = 0) and (dy = 0) then Exit; (* если нет изменений - выйти *) PMSave := PM; (* запомнить текущую позицию мыши *) GetWindowRect(h,r); (* выяснить абсолютные координаты окна *) SetWindowPos(h, HWND_TOP, (* оставлять перемещаемое окно наверху *) r.Left+dx,r.Top+dy, (* новые координаты левого верхнего угла *) 0,0, (* ширину и высоту не задаём, т.к. *) SWP_NOSIZE); (* т.к. размер окна не меняем *) end; procedure Win_OnLButtonDown(h:HWnd; var Msg:TWMMouse); begin GetCursorPos(PMSave); (* получить и запомнить абсолютные координаты мыши *) SetCapture(h); (* "захватить" мышь окном h *) end; procedure Win_OnLButtonUp(h:HWnd; var Msg:TWMMouse); begin ReleaseCapture; (* освободить захват мыши окном *) Win_Move(h); (* последний сдвиг окна *) end; procedure Win_OnMouseMove(h:HWnd; var Msg:TWMMouse); begin if (Msg.Keys and MK_LBUTTON) = 1 (* если удерживается левая кнопка мыши *) then Win_Move(h); (* то сдвинуть окно *) end; function Win_WindowProc(h: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall; export; var aMsg : TMessage absolute AMessage; begin Win_WindowProc := 0; (* инструкция "absolute" позволяет обойтись без присваиваний : AMsg.Msg := AMessage; aMsg.WParam := WParam; aMsg.LParam := LParam; aMsg.Result := 0; *) case AMessage of wm_Destroy: begin PostQuitMessage(0); Exit; end; // wm_Paint : Win_OnPaint (h,TWMPaint(aMsg)); wm_MouseMove : Win_OnMouseMove (h,TWMMouse(aMsg)); wm_LButtonDown : Win_OnLButtonDown(h,TWMMouse(aMsg)); wm_LButtonUp : Win_OnLButtonUp (h,TWMMouse(aMsg)); // wm_KeyDown : Win_OnKeyDown end; (* case *) Win_WindowProc := DefWindowProc(h, AMessage, WParam, LParam); (* DefaultProc *) end; Добавлено в : 2taifun вместо SetWindowLong я использую CreateWindowEx - см. сообщение #8 2oygan по поводу сворачивания окна - можно сделать соответствующую обработку на wm_KeyDown. По поводу кнопочек, я бы сделал так: - выделил несколько (список) Rect в своём окне, заполнил их нужными картинками, затем при обработке щелчка мыши сравнивал её координаты со списком координат Rect, выдавал номер найденного Rect или -1. Далее, если номер >= 0 вызывал бы по Case нужную функцию. |