Dodawanie strony właściwości (ALT — Samouczek, część 6)
Uwaga
Kreator dostawcy OLE DB ATL nie jest dostępny w programie Visual Studio 2019 i nowszych wersjach.
Strony właściwości są implementowane jako oddzielne obiekty COM, które umożliwiają ich udostępnianie w razie potrzeby. W tym kroku wykonasz następujące zadania, aby dodać stronę właściwości do kontrolki:
Tworzenie zasobu strony właściwości
Dodawanie kodu do tworzenia strony właściwości i zarządzania nią
Dodawanie strony właściwości do kontrolki
Tworzenie zasobu strony właściwości
Aby dodać stronę właściwości do kontrolki, użyj szablonu strony właściwości ATL.
Aby dodać stronę właściwości
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję
Polygon
.W menu skrótów kliknij pozycję Dodaj>nowy element.
Z listy szablonów wybierz stronę właściwości ATL ATL>i kliknij przycisk Dodaj.
Po wyświetleniu Kreatora strony właściwości ATL wprowadź PolyProp jako krótką nazwę.
Kliknij pozycję Ciągi , aby otworzyć stronę Ciągi i wprowadź ciąg &Polygon jako tytuł.
Tytuł strony właściwości to ciąg wyświetlany na karcie tej strony. Ciąg dokumentu jest opisem używanym przez ramkę właściwości do umieszczenia w wierszu stanu lub wskazówce narzędzia. Należy pamiętać, że standardowa ramka właściwości obecnie nie używa tego ciągu, więc można pozostawić ją z domyślną zawartością. Nie wygenerujesz pliku Pomocy w tej chwili, więc usuń wpis w tym polu tekstowym.
Kliknij przycisk Zakończ, a obiekt strony właściwości zostanie utworzony.
Tworzone są następujące trzy pliki:
Plik | opis |
---|---|
PolyProp.h | Zawiera klasę CPolyProp języka C++, która implementuje stronę właściwości. |
PolyProp.cpp | Zawiera plik PolyProp.h. |
PolyProp.rgs | Skrypt rejestru, który rejestruje obiekt strony właściwości. |
Wprowadzono również następujące zmiany kodu:
Nowa strona właściwości jest dodawana do mapy wprowadzania obiektów w Polygon.cpp.
Klasa
PolyProp
jest dodawana do pliku Polygon.idl.Nowy plik skryptu rejestru PolyProp.rgs jest dodawany do zasobu projektu.
Szablon okna dialogowego jest dodawany do zasobu projektu dla strony właściwości.
Określone ciągi właściwości są dodawane do tabeli ciągów zasobów.
Teraz dodaj pola, które mają być wyświetlane na stronie właściwości.
Aby dodać pola do strony właściwości
W Eksplorator rozwiązań kliknij dwukrotnie plik zasobu Polygon.rc. Spowoduje to otwarcie widoku zasobu.
W widoku zasobu rozwiń
Dialog
węzeł i kliknij dwukrotnie pozycjęIDD_POLYPROP
. Zwróć uwagę, że wyświetlone okno dialogowe jest puste z wyjątkiem etykiety, która informuje o wstawieniu kontrolek tutaj.Wybierz tę etykietę i zmień ją, aby ją odczytać
Sides:
, zmieniając tekst Podpis w oknie Właściwości .Zmień rozmiar pola etykiety, tak aby pasował do rozmiaru tekstu.
Przeciągnij kontrolkę Edytuj z przybornika po prawej stronie etykiety.
Na koniec zmień identyfikator kontrolki
IDC_SIDES
edycji na użycie okna Właściwości .
Spowoduje to ukończenie procesu tworzenia zasobu strony właściwości.
Dodawanie kodu do tworzenia strony właściwości i zarządzania nią
Po utworzeniu zasobu strony właściwości należy napisać kod implementacji.
Najpierw włącz klasę CPolyProp
, aby ustawić liczbę boków w obiekcie po naciśnięciu przycisku Zastosuj .
Aby zmodyfikować funkcję Apply, aby ustawić liczbę stron
Zastąp
Apply
funkcję PolyProp.h następującym kodem:STDMETHOD(Apply)(void) { USES_CONVERSION; ATLTRACE(_T("CPolyProp::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]); short nSides = (short)GetDlgItemInt(IDC_SIDES); if FAILED(pPoly->put_Sides(nSides)) { CComPtr<IErrorInfo> pError; CComBSTR strError; GetErrorInfo(0, &pError); pError->GetDescription(&strError); MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION); return E_FAIL; } } m_bDirty = FALSE; return S_OK; }
Strona właściwości może mieć więcej niż jednego klienta dołączonego do niego w danym momencie, więc Apply
funkcja krąży i wywołuje put_Sides
na każdym kliencie wartość pobraną z pola edycji. Używasz klasy CComQIPtr, która wykonuje QueryInterface
element na każdym obiekcie w celu uzyskania IPolyCtl
interfejsu z interfejsu IUnknown
(przechowywanego w tablicym_ppUnk
).
Kod sprawdza teraz, czy ustawienie Sides
właściwości rzeczywiście zadziałało. W przypadku niepowodzenia kod wyświetla pole komunikatu z wyświetlonymi szczegółami błędu z interfejsu IErrorInfo
. Zazwyczaj kontener obiekt o ISupportErrorInfo
interfejs i wywołuje InterfaceSupportsErrorInfo
go jako pierwszy, aby określić, czy obiekt obsługuje ustawianie informacji o błędzie. Możesz pominąć to zadanie.
Narzędzie CComPtr pomaga automatycznie obsługiwać zliczanie odwołań, dlatego nie trzeba wywoływać Release
interfejsu. CComBSTR
pomaga w przetwarzaniu BSTR, więc nie trzeba wykonywać ostatniego SysFreeString
wywołania. Należy również użyć jednej z różnych klas konwersji ciągów, aby w razie potrzeby przekonwertować ciąg BSTR (dlatego makro USES_CONVERSION znajduje się na początku funkcji).
Należy również ustawić flagę zanieczyszczonej strony właściwości, aby wskazać, że przycisk Zastosuj powinien być włączony. Dzieje się tak, gdy użytkownik zmienia wartość w polu edycji Strony .
Aby obsłużyć przycisk Zastosuj
W widoku klasy kliknij prawym przyciskiem myszy
CPolyProp
i kliknij polecenie Właściwości w menu skrótów.W oknie Właściwości kliknij ikonę Zdarzenia.
IDC_SIDES
Rozwiń węzeł na liście zdarzeń.Wybierz pozycję
EN_CHANGE
, a następnie z menu rozwijanego po prawej stronie kliknij pozycję <Dodaj> OnEnChangeSides. DeklaracjaOnEnChangeSides
programu obsługi zostanie dodana do pliku Polyprop.h, a implementacja programu obsługi w celu Polyprop.cpp.
Następnie zmodyfikujesz procedurę obsługi.
Aby zmodyfikować metodę OnEnChangeSides
Dodaj następujący kod w Polyprop.cpp do
OnEnChangeSides
metody (usuwając dowolny kod umieszczony w kreatorze):LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
OnEnChangeSides
zostanie wywołana po WM_COMMAND
wysłaniu komunikatu EN_CHANGE
z powiadomieniem dla kontrolki IDC_SIDES
. OnEnChangeSides
następnie wywołuje SetDirty
i przekazuje wartość TRUE, aby wskazać, że strona właściwości jest teraz zanieczyszczona, a przycisk Zastosuj powinien być włączony.
Dodawanie strony właściwości do kontrolki
Szablon strony właściwości ATL i kreator nie dodają strony właściwości do kontrolki automatycznie, ponieważ w projekcie może istnieć wiele kontrolek. Musisz dodać wpis do mapy właściwości kontrolki.
Aby dodać stronę właściwości
Otwórz plik PolyCtl.h i dodaj następujące wiersze do mapy właściwości:
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT) PROP_PAGE(CLSID_PolyProp)
Mapa właściwości kontrolki wygląda teraz następująco:
BEGIN_PROP_MAP(CPolyCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
#ifndef _WIN32_WCE
PROP_ENTRY_TYPE("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UI4)
#endif
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
PROP_PAGE(CLSID_PolyProp)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
Można było dodać PROP_PAGE
makro ze identyfikatorem CLSID strony właściwości, ale jeśli używasz PROP_ENTRY
makra, jak pokazano, Sides
wartość właściwości jest również zapisywana podczas zapisywania kontrolki.
Trzy parametry makra są opisem właściwości, identyfikatorem DISPID właściwości i identyfikatorem CLSID strony właściwości, która ma na nim właściwość. Jest to przydatne, jeśli na przykład załadujesz kontrolkę do języka Visual Basic i ustawisz liczbę stron w czasie projektowania. Ponieważ liczba stron jest zapisywana, po ponownym załadowaniu projektu Visual Basic zostanie przywrócona liczba stron.
Kompilowanie i testowanie kontrolki
Teraz skompiluj kontrolkę i wstaw ją do kontenera testów kontrolek ActiveX. W kontenerze testowym w menu Edycja kliknij pozycję Obiekt klasy PolyCtl. Zostanie wyświetlona strona właściwości z dodanymi informacjami.
Przycisk Zastosuj jest początkowo wyłączony. Zacznij wpisywać wartość w polu Boki , a przycisk Zastosuj zostanie włączony. Po zakończeniu wprowadzania wartości kliknij przycisk Zastosuj . Zostanie zmieniony ekran kontrolki, a przycisk Zastosuj zostanie ponownie wyłączony. Spróbuj wprowadzić nieprawidłową wartość. Zostanie wyświetlone pole komunikatu zawierające opis błędu ustawionego put_Sides
z funkcji.
Następnie na stronie sieci Web zostanie umieszczona kontrolka.
Powrót do kroku 5 | do kroku 7