Pomoc kontekstowa

dział ogólny

Pomoc kontekstowa

Nowy postprzez wargo » piÄ…tek, 9 października 2009, 17:10

Jak włączyć funkcje pomocy kontekstowej z poziomu menu. Chcę aby po kliknięciu pozycji w menu pojawił się odpowiedni wskaźnik myszy. Jak wybrać plik pomocy wiem i jak zrobić aby to działało z biHelp też ale o to mi nie chodzi, zaznaczam również że nie trzeba mnie informować o ustawieniu właściwości HelpContext!
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Cyfrowy Baron » piÄ…tek, 9 października 2009, 17:21

Chcę aby po kliknięciu pozycji w menu pojawił się odpowiedni wskaźnik myszy


A możesz zadać pytanie jaśniej i dokładniej, gdyż ja zrozumiałem, ze chcesz tylko zmienić tylko kursor, ale to można zrobić bez problemu:

Kod: Zaznacz cały
void __fastcall TForm::MenuItem1Click(TObject *Sender)
{
  ::SetCursor(LoadCursor(NULL, IDC_HELP)); /* kursor 'wybór pomocy' zdefiniowany dla systemu przez użytkownika */

  // jakieÅ› polecenie menu

Screen->Cursor = crDefault;
}


Pewnie nie o to Tobie chodzi, więc o co...?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez wargo » piÄ…tek, 9 października 2009, 18:36

O pomoc kontekstową, czyli wszystko to co dzieje sie po kliknięciu znaku zapytania w okienkach dialogowych (obok przycisku zamknij(biHelp)) tylko że w zdarzeniu onClick dla pozycji menu.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Cyfrowy Baron » sobota, 10 października 2009, 12:38

Udało mi się utworzyć pomoc kontekstową, ale tylko dla niektórych obiektów takich jak np. TButton, TEdit, TMemo, ale już nap. dla TPanel i TLabel pomoc kontekstowa nie działa, a nawet więcej - program nie reaguje wogóle na te komponenty. Jeżeli np. właściwość HelpContext obiektu Button2 będzie miała wartość 4, a plik pomocy (*.hlp) zawiera tylko 3 indeksy to pomoc kontekstowa zwróci informację "z tym elementem nie jest związany, żaden temat pomocy", ale w przypadku TLabel i TCaption nie otrzymam żadnej informacji.



Jak to zrobić?!

Stwórz sobie plik pomocy np. pomoc.hlp (z plikami *.chm na razie nic mi nie wyszło). Tematy muszą mieć przypisane indeksy (polecam program Help & Manual 5).

Umieść go gdzieś w katalogu programu.

Na formularzu umieść np. przycisk Button1. W jego właściwości HelpContext ustaw numer indeksu z pliku pomocy. Właściwość HelpType musi się równać htContext.

Formularz wyświetla ikonkę znaku zapytania tylko gdy jego właściwość BorderStyle jest ustawiona na bsDialog. To niestety oznacza, że nie możesz użyć tego w TMainMenu.

Do właściwości HelpFile formularza przypisujesz np. w konstruktorze klasy tegoż formularza plik pomocy:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   HelpFile = ExtractFilePath(ParamStr(0)) + "Help\\pomoc.hlp";
}
//---------------------------------------------------------------------------


Tworzysz zdarzenie OnHelp dla formularza i umieszczasz w nim taki kod:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
bool __fastcall TForm1::FormHelp(WORD Command, int Data, bool &CallHelp)
{
   CallHelp = false;

   if(WinHelp(this->Handle, HelpFile.c_str(), HELP_CONTEXTPOPUP, Data))
      return true;

  return false;
}
//---------------------------------------------------------------------------



I to było by na razie na tyle. Jeżeli ktoś ma jeszcze jakieś uwagi lub pomysły jak to poprawić, usprawnić itp. to chętnie poczytam...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez wargo » sobota, 10 października 2009, 16:35

Cyfrowy Baron napisał(a):Formularz wyświetla ikonkę znaku zapytania tylko gdy jego właściwość BorderStyle jest ustawiona na bsDialog. To niestety oznacza, że nie możesz użyć tego w TMainMenu.

Pytam właśnie jak zrobić to za pomocą MenuItem: nie że kiedy kliknę na pozycję to wyświetli się tekst z pliku pomocy tylko chodzi mi o to że kiedy wybiorę pozycję np. "Co to jest?" (przykład: MS Word) to włączy się mi to samo co po naciśnięciu "?" koło "zamknij".



Co do ikonki "?" to wystarczy też ustawić biMaximize i biMinimize na false tak jak napisałem w 1 poście.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Witold » sobota, 10 października 2009, 18:34

wargo napisał(a): że kiedy wybiorę pozycję np. "Co to jest?" (przykład: MS Word) to włączy się mi to samo co po naciśnięciu "?"


może to:
SendMessage(Handle,WM_SYSCOMMAND,SC_CONTEXTHELP,0);
?

a ustawiełeś właściwość HelpContext :twisted: ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez wargo » sobota, 10 października 2009, 19:53

Witold napisał(a):a ustawiełeś właściwość HelpContext :twisted: ?

Tak, ale to nie powinno mieć znaczenia żeby chociażby pojawiał się odpowiedni kursor ale już gotowy do spełnienia swojej funkcji
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Cyfrowy Baron » sobota, 10 października 2009, 20:00

Piszesz tak enigmatycznie, żę trudno Ciebie zrozumieć.

Do wyświetlania pomocy kontekstowej niezależnie jak to robisz służy funkcja:

Kod: Zaznacz cały
WinHelp(this->Handle, HelpFile.c_str(), HELP_CONTEXTPOPUP, Data)


Nie wiem jak to dokładnie jest robione, więc mogę zaproponować tylko coś takiego:

Utwórz w PopupMenu polecenie "Co to jest?", utwórz zdarzenie OnClick dla tego polecenia. Podłącz PopupMenu do wszystkich obiektów, które maja wyświetlać pomoc kontekstową po naciśnięciu na polecenie "Co to jest?".

Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
HelpFile = ExtractFilePath(ParamStr(0)) + "Help\\pomoc.hlp";
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::FormHelp(WORD Command, int Data, bool &CallHelp)
{
   CallHelp = false;

   if(WinHelp(this->Handle, HelpFile.c_str(), HELP_CONTEXTPOPUP, Data))
      return true;
  return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Menu1Click(TObject *Sender) // Polecenie PopupMenu "Co to jest?"
{
POINT p;
GetCursorPos(&p);

HWND hWnd = WindowFromPoint(p);

int Data = reinterpret_cast<TControl *>(FindControl(hWnd))->HelpContext;

bool CallHelp;
FormHelp(NULL, Data, CallHelp);
}
//---------------------------------------------------------------------------


Nie działa w odniesieniu do obiektu typu TLabel (nie wiem dlaczego) i być może dla kilku innych (nie sprawdzone). Testowałem an obiektach Memo i Panel
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez wargo » niedziela, 11 października 2009, 10:38

Nie chodzi mi o polecenie "co to jest" dla każdego obiektu osobno z menu podręcznego tylko o to jak zrobić funkcję zastępującą działanie - alias dla "?" :|
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Witold » niedziela, 11 października 2009, 11:09

@wargo,
kliknięcie na element menu ma spowodować:
a) to samo co naciśnięcie przycisku [?] na belce okna
b) będą w "trybie pomocy" (kursor z znakiem zapytania) kliknięcie na element menu ma spowodować wyświetlenie pomocy dla tego elementu menu
c) coÅ› innego
?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez wargo » niedziela, 11 października 2009, 11:21

Odpowiedź "a"!
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Witold » niedziela, 11 października 2009, 11:29

wargo napisał(a):Odpowiedź "a"!


Podałem wyżej : SendMessage(Handle,WM_SYSCOMMAND,SC_CONTEXTHELP,0);
Czy próbowałeś umieścieć to w zdarzeniu OnClick dla MenuItem ? U mnie działa.

Kod: Zaznacz cały
void __fastcall TForm1::MenuItem_UaktywnijHelpClick(TObject *Sender)
{
    SendMessage(Handle,WM_SYSCOMMAND,SC_CONTEXTHELP,0);
}

Za ten post autor Witold otrzymał podziękowanie od:
wargo
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Cyfrowy Baron » niedziela, 11 października 2009, 11:30

Pomyślałbyś chwile i znalazłbyś odpowiedź. Przecież wystarczy wywołać funkcję WinHelp z odpowiednimi parametrami, a najważniejsze to nazwa pliku pomocy oraz numer kontekstu.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Menu1Click(TObject *Sender) // Polecenie PopupMenu "Co to jest?"
{
   HelpFile = ExtractFilePath(ParamStr(0)) + "Help\\pomoc.hlp";
   WinHelp(this->Handle, HelpFile.c_str(), HELP_CONTEXTPOPUP, 1);
}
//---------------------------------------------------------------------------


Jeżeli zamiast HELP_CONTEXTPOPUP wstawisz HELP_CONTEXT uruchomiony zostanie plik pomocy z wybranym kontekstem.
Wartość 1 (patrz ostatni parametr funkcji) określa numer indeksu pliku pomocy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez wargo » niedziela, 11 października 2009, 11:39

Odpowiedź Witolda jest zgodna z moimi oczekiwaniami!
A jeśli chodzi o kod Cyfrowego Barona to ta opcja służy gdy mam uzyskać pomoc na temat klikniętego elementu menu.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pomoc kontekstowa

Nowy postprzez Cyfrowy Baron » niedziela, 11 października 2009, 11:45

Tak piszesz, że do końca Ciebie nie rozumiałem, a Ty chciałeś tylko zmienić kursor na kursor pomocy kontekstowej z zachowaniem funkcjonalności.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości