ramka na ekranie ze zmiennym rozmiarem

0

Wiecie jak w programach do screenów, albo do nagrywania filmów często można ustawić rozmiar przechwytywanego obrazu - pojawia się wtedy np. ramka na ekranie, a wy sobie ją skalujecie, ciągniecie za róg i jak już ustawicie ją w odpowiednim miejscu to zatwierdzacie.
Chciałbym się dowiedzieć, czy to jest trudna rzecz do zrobienia, no i też chętnie wysłuchałbym jakichś pomysłów na to.

Najprościej to chyba byłoby zrobić coś w stylu rysowania prostokąta lub zaznaczenia jak w paintcie, drugi pomysł jaki mi przychodzi to utworzyć okno, zwykłą formę, dać jej przeźroczystość wysoką, stay on top i ktoś mógłby dowolnie to umieścić na ekranie i tyle (a reszta to pobranie położenia formy, wymiarów i gotowe).
Nie wiem, czy te pierwsze, szybkie pomysły są w porządku, czy może jest jakiś lepszy, ale także prosty sposób dlatego zwracam się do was z prośbą o opinie, porady, sugestie na forum.

//edit
@xeo95
o dzięki za kod, fajny jest, nie znałem nawet tych 2 funkcji (nawet nie szukałem, bo kiedyś wystarczył mi inny sposób na screeny, banalniejszy, pewnie w faq w całym necie jest), thx :)
później pobawię się w stworzenie formy, zobaczę co z tego wyjdzie, bo to wydaje się najłatwiejsze, ale chętnie posłucham też innych pomysłów, choćby dla zaspokojenia ciekawości i gdyby inne sposoby były łatwe to chętnie bym je zrealizował w celach edukacyjnych

1

Może pokombinuj z formą - wymiary i położenie, potem przytnij bitmapę do takich rozmiarów. To może Ci się przyda:

  DeskHWnd : Hwnd;
  dc: HDC;
  ScreenWidth, ScreenHeight: Integer;
  TheBmp : TBitmap;

  DeskHWnd := GetDeskTopWindow;
  dc := GetDC(DeskHWnd);

  ScreenWidth := GetDeviceCaps(dc, HORZRES);
  ScreenHeight := GetDeviceCaps(dc, VERTRES);

  TheBmp := TBitmap.Create;
  TheBmp.Width := ScreenWidth;
  TheBmp.Height := ScreenHeight;

  BitBlt(TheBmp.Canvas.Handle, 0, 0, ScreenWidth, ScreenHeight, dc, 0, 0, SRCCOPY);

Co prawda kod w Delphi, ale przepisz na C i w BitBlt parametry zmień na te z formy do cięcia.

0

Mam problem z oknem formy. Ustawiłem ją: BorderStyle:= bsNone, a żeby dało radę ją skalować to dodałem:

procedure TForm2.CreateParams(var P: TCreateParams);
begin
  inherited;
  P.Style:= P.Style or WS_SIZEBOX;
end;

Ale ta opcja skalowania psuje mi efekt, bo dodaje formie ramkę:
user image

Da radę pozbyć się tej ramki, a jednocześnie skalować formę? Czy może będę musiał się bawić w napisanie kodu tak, że gdy kursor jest w rogu to zmienia się ikonka kursora i trzymając lewym można skalować? hyh
Doradzicie coś? :(

//w google znalazłem taką linijkę:

Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE;

z tym, że wizualnie nie widzę żadnej zmiany

0

@odświeżam

na msdn: WS_SIZEBOX Creates a window that has a sizing border. Same as the WS_THICKFRAME style.

a na jakimś zagranicznym forum ktoś też na to narzekał i na jednym zero odpowiedzi miał, a na innym był podobny topic, ktoś coś pisał o "ModifyStyle(0, WS_SIZEBOX)" i "SWP_DRAWFRAME", ale nie wiem o co chodzi... (btw. chyba od czasów visty ten sizebox ma tę durną ramkę).
Ktoś zna się na tym?

(na razie inny sposobów olewających "TCreateParams" nie sprawdzałem, nie pisałem nic, po prostu najpierw wolałbym się dowiedzieć, czy z tą ramką na win7 itd. można coś zrobić używając ten SIZEBOX)

1 użytkowników online, w tym zalogowanych: 0, gości: 1