imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 22.09.2004, 16:26     # 1
Ti
-virus-
 
Регистрация: 18.10.2002
Сообщения: 211

Ti Путь к славе только начался
Как сменить курсор у отдельно взятого static в Delphi (WinApi)?

Как сменить курсор у отдельно взятого static ?
Сделал так:
{ Регистрация класса: }
lc.style := cs_hredraw or cs_vredraw;
lc.lpfnWndProc := @MyLblWndProc;
lc.cbClsExtra := 0;
lc.cbWndExtra := 0;
lc.hInstance := hInstance;
lc.hIcon := ExtractIcon(hInstance,PChar(Paramstr(0)),0);
lc.hCursor := LoadCursor(0,IDC_HAND);
lc.hbrBackground := COLOR_BTNFACE;
lc.lpszMenuName := nil;
lc.lpszClassName := 'static_web';
if RegisterClass(lc) = 0 then halt(0);

lbl1:=CreateWindowEx(0,'static_web','www.site.com',bs_pushbutton or ws_child or ws_visible or ws_tabstop, 46, 5, 66, 13, myWnd,0,hInstance,nil);

lbl2:=CreateWindowEx (0,'static','http://www.site.ru',bs_pushbutton or ws_child or ws_visible or ws_tabstop, 46, 23, 90, 15, myWnd,0,hInstance,nil);

///пробовал и так
// Сохранение старой и установка новой оконной процедуры:
stWNDproc:= Pointer(GetWindowLong(lbl2, GWL_WNDPROC));
SetWindowLong(lbl1, GWL_WNDPROC, longint(@MyLblWndProc));
//и так
if not GetClassInfo(hInstance,'static',st_lc) then Halt(0);
stWNDproc:=st_lc.lpfnWndProc;

function MyLblWndProc(wnd: hWnd; msg, wParam,
lParam: longint): longint; stdcall;
begin
case msg of
wm_LButtonDown:
begin
messagebox (mywnd,'запускаем сайт','error',mb_ok);
end;
else Result := CallWindowProc(stWNDproc, wnd, msg, wparam, lparam);
end;
end;

в обоих случаях, при запуске "недопустимая операция".
Ti вне форума  
Старый 26.09.2004, 23:52     # 2
Scary Zet
Junior Member
 
Аватар для Scary Zet
 
Регистрация: 08.07.2004
Адрес: Воронеж
Сообщения: 115

Scary Zet Нимб уже пробиваетсяScary Zet Нимб уже пробивается
Попробуй SetCursor() в связке с ShowCursor() в ответ на WM_MOUSEMOVE в новой оконной процедуре. Больше ничего в голову не приходит...
__________________

Каждая мечта тебе дается вместе с силами, необходимыми для ее осуществления. Однако тебе, возможно, придется ради этого потрудиться.

Ричард Бах
Scary Zet вне форума  
Старый 27.09.2004, 16:08     # 3
Ti
-virus-
 
Регистрация: 18.10.2002
Сообщения: 211

Ti Путь к славе только начался
таким способом курсор моргать будет, но за совет спасибо.
я так пробовал
SetClassLong(lbl3, GCL_HCURSOR, LoadCursor(hInstance, IDC_HAND));
реакции ноль

Последний раз редактировалось Ti; 27.09.2004 в 16:10.
Ti вне форума  
Старый 27.09.2004, 20:47     # 4
Scary Zet
Junior Member
 
Аватар для Scary Zet
 
Регистрация: 08.07.2004
Адрес: Воронеж
Сообщения: 115

Scary Zet Нимб уже пробиваетсяScary Zet Нимб уже пробивается
Чтобы курсор не мигал, придётся в поле hCursor класса указать NULL. Или, если класс Windows'овский, то установить его в NULL как ты делаешь - через SetClassLong(). Но эффект SetClassLong() распространится на все окна данного класса. И если у разных static нужны разные курсоры, то идентификатор курсора можно запихнуть через SetWindowLong() в USERDATA окна, а в новой оконной процедуре сделать так, чтобы она по WM_MOUSEMOVE брала ид курсора из USERDATA (при помощи GetWindowLong()) и ставила его активным вышеуказанной связкой вызовов функций.
__________________

Каждая мечта тебе дается вместе с силами, необходимыми для ее осуществления. Однако тебе, возможно, придется ради этого потрудиться.

Ричард Бах
Scary Zet вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 10:12.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.