Zdarzenie OnMouseWheel na TPanel

Zdarzenie OnMouseWheel na TPanel
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Na TPanel mam ułożone kilka TLabel. Niestety niektóre się nie mieszczą, dlatego musiałem stworzyć ScrollBar. Zrobiłem swój własny na podstawie kilka komponentów TPanel. Przesuwam wszystko po naciśnięciu przycisków.
Teraz chciałbym dodać możliwość przesuwania za pomocą kółka myszki, dwóch palców na TouchPadzie i lewym przyciskiem myszy przeciągnięcia paska. Czy jest to możliwe?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
2

Nie musisz tworzyć własnego, skoro do dyspozycji jest komponent klasy TScrollBox, który obsługuje takie rzeczy.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Z tego sobie zdaję sprawę. Mimo wszystko chciałbym spróbować zrobić to po swojemu, o ile jest to wgl realne?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
1

Wszystko jest realne; W takim razie potrzebujesz zaimplementować obsługę komunikatu LM_MOUSEWHEEL; Na podstawie dostarczonych w parametrze danych komunikatu należy określić w którą stronę obrócono rolkę myszy;

Poniżej przykład dla klasy własnego komponentu, dziedziczącego z klasy TPanel:

Kopiuj
uses
  LMessages;

type
  TScrollPanel = class(TPanel)
  {..}
  protected
    procedure WMMouseWheel(var AMessage: TLMMouseEvent); message LM_MOUSEWHEEL;
  end;
  
  procedure TScrollPanel.WMMouseWheel(var AMessage: TLMMouseEvent);
  begin
    AMessage.Result := 1;
  end;

Powyższe to szkielet zdarzenia obsługi komunikatu; Przypisanie wartości 1 do pola AMessage.Result parametru oznacza obsłużenie komunikatu, więc o tym nie zapomnij; Gdzie są dane określające kierunek obrotu rolki? W polu AMessage.WheelDelta - wartość mniejsza od zera oznacza obrót rolki w dół (do siebie), a większa od zera - w górę (od siebie);

Poniżej przykład rozpoznania kierunku obrotu i wywołanie własnych zdarzeń:

Kopiuj
uses
  LMessages;

type
  TScrollPanel = class(TPanel)
  {..}
  private
    FOnWheelDown: TNotifyEvent;
    FOnWheelUp: TNotifyEvent;
  private
    procedure DoWheelDown();
    procedure DoWheelUp();
  protected
    procedure WMMouseWheel(var AMessage: TLMMouseEvent); message LM_MOUSEWHEEL;
  published
    property OnWheelDown: TNotifyEvent read FOnWheelDown write FOnWheelDown;
    property OnWheelUp: TNotifyEvent read FOnWheelUp write FOnWheelUp;
  end;
  
  procedure TScrollPanel.DoWheelDown();
  begin
    if Assigned(FOnWheelDown) then
      FOnWheelDown(Self);
  end;
  
  procedure TScrollPanel.DoWheelUp();
  begin
    if Assigned(FOnWheelUp) then
      FOnWheelUp(Self);
  end;
  
  procedure TScrollPanel.WMMouseWheel(var AMessage: TLMMouseEvent);
  begin
    if AMessage.WheelDelta < 0 then
      DoWheelDown()
    else
      DoWheelUp();
  
    AMessage.Result := 1;
  end;

Jeżeli wszystkie komponenty klasy TPanel mają posiadać obsługę wyżej wymienionych zdarzeń to zawsze możesz zadeklarować klasę typu helper dla klasy TPanel i wstrzyknąć do niej nowe funkcje:

Kopiuj
type
  TPanelHelper = class helper for TPanel
    { tu nowe funkcje w odpowiednich sekcjach }
  end;

Wszystko co napisałem powyżej jest napisane z palca, więc gdzieś coś mogłem pokiełbasić;

Edit: Klasa TPanel ma już zdarzenie OnMouseWheel, które dostarcza nieco więcej informacji, więc z niego powinieneś skorzystać; Parametr Shift zawiera dane o klawiszach specjalnych, WheelDelta zawiera zakodowany kierunek obrotu rolki, MousePos to relatywne współrzędne kursora; Do argumentu Handled wpisz wartość True, jeśli w zdarzeniu obsługujesz rolkę;

Kod który podałem wyżej traktuj jako ciekawostkę - pozostawiam go tutaj, bo może się komuś przydać, jak będzie od podstaw pisał swój komponent i będzie potrzebował obsłużyć rolkę myszy.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 8x, ostatnio: flowCRANE
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

To i do tego powrócę. Jak dodać obsługę touchpada? O ile wertykalnie działa tak jak kółko myszy, to mam problem z horyzontalnym przesuwaniem. Chodzi mi o to, aby po przeciągnięciu dwóch palców w bok, przesuwała się też zawartość Panelu.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

Obsługa gładzika interpretowana jest przez system jako gesty myszy, więc takie akcje jak przesuwanie kursora, klikanie czy scrollowanie, obsługiwane są za pomocą standardowych komunikatów; Nie wiem natomiast jak wygląda sprawa z bardziej nietypowymi akcjami (jak przewijanie horyzontalne), dlatego też najpierw wypadałoby się dowiedzieć tego, jakie komunikaty płyną do kontrolki podczas tych akcji; A jak już komunikaty będą znane to można zaczerpnąć wiedzy o nich z dokumentacji na MSDN; Implementacja obsługi komunikatu jest uniwersalna;

Niestety nie mam jak u siebie tego sprawdzić, bo mój laptop posiada zwykły, ubogi touchpad.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Znalazłem tylko coś takiego: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645614(v=vs.85).aspx

ale tak na prawdę nie wiem jak tego użyć. LM_MOUSEHWHEEL nie istnieje.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
2

Poziome kółko jest obsługiwane w komunikacie WM_MOUSEHWHEEL.

furious programming napisał(a):
Kopiuj

procedure TScrollPanel.WMMouseWheel(var AMessage: TLMMouseEvent);
begin
if AMessage.WheelDelta < 0 then
DoWheelDown()
else
DoWheelUp();

AMessage.Result := 1;
end;

Kopiuj

Ten kod jest zły. Reaguje na każdą zmianę pozycji kółka, a powinno reagować dopiero na zmianę delty o WHEEL_DELTA. Trzeba sumować kolejne wartości i gdy suma przekroczy WHEEL_DELTA potraktować to jako przeskok „o jeden” i odjąć tę stałą od sumy.

Wiele myszek wysyła deltę równą WHEEL_DELTA, ale niektóre o wyższej rozdzielczości wysyłają komunikaty częściej z mniejszą deltą.

The wheel rotation is a multiple of WHEEL_DELTA, which is set to 120. This is the threshold for action to be taken, and one such action (for example, scrolling one increment) should occur for each delta.

The delta was set to 120 to allow Microsoft or other vendors to build finer-resolution wheels (for example, a freely-rotating wheel with no notches) to send more messages per rotation, but with a smaller value in each message. To use this feature, you can either add the incoming delta values until WHEEL_DELTA is reached (so for a delta-rotation you get the same response), or scroll partial lines in response to more frequent messages. You can also choose your scroll granularity and accumulate deltas until it is reached.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms645614%28v=vs.85%29.aspx

edytowany 5x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
1

Ten kod (a raczej sposób interpretacji komunikatu) znalazłem na oficjalnym forum Lazarusa, więc takiego też używam; Działa prawidłowo na kilku testowanych myszach, więc nie zagłębiałem się w temat; W sumie to wywołanie zdarzenia dla każdego skoku pasuje w moim przypadku, więc jeśli o mnie chodzi to nie widzę problemu;

Edit: W źródłach modułu LMessages jest komentarz obok deklaracji pola WheelDelta:

Kopiuj
WheelDelta: SmallInt; // -1 for up, 1 for down

Też daje trochę do myślenia;

dani17 napisał(a)

ale tak na prawdę nie wiem jak tego użyć. LM_MOUSEHWHEEL nie istnieje.

No to sobie taką stałą zadeklaruj - to tylko nazwa; Wartość liczbową komunikatu znajdziesz na MSDN, tak samo jak informacje, które ten komunikat dostarcza (w lParam i wParam); Trzeba by też pomyśleć nad strukturą dostarczaną w argumencie metody handlera; Później sprawdzę, czy typ TLMMouseEvent się nada do tego.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 9x, ostatnio: flowCRANE
Azarien
tu nie ma co się „nie zagłębiać”. cytat z MSDNa wystarczy.
Azarien
LCL nie ma licencji na nieomylność. kod jest oczywiście błędny.
flowCRANE
LCL prędzej ma licencję na omylność;
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Właśnie tak robiłem, ale próbowałem to deklarować w jakimś dziwnym miejscu, a jako, że nie byłem pewien czy jest to właściwe rozwiązanie to nie kombinowałem aż tak. Teraz po potwierdzeniu, wszystko już działa ;)

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

Było by dobrze, gdybyś pochwalił się tym działającym kodem - przyda się potomnym.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Przy czym jednak przerzuciłem się na ScrollBoxa, zamiast tworzyć swój własny, na ten moment mi wystarczy.

Kopiuj
 
const
  LM_MOUSEHWHEEL = $020E; 

TTabela = class(TCustomControl)
  private
    { Private declarations }
  protected
    procedure WMMouseMove(var AMessage: TLMMouseMove); message LM_MOUSEMOVE;
    procedure CMMouseLeave(var AMessage: TLMessage); message CM_MOUSELEAVE;
    procedure CMMouseEnter(var AMessage: TLMessage); message CM_MOUSEENTER;
    procedure WMMouseWheel(var AMessage: TLMMouseEvent); message LM_MOUSEWHEEL;
    procedure WMMouseHWheel(var AMessage: TLMMouseEvent); message LM_MOUSEHWHEEL;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent; AWidth, AHeight, AKolumny, AWiersze: Integer);
    destructor Destroy; override;
    procedure Paint; override; 
end;

implementation  

procedure TTabela.WMMouseWheel(var AMessage: TLMMouseEvent);
begin
  if AMessage.WheelDelta < 0 then
    TScrollBox(Parent).VertScrollBar.Position := TScrollBox(Parent).VertScrollBar.Position + 10
  else
    TScrollBox(Parent).VertScrollBar.Position := TScrollBox(Parent).VertScrollBar.Position - 10;
end;

procedure TTabela.WMMouseHWheel(var AMessage: TLMMouseEvent);
begin
  if AMessage.WheelDelta < 0 then
    TScrollBox(Parent).HorzScrollBar.Position := TScrollBox(Parent).HorzScrollBar.Position + 10
  else
    TScrollBox(Parent).HorzScrollBar.Position := TScrollBox(Parent).HorzScrollBar.Position - 10;
end;
edytowany 1x, ostatnio: dani17
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

Miałem na myśli raczej sam kod obsługi komunikatu, nie całego komponentu :]

Spróbuj czegoś takiego, w ramach testów:

Kopiuj
procedure TTabela.WMMouseHWheel(var AMessage: TLMMouseEvent);
begin
  with Parent as TScrollBox do
    HorzScrollBar.Position := HorzScrollBar.Position + AMessage.WheelDelta;
end;

Podobnie z pionowym paskiem; Ten sposób pochodzi z tego wątku i może działać ciekawiej; Chodzi o drugą linijkę kodu, czyli bezpośrednie dodanie tego co zawiera pole WheelDelta do pozycji scrollbara;

PS: Używaj angielskich identyfikatorów.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

A no wiem jak to zadziała wtedy, ale celowo napisałem tak jak jest. ;)

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

Co ja pitolę... Podany i używany przeze mnie kod nie pochodzi z oficjalnego forum Lazarusa, a ze źródeł LCL:

Kopiuj
{------------------------------------------------------------------------------
  Method: TControl.WMMouseWheel
  Params:   Msg: The message
  Returns:  nothing

  event handler.
 ------------------------------------------------------------------------------}
procedure TControl.WMMouseWheel(var Message: TLMMouseEvent);
var
  MousePos: TPoint;
  lState: TShiftState;
begin
  MousePos.X := Message.X;
  MousePos.Y := Message.Y;

  lState := Message.State - [ssCaps, ssNum, ssScroll]; // Remove unreliable states, see http://bugs.freepascal.org/view.php?id=20065
  if DoMouseWheel(lState, Message.WheelDelta, MousePos) then
    Message.Result := 1 // handled, skip further handling by interface
  else
    inherited;
end;

{------------------------------------------------------------------------------
       TControl DoMouseWheel  "Event Handler"
 ------------------------------------------------------------------------------}
function TControl.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
  MousePos: TPoint): Boolean;
begin
  Result := False;

  if Assigned(FOnMouseWheel)
  then FOnMouseWheel(Self, Shift, WheelDelta, MousePos, Result);

  if not Result
  then begin
    if WheelDelta < 0
    then Result := DoMouseWheelDown(Shift, MousePos)
    else Result := DoMouseWheelUp(Shift, MousePos);
  end;
end;

Coś mi się pokiełbasiło...

W każdym razie to nie ja jestem winny niezgodności z wytycznymi Microsoftu - brałem przykład z twórców oryginalnego kodu, czyli twórców biblioteki LCL; Tyle że formatowanie kodu mam lepsze :]


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 7x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

@Azarien - ja nie twierdzę, że ten kod jest prawidłowy; Grzecznie zwalam winę na prawidziwego winowajcę, z którego brałem przykład; Trudno tak na każdym kroku sprawdzać, czy RTL/LCL działa prawidłowo i czy nie robi mnie w balona w pewnych kwestiach - po prostu korzystam z tego, co już ktoś napisał;

Natomiast zagłębię się w temat (czytaj: potestuję jakieś kody) i wtedy coś postanowię.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Ten mój kod chyba jednak się nie nadaje :/ dopiero teraz zauważyłem problem. Niby działa to, ale nie na podstawie mojego kodu, ale po prostu dzięki scrollboxowi. Reagowało tylko w momencie gdy kursor był nad Scrollboxem, a nie nad tym co było umieszczone na nim, a więc w tym przypadku TTabela. Gdy kursor jest nad jakiś elementem to nie wyłapuje komunikatu MouseHWhell. Początkowo tak samo było jeśli chodziło o przesuwanie wertykalne, ale po dodaniu obsługi komunikatu MouseWheel to akurat zadziałało.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

Jak nie chcesz, aby komunikat był wałkowany przez wiele klas o wyższej abstrakcji to nie wołaj Inherited i ustawiaj AMessage.Result na 1; Powinno rozwiązać problem, o ile znów wierzyć źródłom LCL.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
0

Nadal nie działa przesuwanie. Program wgl nie wyłapuje komunikatu LM_MOUSEHWHEEL.

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:13 minut
  • Lokalizacja:Tuchów
  • Postów:12166
0

Pisałem Ci wcześniej abyś sprawdził, jaki komunikat odbiera okno w momencie poziomego przewijania tym Twoim kółkiem myszy; Podepnij się pod ogólną metodę przetwarzającą komunikaty kontrolki i do niej wrzuć własny kod:

Kopiuj
protected
  procedure WndProc(var AMessage: TLMessage); override;


procedure TMyControl.WndProc(var AMessage: TLMessage);
begin
  { tu kod analizy komunikatu }

  inherited WndProc(AMessage);
end;

W miejsce komentarza wstaw swój kod, dzięki któremu będziesz mógł podglądnąć wartość pola AMessage.msg; Jeżeli swój kod wstawisz po Inherited to odczytasz najpewniej zmodyfikowane dane, za sprawą obsługi danego komunikatu przez metodę WndProc klas o wyższej abstrakcji; Ale one najpewniej zmodyfikują tylko wartość pola AMessage.Result;

Możliwe, że Twoja mysz wcale nie wysyła (pośrednio) komunikatu WM_MOUSEHWHEEL.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)