суббота, 20 марта 2010 г.

OSD. Прицел в CS (OpenGL режим)

OSD - есть On Screen Display. В режиме OpenGL в контре все ок... DirectX-же игры в полноэкранном режиме создают отдельный surface, можете опробовать еще такой вывод на оверлее. Код прицела c отрисовкой регионами (активация/стоп следования за курсором мыши по глобальной F2)...



procedure TMainForm.ghotkey(var msg:TMessage);
begin
 if  (msg.LParamHi = vk_f2) then begin
   p:= not p;
   if not p then newp:= Mouse.CursorPos;
   if p then pp:= true
 end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or  not WS_EX_APPWINDOW);

  BorderStyle := bsNone;
  FormStyle := fsStayOnTop;
  WindowState := wsMaximized;

  fActive := true;
  mnuActive.Checked := true;
  ShapingTimer.Enabled := true;

  id:=GlobalAddAtom('hotkey1');
  RegisterHotKey(handle, id, 0, vk_f2);
end;

procedure TMainForm.mnuActiveClick(Sender: TObject);
begin
  Active := mnuActive.Checked
end;

procedure TMainForm.mnuExitClick(Sender: TObject);
begin
  Close
end;

procedure TMainForm.mnuSettingsClick(Sender: TObject);
var
  wasActive : Boolean;
begin
  wasActive := Active;
  Active := false;
  try  TSettingsForm.Execute;
  finally  Active := wasActive;  end; end;

procedure TMainForm.SetActive(const Value: boolean);
begin
  fActive := Value;  ShapingTimer.Enabled := Value;  Visible := Value;
end;

procedure TMainForm.ShapingTimerTimer(Sender: TObject);
const  HALF_LINE_DIM = 1;
var  mp : TPoint;
  shape, shpLT, shpRT, shpLB, shpRB, shapeMouse: HRGN;
begin
  if p then mp := Mouse.CursorPos else begin
   if not pp then begin
     mp.X:= screen.Width div 2;
     mp.y:= screen.Height div 2
   end else  mp:= newp
  end;

  shape := CreateRectRgn(0,0,0,0);  shpLT := CreateRectRgn(0, 0, mp.X , Height);
  shpRT := CreateRectRgn(mp.X + HALF_LINE_DIM , 0, Width, Height);
  shpLB := CreateRectRgn(0, 0, Width, mp.Y );
  shpRB := CreateRectRgn(0, mp.Y + HALF_LINE_DIM, Width, Height);
  shapeMouse := CreateRectRgn(mp.X-1, mp.Y-1, mp.X+2, mp.Y+2);

  CombineRgn(shape,shape,shpLT,RGN_XOR);
  CombineRgn(shape,shape,shpRT,RGN_XOR);
  CombineRgn(shape,shape,shpLB,RGN_XOR);
  CombineRgn(shape,shape,shpRB,RGN_XOR);
  CombineRgn(shape,shape,shapeMouse,RGN_DIFF);

  DeleteObject(shpLT);
  DeleteObject(shpRT);
  DeleteObject(shpLB);
  DeleteObject(shpRB);
  DeleteObject(shapeMouse);

  if shape <>  0 then  begin
    try
      SetWindowRgn(Handle, shape, true);
      Show;
    except  Hide;  end;
  end else  Hide
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 UnRegisterHotKey(handle,id)
end;
забрать добро себе

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.