Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Как изменить системный курсор? [Delphi, Windows]


Grademax   (14.07.11 13:25

Стоит задача поменять системный курсор (на свой) не только в пределах своей формы, но и над рабочим столом.

Для Delphi VCL нашел вот такой код:


const crMyCursor = 5;
procedure TForm1.FormCreate(Sender: TObject);
begin
 Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'NewCursor');
 Cursor := crMyCursor;
end;


Вопрос в том, как адаптировать это для KOL.


Омлет ©   (14.07.11 13:38[1]

> Cursor := crMyCursor;

Это не изменит курсора вне формы.


Jon ©   (14.07.11 15:14[2]


 SetSystemCursor(LoadCursor(HInstance, 'NewCursor'), OCR_NORMAL);


~AQUARIUS~   (14.07.11 15:26[3]

Jon
1) The system destroys hcur by calling the DestroyCursor function. Therefore, hcur cannot be a cursor loaded using the LoadCursor function (из msdn)
Другими словами, использовать LoadCursor для загруки курсора нельзя
2) Вы что, собираетесь из приложения менять курсор гобально в системе? Без явного разрешения пользователя? ИМХО для такой программы место одно - корзина


GradeMax   (14.07.11 17:32[4]


> Вы что, собираетесь из приложения менять курсор гобально
> в системе? Без явного разрешения пользователя? ИМХО для
> такой программы место одно - корзина


Всё проще гораздо... Делаю программу, которая будет управлять "чужими" окнами. Например, пишите вы пояснительную записку ну скажем в Worde, в вашей записке много расчетов и считаете вы по ходу написания этой самой записки... и неплохо было бы, чтобы окно обычного калькулятора (речь о калькуляторе Microsoft) было поверх всех... (это так для примера, а  вариантов много вообще).

Реализация следующая... Пользователь нажимает кнопку в окне моего приложения, на кнопке написано ну примерно так "нажмите левую клавишу мыши и удерживая её наведите на загоровок окна требуемого приложения". После нажатия на кнопку меняется курсор мыши. Пользователь двигает мышь на заголовок ну того же калькулятора... Отпускает левую кнопку мыши (курсор мыши возвращается в исходное состояние) и в окне моей программы появляются диалог... типа сделать это приложение поверх всех, изменить размер окна ну и т.д.

В общем весь замес в этом... Можно сделать конечно проще, но хочется именно так (мы лёгких путей не ищем :)


Дмитрий К ©   (14.07.11 19:26[5]

http://msdn.microsoft.com/en-us/library/ms646262%28v=VS.85%29.aspx


Grademax   (15.07.11 10:00[6]

Всё... разобрался...
Вот готовый вариант программы (если кому интересно :)

uses windows, messages, KOL;
var W:PControl;
{----------------------------------------------------------------------------}
// Эта функция возвратит Handle компонента, который находится под курсором мыши.
Function GetWinHandle:HWND;
var PT:TPoint; // Структура для хранения глобальных координат мышки
begin
    GetCursorPos(PT);
    Result := WindowFromPoint(PT);
end;
{----------------------------------------------------------------------------}
Procedure WMouseDown(Dummy:Pointer; Sender:PControl; var Mouse:TMouseEventData);
begin
    W.Cursor:=LoadCursor(0, IDC_HAND);
    SetCapture(W.Handle); // Захватываем мышь (пока нажата кнопка на ней)
end;
{----------------------------------------------------------------------------}
Procedure WMouseUp(Dummy:Pointer; Sender:PControl; var Mouse:TMouseEventData);
var HW:THandle;
begin
    ReleaseCapture; // Отменяем захват мыши
    W.Cursor:=LoadCursor(0, IDC_ARROW);
    HW := GetWinHandle;

    if Mouse.Button = mbLeft then
     begin
       if HW<>0 then begin
           ShowWindow(HW, sw_hide);
           ShowWindow(HW, SW_SHOW {SW_SHOWDEFAULT});
           SetWindowPos(HW, HWND_TOPMOST, 1, 1, 20, 20, SWP_NOMOVE + swp_nosize);
           end;
     end;
    // Если была нажата правая кнопка мыши, то включаем "Нормальный режим"
    if Mouse.Button = mbRight then
       SetWindowPos(HW, HWND_NOTOPMOST, 1, 1, 20, 20, SWP_NOMOVE + swp_nosize);
end;
{----------------------------------------------------------------------------}
Procedure StartForm;
begin
    W := NewForm( Applet, 'TopSet v1.0' ).SetClientSize( 100, 50 ).SetPosition(1,1);
    W.Margin := 0;
    W.ExStyle := WS_EX_TOOLWINDOW;
    W.StayOnTop:=True;
    W.CanResize := False;

    W.OnMouseDown:=TOnMouse(MakeMethod(nil, @WMouseDown));
    W.OnMouseUp:=TOnMouse(MakeMethod(nil, @WMouseUp));

    Run( W );
end;
{----------------------------------------------------------------------------}
begin
    StartForm;
end.


Работать с ней так:
Щелчек левой клавишей по окну "TopSet", далее (не отпуская левую клавишу) перемещаем мышь на заголовок окна (или на рамку окна) ну пусть того же Калькулятора и отпускаем левую клавишу... Окно калькулятора станет поверх всех.

Те же манипулящии с првой клавишей мыши - вернут "чужому" приложению обычный режим (не поверх всех).


RusSun ©   (17.07.11 03:05[7]

Есть предложение, а можно делать несколько чужих окон поверх? Как бы объединяя их в группу например калькулятор и др приложение чтобы видеть что в расчётах и если не надо группу можно свернуть? ;)

Как в скайпе сделаны "о'кошки" :) утренний позитив.
(да не рассердится модератор на меня.)


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо