Pamācības
Lietotāja saskarne (User Interface), 3. daļa - statiskās kontroles (static controls)
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: