Math.h üst kısmında PolyCtl.h günah ve cos işlevini kullanacağınız poligon noktaları hesaplamak, yani eklemek için çizim kodu dahil:
# include lt;math.h >
# include "resource.h" / / ana sembolleri
&Not sürüm yalnızca inşanbsp; atl com AppWizard varsayılan proje oluşturduğunda, makro _ATL_MIN_CRTtanımlar. Bu makro, böylece o gerekmiyorsa kodunuza c Çalışma Zamanı Kütüphanesi getirmek etmeyin tanımlanır. Çokgen kontrol c Çalışma Zamanı Kitaplığı başlatma kodu kayan nokta işlevleri başlatmak gerekir. Bu nedenle, bir yayım sürümünü oluşturmak istiyorsanız _ATL_MIN_CRT makro kaldırmanız gerekir. Makroyu kaldırmak için Proje menüsünde Ayarlar ' ı tıklatın. İçinde ayarları için: açılan listesinde, Çoklu yapılandırmalarınıseçin. Görünür değiştirmek için proje i?aretleyerek Seç iletişim kutusunda, tüm dört sürüm sürümler için onay kutularını işaretleyin, sonra Tamam' ı tıklatın. c/c++ sekmesinde Genel kategoriyi seçin, ardından _ATL_MIN_CRT Önişlemci tanımlarını Düzenle kutusundan kaldırmak.
Bir kez poligon noktaları hesaplanır, Puan türü dizisi PolyCtl.h sınıf tanımında sonuna ekleyerek sakladığınız:
Ole_color m_clrFillColor;
kısa m_nSides;
POINT m_arrPoint [100]
Şimdi değiştirmek OnDraw Aşağıda bir maç için PolyCtl.h işlevi. Dikdörtgen ve DrawText işlevleri çağrılarını çıkarmak unutmayın. Açık olsun ve bir siyah kalem ve beyaz fırça seçin. Denetim penceresiz çalışıyor durumda yapmanız gerekir. Kendi penceresinde yoksa, aygıt içeriği hakkında varsayımlar çizim yapamaz.
Tamamlanan OnDraw Bu gibi görünüyor:
Hresult CPolyCtl::OnDraw(ATL_DRAWINFOamp; di)
{
DİKD & rc = *(RECT*)di.prcBounds;
hdc hdc = di.hdcDraw;
colorref colFore;
hbrush hOldBrush, hBrush;
hpen hOldPen, hPen;
/ / M_colFore colorref türü Çevir
OleTranslateColor (m_clrFillColor, null & colFore);
/ / Oluşturmak ve daire çizmek için renk seçme
hPen = (HPEN)GetStockObject(BLACK_PEN);
hOldPen = (hpen) NesneSeç (hdc, hPen);
hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
hOldBrush = (hbrush) NesneSeç (hdc, hBrush);
Elips (hdc, rc.left, rc.top, rc.right, rc.bottom);
/ / Oluşturmak ve çokgen dolgu için kullanılacak fırça seçin
hBrush = CreateSolidBrush(colFore);
NesneSeç (hdc, hBrush);
CalcPoints(rc);
Çokgen (hdc & m_arrPoint [0], m_nSides);
/ / Select geri eski kalem ve fırça ve biz fırça silme
NesneSeç (hdc, hOldPen);
NesneSeç (hdc, hOldBrush);
DeleteObject(hBrush);
s_ok döndürür;
}
Şimdi adı&nda bir işlev eklemek gerekir CalcPoints , bu satırı intersections.nbsp; koordinatları hesaplamak Bu hesaplamalar rect değişken işlevi iletilen temel alır. İlk PolyCtl.h IPolyCtl sınıf için genel bölümüne CalcPoints tanımı eklemek gerekir:
voidnbsp; CalcPoints (const DİKD & rc)
IPolyCtl sınıfı genele açık bir bölüme şimdi aşağıdaki gibi görünmelidir:
/ / IPolyCtl
public:
STDMETHOD(get_Sides) (/ * [dışarı retval] * kısa * newVal);
STDMETHOD(put_Sides) (/ * [de] * kısa newVal);
voidnbsp; CalcPoints (const DİKD & rc)
Ardından, uygulama ekleme CalcPoints PolyCtl.cpp dosyasının sonuna işlevi:
void CPolyCtl::CalcPoints (const RECTamp; rc)
{
Const double PI = 3.14159265358979;
NOKTASI ptCenter;
çift dblRadiusx = (rc.right - rc.left) / 2;
çift dblRadiusy = (rc.bottom - rc.top) / 2;
çift dblAngle = 3 * pi / 2; / Start üstünde
çift dblDiff = 2 * PI / m_nSides; / / Her açı yan yapmak
ptCenter.x = (rc.left + rc.right) / 2;
ptCenter.y = (rc.top + rc.bottom) / 2;
/ / Her tarafı puanı hesapla
for (int i = 0; i < m_nSides; i ++)
{
m_arrPoint [i] .x = (uzun) (dblRadiusx * cos(dblAngle) + ptCenter.x + 0,5);
m_arrPoint [i] .y = (uzun) (dblRadiusy * sin(dblAngle) + ptCenter.y + 0,5);
dblAngle += dblDiff;
}
}
Şimdi başlatmak m_clrFillColor . Varsayılan rengi yeşil'i seçip bu satıra ekleme CPolyCtl PolyCtl.h Oluşturucu:
m_clrFillColor = rgb (0, 0xFF, 0)
Oluşturucu Şimdi şuna:
CPolyCtl()
{
m_nSides = 3;
m_clrFillColor = rgb (0, 0xFF, 0);
}
Şimdi denetimi yeniden oluşturma ve yeniden deneyin. ActiveX denetimi sınaması kapsayıcısı açın ve denetim ekleme. Sen-meli görmek bir daire içinde yeşil bir üçgen. Kenarların sayısını aşağıdaki adımları izleyerek değiştirmeyi deneyin. Bir çift arabiriminden Test kapsayıcıiçindeki özellikleri değiştirmek için Çağırma yöntemlerini kullanın.:

Denetim değişmez dikkat edin. Ne oldu? Dahili olarak ayarlayarak kenar sayısını değiştirmiş olmasına rağmen m_nSides değişken, çizilecek denetimi neden yoktu. Eğer başka bir uygulamaya geçin ve sen-ecek bulmak o geri Sınaması kapsayıcısı geçiş denetimi yoktur ve şimdi doğru sayıda kenarı.
Bu sorunu düzeltmek için kenar sayısını belirledikten sonra IViewObjectExImpliçinde tanımlanan FireViewChange işlevine çağrı eklemeniz gerekir. Denetimin kendi penceresi içinde çalışıyorsa, FireViewChange InvalidateRect API doğrudan çağırır. Denetimi penceresiz çalışıyorsa, InvalidateRect yönteminin konteynerin sitesi arabirimde çağrılacaktır. Bu denetimin kendisini yeniden çizilecek zorlar.
Yeni put_Sides yöntemi aşağıdaki gibidir:
STDMETHODIMP CPolyCtl::put_Sides(short newVal)
{
Eğer (newVal gt; 2 & & newVal < 101)
{
m_nSides = newVal;
FireViewChange();
s_ok döndürür;
}
başka
hata (_t ("şekli olması gerekir 3 ve 100 iki taraf arasında"));
}
FireViewChangeekledikten sonra yeniden ve denetimi yeniden deneyin. Bu zaman zaman Kenarların sayısını değiştirmek ve Invoke, tıklatın sen-meli görmek hemen değişiklik denetimi.
Sonra denetimin olay ekleyeceksiniz.
3. Adıma geri |nbsp; Adım 5