Terve vaan foorumilaiset.
VisualBasic-aloittelijana kysymykseni koskee seuraavaa:
Tein Rubiikin kuutio-sovelluksen, jossa kuutio päivittyy paikkatietojen perusteella "3D-kuvaan", jossa näkyy samanaikaisesti 3 kylkeä. Tämä on yksinkertaisesti toteutettu Excelin automaattisten muotojen piirtotyökaluilla 27:stä objektista. Tämä sen takia, että en osannut kylmiltään kokeilla VBA:n grafiikkapuolta.
Kuution ohjaus tapahtuu UserFormista, jossa on Photarissa piirretty kuva kuutiosta ja nuolista (kaikki mahdolliset siirtosuunnat selkeästi esitettynä). Kuvan nuolia klikkaamalla siis kääntelyt tapahtuvat (MouseDown), ja joka kääntelyn jälkeen värit päivittyvät excelin puolella olevaan objektihässäkkään, joka näyttää kuutiolta.
Mieleni tekisi saada päivittyvä kaappaus tästä "värikuvasta" userform-ikkunaan, TAIKKA piirrettyä suunnikkaat suoraan userformiin, niin että niiden pohjaväriä ja viivanleveyttä saa säädettyä. Onko tämä mahdollista? Tarkoitus oli, että userformissa näkyy kaikki vaadittava, ja excelin ikkunan voi piilottaa pois.
Nyt varmaan jo keskiverto ohjelmoija sielä pudistelee päätään ja miettii, että käyttäisi vaan suoraan piirtokomentoja turhia kiertelemättä. Vaan kun ei vielä onnistu näillä taidoilla..
Myöhemmin voin sitten koittaa väsäillä grafiikoita.
Eli kaikki muu pelaa moitteetta, paitsi grafiikka on Persepoliksesta.
Apuja kaivaten
VBA ei näytä sisältävän valmiita piirtokomentoja, minkä vuoksi toteutus voi mennä melko hankalaksi. En tosin ole VBA-asiantuntija, mutta ainoa minulle mieleen tuleva ratkaisu on käyttää piirtämiseen WinAPI-funktioita. Kun tarkoitus on piirtää nelikulmioita, funktio Polygon sopii tehtävään hyvin. Monta muutakin funktiota tarvitaan piirtoalueen, viivan paksuuden ja täyttövärin määritykseen. Nyt minulla ei ole aikaa laatia tarkkaa esimerkkiä, mutta ehkä ehdin rakennella esimerkin illalla. Kenties myös Google voisi tarjota lisätietoa hakusanoilla "vba", "winapi" ja ehkä "polygon".
Tässä tulee koodi, jolla voi piirtää nelikulmioita (ja muitakin monikulmioita). Reunuksen paksuutta ja väriä voi muuttaa, samoin kuvion täyttöväriä. Käytännössä voisi olla hyvä ajatus sijoittaa koodi omaan aliohjelmaan. En nyt testannut koodia kovin perusteellisesti, mutta toivottavasti ei ilmene yllätyksiä ja koodista on hyötyä.
Private Declare Function GetForegroundWindow Lib "user32" () As Long Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub UserForm_Click() Dim kahva As Long kahva = GetDC(GetForegroundWindow()) Dim reunus As Long ' reunuksen paksuus 3, väri sininen reunus = CreatePen(0, 3, RGB(0, 0, 255)) Dim taytto As Long ' täyttöväri vihreä taytto = CreateSolidBrush(RGB(0, 255, 0)) Dim paikat(4) As POINTAPI ' nelikulmion koordinaatit paikat(0).x = 10 paikat(0).y = 10 paikat(1).x = 50 paikat(1).y = 30 paikat(2).x = 70 paikat(2).y = 70 paikat(3).x = 30 paikat(3).y = 50 SelectObject kahva, reunus SelectObject kahva, taytto Polygon kahva, paikat(0), 4 DeleteObject reunus DeleteObject taytto End Sub
Kiitoksia,
kokeilen tässä viikonloppuna korvata objektien piirrot muokatulla koodilla. Täytyy tehdä 27 eri pätkää ja jokaiselle värintäyttöön 6 vaihtoehtoa.
Laittalen kuvia (ennen/jälkeen) rumasta tekeleestä kun se on valmis.
Aihe on jo aika vanha, joten et voi enää vastata siihen.