Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

сменить курсор у static a.   Найти похожие ветки 

 
sw   (2004-10-13 16:08) [0]

Вопрос по поводу WinApi.
Вообщем цель: сменить курсор у static"a.
Вроде создал static, потом отслеживаю wm_setcursor,
и передаю предедыдущей процедуре, для обработке остальных сообщений.
Не работает и все тут, работает если закоментировать, callwindowproc,
хотя по сути вещей это ведь не правильно ?

program MAIN23;
{$R n.res}

uses windows, messages;
var
   wc : TWndClassEx;
wndMain, lb : THandle;
   Mesg : TMsg;
   stWNDproc: Pointer;

function MyLblWndProc(wnd: hWnd; msg, wParam, lParam: longint): longint; stdcall;
begin
result:=0;
case msg of
 WM_SETCURSOR:
     begin
       SetCursor(LoadCursor(0,IDC_HAND)); //для надежности и так сделал и так
       SetCursor(LoadCursor(hInstance,"HAND")); //
       result:=1;
     end;
    end;
   Result := CallWindowProc(stWndProc, wnd, msg, wparam, lparam);
end;

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
Begin
case msg of
   wm_destroy : begin
       postquitmessage(0); exit;
       Result:=0;
   end;
 else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;

begin

wc.cbSize:=sizeof(wc);
wc.style:=0;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=DLGWINDOWEXTRA;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="window";

RegisterClassEx(wc);
                   

wndMain:= CreateWindow("window", "",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0, 0,hInstance,nil);

lb:=CreateWindow("static", "http://www.vasya.ru", WS_VISIBLE+WS_CHILD, 100, 100, 200, 80, Wndmain, 0, hInstance, nil);

stWNDproc:=Pointer(SetWindowLong(lb, GWL_WNDPROC, Integer(@MyLblWndProc)));
// PGroup1Proc := Pointer(SetWindowLong(hGroup1, GWL_WNDPROC, Integer(@Group1Proc)));
// PSystemProc := Pointer(SetWindowLong(hControl, GWL_WNDPROC, Integer(@ControlProc)));
{ stWNDproc:=Pointer(GetWindowLong(lb, GWL_WNDPROC));
SetWindowLong(lb, GWL_WNDPROC, Integer(Addr(MyLblWndProc)));  }

ShowWindow(wndMain,CmdShow);
While GetMessage(Mesg,0,0,0) do begin
   TranslateMessage(Mesg);
   DispatchMessage(Mesg);
end;
end.

Компилирую на D7.


 
Nick Denry ©   (2004-10-13 16:40) [1]

попробуй так:

Result := SetCursor(LoadCursor(0,IDC_HAND));


должно помочь, если нет, есть другие варианты.

Да, еще лучше сделать так:
...
WM_CREATE:
         begin
           Hand_Cursor := LOadCursor(0, IDC_HAND);
         end;

WM_SETCURSOR:

Result := SetCursor(Hand_Cursor);


 
BiN ©   (2004-10-13 16:46) [2]

function MyLblWndProc(wnd: hWnd; msg, wParam, lParam: longint): longint; stdcall;
begin
result:=0;
case msg of
WM_SETCURSOR:
    begin
      SetCursor(LoadCursor(0,IDC_HAND)); //для надежности и так сделал и так
      SetCursor(LoadCursor(hInstance,"HAND")); //
      result:=1;
    end;
   end;
  Result := CallWindowProc(stWndProc, wnd, msg, wparam, lparam);
end;


после result:=1; поставь Exit;


 
sw   (2004-10-13 19:56) [3]

все дело в том что и метод выше и
Result := SetCursor(LoadCursor(0,IDC_HAND));
работает но только если
Result := CallWindowProc(stWndProc, wnd, msg, wparam, lparam);  
закоментирована, курсор отображается как надо(рука), но метка само собой не отрисовывается.
Такое ощущение что вызов стандартной процедуры просто игнорируется


 
Nick Denry ©   (2004-10-14 00:26) [4]

Я тебе для гиперссылок предлагаю сделать не сабклассинг, а суперклассинг. Выглядит это слудующим образом:


...
var
 SCDLabelClassEx:WNDCLASSEX; //Переменная для суперклассирования надписи с майлом
UFont               : HFONT;          //Шрифт для контролов
HandCursor          : HCURSOR;        //курсор - рука для кнопок и гиперлабелов
...
Процедура обработки сообщейний главного окна (окна, которое содежит гипертекстовую ссылку):
.........
WM_CREATE:
         begin
         .....
         UFont:=createfont(-11,0,0,0,fw_normal,0,1,0,
 DEFAULT_CHARSET,Out_Default_Precis,Out_Default_Precis,
 DEFAULT_QUALITY,DEFAULT_PITCH,"MS Sans Serif");        //Создание шрифта с подчеркиванием

 HandCursor := LoadCursor(0,IDC_HAND); // Курсор - "рука" для майллабела и кнопок
          end;
WM_COMMAND:
          begin
          .....
          if (HIWORD(wParam)=STN_CLICKED) and (lParam=Label6) then
          begin
           ShellExecute(
           SCDWnd,
           "open",
           "http://www.nickdenry.narod.ru",
           nil,
           nil,
           0);
          end;
          .....
          end;
...
WM_CTLCOLORSTATIC : {Обработка лабелов}
     Begin
       SetBkMode(Wparam,TRANSPARENT);
       Result:=GetStockObject(Null_Brush);
         if (wparam<>0) and (lparam=label6) then
           begin
             SetTextColor(wparam,rgb(0,0,255));
           end;

      End;
........
begin {start of the program (можешь расметить в любом месте, хоть в том же WM_CREATE}
.......
 {Создание гипертекстовой ссылки с майлом (суерклассирование)}
 SCDLabelClassEx.cbSize:=SizeOF(SCDLabelClassEx);
 GetClassInfoEx(hInstance,"static",SCDLabelClassEx);
 SCDLabelClassEx.hInstance:=hInstance;
 SCDLabelClassEx.hCursor:=HandCursor;
 SCDLabelClassEx.lpszClassName:="scdlabel";
 RegisterClassEx(SCDLabelClassEx);

 label6 :=  CreateWindow("scdlabel",PChar(scd_caption_site_rus),
            WS_CHILD or WS_VISIBLE or SS_NOTIFY,110,189,55,15,
            SCDWnd, 0, hInstance, nil);
 UnRegisterClass("scdlabel",hInstance);

  SendMessage(Label6,wm_setfont,UFont,0);
......
end;


таким образом, на основе класса SCDLabelClassEx ты сможешь создавать любое количество гиперрсылок....

Если не понятно, могу еще более детально изложить...

Да и замени

wndMain, lb : THandle;

на wndMain, lb : HWND;

Так оно правильней.


 
sw   (2004-10-16 13:15) [5]

спаситель :)
все работает.
Вопрос только как лучше поместить обработку в WM_COMMAND
у меня там еще меню есть

   WM_COMMAND: { Выбран пункт меню }
     begin
     { Если выбран нулевой пункт -     закрыть программу: }
      if (HIWORD(wParam)=STN_CLICKED) then
        begin
         if (lparam=lbl2) then
           ShellExecute(mywnd, "open", "http://www.vasya.ru", nil, nil, 0);
         end;
//       else
     case lo(wparam) of
     0: begin
         SendMessage(mywnd, WM_CLOSE, 0, 0);
         result := 0;
        end;
как быть ?


 
Nick Denry ©   (2004-10-17 01:40) [6]

2sw   (16.10.04 13:15) [5]

На здоровье :)
Честно говоря, я не совсем понял, что ты спросил второй раз, если не то, уточни :)

Как два варианта обработки WM_COMMAND, могу предложить следующий пример:

   WM_COMMAND:
     Begin
       if (HIWORD(wParam)=BN_clicked) and (lParam=Button1) then //первая кнопка
          begin
          ConfirmExit;
          end;
        if (HIWORD(wParam)=BN_CLICKED) and (lParam=Button2) then
          begin
          HideSCD;
          end;
        if (HIWORD(wParam)=BN_CLICKED) and (lParam=Button3) then
          begin
          SaveOptions;
          end;
        if (HIWORD(wParam)=BN_CLICKED) and (lParam=Button4) then
          begin
          HelpSCD;
          end;
        if (HIWORD(wParam)=STN_CLICKED) and (lParam=Label6) then
          begin
          GoToHHCSite;
          end;

        case wParam of
          ID_EXIT:
            begin
              ConfirmExit;
            end;
          ID_HELP:
            begin
              HelpSCD;
            end;
          ID_HIDE:
            begin
              HideSCD;
            end;
          ID_OPTIONS:
            begin
              ShowSCD;
            end;
          ID_OPENCD:
            begin
              OpenCD;
            end;
          ID_CLOSECD:
            begin
              CloseCD;
            end;
          ID_RUSSIAN:
            begin
            SCDStartInfo.Language:=true;
            ChangeLanguage;
            SaveOptions;
            end;
          ID_ENGLISH:
            begin
            SCDStartInfo.Language:=false;
            ChangeLanguage;
            SaveOptions;
            end;
        end;

     result:=0;
     End;


Т.е. тут case и if ...



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
14-1100357512
AlexG
2004-11-13 17:51
2004.11.28
Что лучше купить: GeForce или Radion?


6-1095362612
dukenn
2004-09-16 23:23
2004.11.28
Как обратиться к данному url у?


1-1100534916
ceval
2004-11-15 19:08
2004.11.28
Подскажите как в диалоге задать путь к


14-1100184521
NewDelpher
2004-11-11 17:48
2004.11.28
windows 2000


14-1100011016
cjkorg
2004-11-09 17:36
2004.11.28
Программа, удаляющая из матрицы [A] строку и столбец, содержащие