Pamācības

Lietotāja saskarne (User Interface), 3. daļa - statiskās kontroles (static controls)

Lietotāja saskarne (User Interface), 3. daļa - statiskās kontroles (static controls)

Elviss Strazdiņš, 24.03.2010

3. Lietotāja saskarne (user interface) - statiskās kontroles (static controls)

 Statiskās kontroles (static controls)

Statiskās kontroles parasti izmanto, lai ievietotu kādus zīmējumus, tekstu, vai sadalītu saskarni kaut kādās grupās. Statiskās kontroles var saņemt peles ievadi (input). Kā jau teicu iepriekšējā pamācībā, es centīšos pievienot lietas kas vēl nepieciešamas lietotāju saskarnei. To, ko iemācīsimies šodien varēs arī pievienot pogām (buttons) un checkbox'iem.

Vispirms, kā parasti, izveidosim klasi - CStaticControl:

class CStaticControl
{
    void Draw();
    void OnEvent(int nEvent,int nParam);

    char*    m_strCaption;
    GLuint  m_nImage;

    bool      m_bPressed;
    bool      m_bMouseOnIt;

    bool      m_bVisible;

    int         m_nPosX;
    int         m_nPosY;
    int         m_nSizeX;
    int         m_nSizeY;
};

Tātad mēs izveidojām līdzīgu klasi CButton, tikai pievienojām vienu mainīgo - m_nImage. Ja jūs lietojat OpenGL, tad šis parametrs droši vien būs GLuint vai arī kā savādāk (piemēram, IDirect3DTexture9*). Šo mainīgo mēs izmantojam tad, ja mūsu statiskā kontrole ir zīmējums (image).

Un tagad es pastāstīšu par lietām ko gribēju pievienot lietotāju saskarnei - MOUSEENTER, MOUSELEAVE, DOUBLECLICK, DRAG.

Es mazliet paskaidrošu par katru no šīm lietām: MOUSEENTER - tiek sūtīts, ja lietotājs ar peli ieiet kontroles zonā, MOUSELEAVE - ja lietotājs pamet kontroles zonu, DOUBLECLICK - ja lietotājs izdara dubultklikšķi kontroles zonā, DRAG - ja lietotājs noklikšķina kontrolē un tad velk (drag) to.

Šeit būs kods OnEvent funkcijai:

void CStaticControl::OnEvent(int nEvent,int nParam)
{
    if (!m_bVisible) return;

    switch(nEvent)
    {
        case CURSORMOVEX:
        case CURSORMOVEY:
        {
            if (m_bPressed) SendMessage(STATICCONTROL_DRAG,this); //ja kontrole ir nospiesta un pele kustas, tad mēs to velkam

            POINT pos;
            GetCursorPos(&pos);

            if (pos.x>=m_nPosX &&
                pos.x<=m_nPosX+m_nSizeX &&
                pos.y>=m_nPosY &&
                pos.y<=m_nPosY+m_nSizeY)

             {
                if (!m_bMouseOnIt) SendMessage(STATICCONTROL_MOUSEENTER,this); //ja pirms tam pele nebija kontroles zonā, tad tagad tā ir iegājusi kontroles zonā
                m_bMouseOnIt=true;
             }
             else
             {
                if (m_bMouseOnIt) SendMessage(STATICCONTROL_MOUSELEAVE,this); //ja pirms tam pele bija kontroles zonā, tad tagad tā ir pametusi kontroles zonu
                m_bMouseOnIt=false;
             }
        }
        break;

        case DOUBLECLICK:
        {
            if (m_bMouseOnIt) SendMessage(STATICCONTROL_DOUBLECLICK,this); //ja ir noticis dubultklikšķis un pele atrodas kontroles zonā, tad dubultklikšķis ir noticis uz šīs kontroles
        }
        break;

        case MOUSEBUTTONDOWN:
            if (nParam==LEFTMOUSEBUTTON)
            {
                if (m_bMouseOnIt)
                {
                    m_bPressed=true;
                }
            }
        break;
 
        case MOUSEBUTTONUP:
            if (nParam==LEFTMOUSEBUTTON && m_bPressed)
            {
                if (m_bMouseOnIt) SendMessage(STATICCONTROL_CLICK,this); //statiskā kontrole skaitās noklikšķināta, ja peles poga ir uz tās nospiesta un palaista vaļā
                 m_bPressed=false;
            }
        break;
    }
}

Pamatā jau šeit ir palicis viss tas pats, kas CButton OnEvent funkcijā, tikai ir pievienoti šie 4 notikumi (events). Kā jau teicu, šos 4 notikumus var pievienot arī pogām un visām pārējām kontrolēm, tādēļ šī pamācība nav tikai par statiskajām kontrolēm.

Un tagad Draw funkcija:

void CStaticControl::Draw()
{
    if (!m_bVisible) return;

    //zīmējam tekstu un zīmējumu
}

Nekā sarežģīta šeit nav. Bet ja jūs gribat teksta kontroles un zīmējuma kontroles atsevišķi, tad jums vajadzētu pievienot int m_nType CStaticControl klasei. šādā gadījumā Draw funkcija izskatīsies šādi:

void CStaticControl::Draw()
{
    if (!m_bVisible) return;

    switch(m_nType)
    {
        case STATICCONTROL_TEXT:
        //zīmējam tekstu
        break;
        case STATICCONTROL_IMAGE:
        //zīmējam zīmējumu
        break;
    }
}

Jūs protams varat pievienot arī savus notikumus (events) - piemēram, RIGHTBUTTONCLICK utt. bet to es atstāšu Jūsu ziņā (domāju pēc šīm pamācībām Jūs varēsiet to izdarīt). Jūs, protams, varat pievienot arī tādus statisko kontroļu tipus, kā Windows - simple graphics (vienkārša grafika - četrstūris, aplis, utt.), ownerdraw (kontroles kuras zīmē nevis engine, bet jūs pats - piemēram, group box, logi, utt), taču nedomāju ka bez tiem nevarētu iztikt.

Beigas 

Kārtējā pamācība nu ir galā. Un atkal - ja jums ir kādi jautājumi, labojumi vai jaunas idejas, tad rakstiet komentāros.

Nākošā pamācība: 4. UI (lietotāja saskarne) - editbox, slidebar.

Līdzīgi raksti:

Autorizācija

Lietotājs

Parole


Reģistrēties Aizmirsu paroli