рдЯреЗрдмрд▓ рдирд┐рдпрдВрддреНрд░рдг (рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХреЗ рдирд╛рдо рдореЗрдВ рдЯреЗрдмрд▓ рдпрд╛ рдЧреНрд░рд┐рдб) рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╛рд╕ GUIs рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдХрд╛рдо рдкрд░ рд╣рдо рдПрдХ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C ++ рдФрд░ MFC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдордиреЗ рдЧреНрд░рд┐рдб рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдФрд░ рдХрд╛рдлреА рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
CGridCtrl - рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рд╕реЗ рд╡рд╣ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реВрдк рд╣реЛ рдЧрдпрд╛ рдФрд░ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рдХрд╛рд╕ рд╣реБрдЖред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЪрд╛рд░, рдореИрдВ рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдЬреНрдпрд╛рджрд╛рддрд░ рдХреНрдпреВрдЯреА рдХреЗ рддрд╣рдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛) рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдиреЛрдЯ рдХреЛ "рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг" рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдореИрдВ рдЙрди рдХрд╛рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЦреБрд╢ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реВрдВ (рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдиреЛрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИ)ред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рд╕рдореГрджреНрдз рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡рд╛рд▓реЗ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдФрд░ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╣реИрдВ, рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирдИ рдЧреНрд░рд┐рдб рдХреЛ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓рдЪреАрд▓рд╛ рдЕрдиреБрдХреВрд▓рди, рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдиреНрдпреВрдирддрдо рдореЗрдореЛрд░реА рдЦрдкрдд рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдерд╛ред рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА: рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдФрд░ рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдФрд░ рдХрд╛рд░реНрдп рдХреА рдЗрд╖реНрдЯрддрдорддрд╛ рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдмреЗрд╢рдХ, рдпрд╣ рдирд┐рдпрдо рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреИрд╕реЗ рд╕рдВрддреБрд▓рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред
рдХреБрдЫ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЧреНрд░рд┐рдб рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░рд┐рдб рдПрдХ рджреГрд╢реНрдп рддрддреНрд╡ рд╣реИ рдЬреЛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ (рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ) рдХрд╛ рдПрдХ рдЧреНрд░рд┐рдб рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рдЧреНрд░рд┐рдб рдореЗрдВ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдбреЗрдЯрд╛ред рдЧреНрд░рд┐рдб рд╕рдВрд░рдЪрдирд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЧреНрд░рд┐рдб рд╕рдВрд░рдЪрдирд╛ (рдЯреЛрдкреЛрд▓реЙрдЬреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рд╕реНрддрдВрдн рдмрд╣реБрдд рд╕рдорд╛рди рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред рд╣рдо рдЕрдкреНрд░рднреЗрджреНрдп рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд┐рдорд╛рди рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рддреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рд▓рдВрдмрд╡рддред рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЫреЛрдЯреА рдФрд░ рдЖрддреНрдордирд┐рд░реНрднрд░ рдЗрдХрд╛рдИ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ C ++ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдЯрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдиреНрд╕ рдХреЛ рдмреБрд▓рд╛рдпрд╛ (рд░реВрд╕реА рдореЗрдВ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЗрдиреНрд╕ рдпрд╛ рд╕реНрдЯреНрд░рд╛рдЗрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рд╡рд░реНрдЧ рд░реЗрдЦрд╛рдУрдВ (рдкрдВрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рд╕реНрддрдВрднреЛрдВ) рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рдиреЗ рдФрд░ рдПрдХ рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд░реНрдЧ рдЫреЛрдЯрд╛ рдФрд░ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕реЗрдЯ рдФрд░ рдЙрди рдкрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЧреБрдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреА:
- рдЧрдгрдирд╛ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдЕрдкрдирд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рд╕рдХрддреА рд╣реИ (рдкрдВрдХреНрддрд┐ рдКрдВрдЪрд╛рдИ, рдФрд░ рд╕реНрддрдВрдн - рдЪреМрдбрд╝рд╛рдИ)
- рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз, рд╕реНрддрдВрднреЛрдВ рдХреЛ рдкреБрди: рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛)
- рд▓рд╛рдЗрдиреЗрдВ рдЫрд┐рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ)
рдореИрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕реЗрдЯ рдкрд░ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЙрдкрдпреЛрдЧреА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рд╡рд░реНрдЧ рд╣реИ:
class Lines { public: Lines(UINT_t count = 0); UINT_t GetCount() const { return m_count; } void SetCount(UINT_t count); UINT_t GetLineSize(UINT_t line) const; void SetLineSize(UINT_t line, UINT_t size); bool IsLineVisible(UINT_t line) const; void SetLineVisible(UINT_t line, bool visible); template <typename Pred> void Sort(const Pred& pred); const vector<UINT_t>& GetPermutation() const; void SetPermutation(const vector<UINT_t>& permutation); UINT_t GetAbsoluteLineID(UINT_t visibleLine) const; UINT_t GetVisibleLineID(UINT_t absoluteLine) const; Event_t<void(const Lines&, unsigned)> changed; private: UINT_t m_count; vector<UINT_t> m_linesSize; vector<bool> m_linesVisible; };
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдФрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдп рдФрд░ рдХреНрд╖реЗрддреНрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧ рдореЗрдВ
GetAbsoluteLineID
рдФрд░
GetVisibleLineID
ред рдЪреВрдВрдХрд┐ рд╣рдо рдЖрдкрдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдФрд░ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд░рдкреЗрдХреНрд╖ рдФрд░ рджреГрд╢реНрдпрдорд╛рди рд╕реВрдЪрдХрд╛рдВрдХ рд▓рд╛рдЗрдиреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рддрд╕реНрд╡реАрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддреА рд╣реИред

рд╕рд╛рде рд╣реА рд▓рд╛рдЗрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
Event_t<void(const Lines&, unsigned)> changed;
рдПрдХ рд╕рдВрдХреЗрдд рдпрд╣рд╛рдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХреНрдпреВрдЯреА рдпрд╛ рдмреВрд╕реНрдЯ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред C ++ 11 рдФрд░ std :: рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдХреЗрддреЛрдВ / рд╕реНрд▓реЙрдЯреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рди рд░рд╣реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рд▓рд╛рдЗрдиреНрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдХрд┐рд╕реА рднреА рдлрдВрдХреНрд╢рди рдпрд╛ рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ рдЗрд╕рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд┐рдб рдЗрд╕ рдИрд╡реЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЗрдиреНрд╕ рдХреА рдЖрд╡реГрддреНрддрд┐ рдмрджрд▓рдиреЗ рдкрд░ рдЕрд▓рд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЧреНрд░рд┐рдб рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЛ рд▓рд╛рдЗрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
private: Lines m_rows; Lines m_columns;
рд╣рдо рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЧреНрд░рд┐рдб рдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рджреА рдЬрд╛рдП рдХрд┐ рд╡рд╣ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛? рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдореИрдВрдиреЗ рдПрдорд╡реАрд╕реА (рдореЙрдбрд▓-рд╡реНрдпреВ-рдХрдВрдЯреНрд░реЛрд▓рд░) рдЯреНрд░рд╛рдпрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рддрддреНрд╡ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдЬрд┐рд╕ рддрд░рд╣ рд▓рд╛рдЗрдиреНрд╕ рдХреНрд▓рд╛рд╕ рдПрдХ рд▓рд╛рдЗрди рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдХреЛ рдПрдХ рдРрд╕реА рдЪреАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЧреНрд░рд┐рдб рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдмрд╕реЗрдЯ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдЬрд╛рддреАрдп рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЙрд▓рдо рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдмрдирд╛рдиреА рд╣реЛрдЧреА рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХреЗ рдФрд░ рдпрд╣ рдХрд╣ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рдХреЙрд▓рдо рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦреЗрдВ, рдФрд░ рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ рдпрд╣ рдмрддрд╛ рд╕рдХреЗ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рд░реЗрдВрдЬ (рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ)ред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЧреНрд░рд┐рдб рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛, рд╣рдо рд╕рд┐рд░реНрдл рдпрд╣ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред
рдЪрд▓реЛ рд╢реНрд░реЗрдгреА рд╡рд░реНрдЧ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдпрд╣ рдПрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд░реНрдЧ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рддреБрд░рдВрдд рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд▓ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:
class Range { public: virtual bool HasCell(CellID cell) const = 0; };
рдЗрд╕ рддрд░рд╣ рдЖрдк рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╣реЛрдВрдЧреЗ:
class RangeAll { public: bool HasCell(CellID cell) const override { return true; } }; class RangeColumn { public: RangeColumn(UINT_t column): m_column(column) {} bool HasCell(CellID cell) const override { return cell.column == m_column; } private: UINT_t m_column; };
рдкрд╣рд▓рд╛ рд╡рд░реНрдЧ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╡рд░реНрдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрддрдВрдн рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдлрдВрдХреНрд╢рди рдмрдЪрд╛ рд╣реИ - рд╕реЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдбреНрд░рд╛ рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕реНрдерд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрддрдВрдн рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдлрд╝рд┐рдЯ рдореЛрдб)
- рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдкрд╛рдард╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреЗрдВ (рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рдпрд╛ рдЯреВрд▓рдЯрд┐рдк рдореЗрдВ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ)
class View { public: virtual void Draw(DrawContext& dc, Rect rect, CellID cell) const = 0; virtual Size GetSize(DrawContext& dc, CellID cell) const = 0; virtual bool GetText(CellID cell, INTENT intent, String& text) const = 0; };
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╣реА рд╕реЗрд▓ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдЖрдЗрдХрди рдФрд░ рдкрд╛рда рдЦреАрдВрдЪреЗрдВ рдпрд╛ рдЙрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдФрд░ рдкрд╛рда рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВред рдореИрдВ рдЗрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреГрд╢реНрдп рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЖрдЗрдП рдПрдХ рд╕реЗрд▓ рдореЗрдВ рдХрдИ рд╕рд╛рд░реЗ рд╡реНрдпреВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпреВ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдПред
class Layout { public: virtual void LayoutView(DrawContext& dc, const View* view, Rect& cellRect, Rect& viewRect) const = 0; };
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЪреЗрдХрдмреЙрдХреНрд╕ рдФрд░ рдкрд╛рда рдкрд╣рд▓реЗ рдХреЙрд▓рдо рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рджреВрд╕рд░рд╛ рдХреЙрд▓рдо рд░реЗрдбрд┐рдпреЛ рдмрдЯрди, рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдмреЙрдХреНрд╕ рдФрд░ рд░рдВрдЧ рдХрд╛ рдкрд╛рда рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдФрд░ рдПрдХ рдЕрдиреНрдп рд╕реЗрд▓ рдореЗрдВ рдПрдХ рддрд╛рд░рд╛рдВрдХрди рд╣реЛрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рд╣рдо LayoutLeft рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕реЗрд▓ рдХреЗ рдЖрдпрдд рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдЖрдпрдд рдХреЛ "рдЖрдХрд╛рд░" рдФрд░ "рдХрд╛рдЯрдиреЗ" рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред рдФрд░ рдкрд╛рда рдХреЗ рд▓рд┐рдП рд╣рдо LayoutAll рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЫреЛрдЯрд╛ рдЖрдпрддрд╛рдХрд╛рд░ рд╕реЗрд▓ рд╕реЗрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдЬрд╛рдПрдЧрд╛ред LayoutAll рдЕрдкрдиреЗ рджреГрд╢реНрдп рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реЗрд▓ рдХреЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕реНрдерд╛рди рдХреЛ "рд▓реЗ"ред рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧреА рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЪрд▓рд┐рдП рдЙрд╕ рдЧреНрд░рд┐рдб рдХреНрд▓рд╛рд╕ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рддреНрд░рд┐рдХреЛрдгреАрдп <рд╢реНрд░реЗрдгреА, рджреГрд╢реНрдп, рд▓реЗрдЖрдЙрдЯ> рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рд╕реЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рдбреЗрдЯрд╛ рд╕реЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдЧреНрд░рд┐рдб рд╡рд░реНрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class Grid { private: Lines m_rows; Lines m_columns; vector<tuple<Range, View, Layout>> m_data; };
рдпрд╣ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП m_data рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдЧреНрд░рд┐рдб рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрд╖реНрдЯрддрдо рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рдХреЙрд░реНрдб рдХреА рдПрдХ рд╕реВрдЪреАред
рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд▓ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВред
- рд╣рдореЗрдВ m_data рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдЙрди рддреНрд░рд┐рдЧреБрдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдХреЛрд╢рд┐рдХрд╛ рд░реЗрдВрдЬ рдореЗрдВ рдЖрддреА рд╣реИ
for (auto d: grid.m_data) if (d.range->HasCell(cell)) cell_data.push_back(d);
- рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдпрдд рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
Rect cellRect = CalculateCellRect(grid.m_rows, grid.m_columns, cell);
- рд╕рднреА рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЖрдпрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
vector<Rect> view_rects(cell_data.size()); auto view_rect_it = view_rects.begin(); for (auto d: cell_data) d.layout->LayoutView(grid.GetDC(), d.view, cellRect, *view_rect_it++);
- рдЙрдирдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХреА рдЧрдИ рдЖрдпрддреЛрдВ рдореЗрдВ рд╕рднреА рджреГрд╢реНрдп рдмрдирд╛рдПрдВ
auto view_rect_it = view_rects.begin(); for (auto d: cell_data) d.view->Draw(grid.GetDC(), *view_rect_it++, cell);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдкрд╛рджрди рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рджреГрд╢реНрдп рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рдЖрдпрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ рдпреЗ рджреГрд╢реНрдп рдбреЗрдЯрд╛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЖрдк рдПрдХ рдЫреЛрдЯреЗ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдбреНрд░рд╛ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕рд┐рдВрдЧрд▓ рдкреЙрдЗрдВрдЯ 4 рд╣реЛрдЧрд╛ред
class CellCache { public: CellCache(Grid grid, CellID cell); void Draw(DrawContext& dc); private: CellID m_cell; Rect m_cellRect; vector<pair<View, Rect>> m_cache; };
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдпрд╣ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рддреАрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ m_cache рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдбреНрд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рд╣реЛ рдЧрдпрд╛ред рдЗрд╕ рд▓рдкрдЯ рдХреЗ рд▓рд┐рдП m_cache рдХреЗ рд░реВрдк рдореЗрдВ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд▓рд╛рднрд╣реАрди рд╣реЛрдЧрд╛ (рд╣рдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рднреА рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓рдХреИрдЪ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рджреГрд╢реНрдпрдорд╛рди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЧреНрд░рд┐рдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЧреНрд░рд┐рдб рдХреЗ рджреГрд╢реНрдпрдорд╛рди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓рдХреИрдЪ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
class GridCache { public: GridCache(Grid grid); void SetVisibleRect(Rect visibleRect); void Draw(DrawContext& dc); private: Grid m_grid; Rect m_visibleRect; vector<CellCache> m_cells; };

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧреНрд░рд┐рдб рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдирдпрд╛ рджреГрд╢реНрдпрдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, m_cells рдХреЛ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рд░реАрдб-рдУрдирд▓реА рдЧреНрд░рд┐рдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд┐рдбрдХреЗрдЪ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
class GridWindow { public: Grid GetGrid() { return m_gridCache.GetGrid(); } void OnPaint() { m_gridCache.Draw(GetDrawContext()); } void OnScroll() { m_gridCache.SetVisibleRect(GetVisibleRect()); } void OnSize() { m_gridCache.SetVisibleRect(GetVisibleRect()); } private: GridCache m_gridCache; };
рдЧреНрд░рд┐рдб рдФрд░ рдЧреНрд░рд┐рдбрдХреЗрдЪ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧреНрд░рд┐рдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреНрд░рд┐рдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд┐рдб рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреГрд╖реНрда-рджрд░-рдкреГрд╖реНрда рдореБрджреНрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпрд╛ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЧреНрд░рд┐рдб рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЧреНрд░рд┐рдбрд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдмрд╕ рдПрдХ рддрд░рдл, рдПрдХ рдЧреНрд░рд┐рдбрдЪреИрдЪ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдЧреНрд░рд┐рдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реВрдк рдореЗрдВ, рдирдпрд╛ рдЧреНрд░рд┐рдбрдЪреИрдб рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдФрд░ рдкреНрд░рд┐рдВрдЯ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ? рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдирд┐рдпрдВрддреНрд░рдХ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╡рд░реНрдЧ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдЙрд╕ рдЗрд╡реЗрдВрдЯреНрд╕ рдЦреБрдж рд╣реЛрддреЗ рд╣реИрдВред
class Controller { public: virtual bool OnLBttnDown(CellID cell, Point p) = 0; virtual bool OnLBttnUp(CellID cell, Point p) = 0; ... };
рд╕рд╛рде рд╣реА рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП, рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред GridCache рд╡рд░реНрдЧ рдореЗрдВ рдорд╛рдЙрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВред рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рд╕реЗрд▓ (CacheCell) рдЗрд╕рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдерд┐рдд рд╣реИред рдЕрдЧрд▓рд╛, рд╕рднреА рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдореЗрдВ, рдЬрд┐рд╕рдХреА рдЖрдпрдд рдореЗрдВ рдорд╛рдЙрд╕ рд╣рд┐рдЯ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд┐рдзрд┐ рд╕рд╣реА рд╣реИ - рджреГрд╢реНрдп рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЗрдВред рдпрд╣ рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рддреЗрдЬ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рдореЗрдВ рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред
рдпрд╣ рдореЙрдбрд▓ рд╡рд░реНрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдПрдбреЙрдкреНрдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп "рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ" рд░реВрдк рдореЗрдВ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ ViewText рд╣реИ рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд▓ рдореЗрдВ рдЗрд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдореЙрдбрд▓рдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдмрд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣рд╛рдБ ViewText рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
class ViewText: public View { public: ViewText(ModelText model): m_model(model) {} void Draw(DrawContext& dc, Rect rect, CellID cell) const override { const String& text = model->GetText(cell); dc.DrawText(text, rect); } private: ModelText m_model; };
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдореЙрдбрд▓рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХреМрди рд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
class ModelText: public Model { public: virtual const String& GetText(CellID cell) const = 0; virtual void SetText(CellID cell, const String& text) = 0; };
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдПрдХ рд╕реЗрдЯрд░ рдЬреЛрдбрд╝рд╛ рд╣реИ рддрд╛рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, ModelTextCallback рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
class ModelTextCallback: public ModelText { public: function<const String&(CellID)> getCallback; function<void(CellID, const String&)> setCallback; const String& GetText(CellID cell) const override { return getCallback(cell); } void SetText(CellID cell, const String& text) override { if (setCallback) setCallback(cell, text); } };
рдпрд╣ рдореЙрдбрд▓ рдЖрдкрдХреЛ рдЧреНрд░рд┐рдб рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рдВрдмреЛрджрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЦреИрд░, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдореЗрдВ рдХреНрдпрд╛ рдЖрдо рд╣реИ: рдореЙрдбрд▓рдЯреЗрдХреНрд╕реНрдЯ, рдореЙрдбрд▓рдЗрдВрдЯ, рдореЙрдбрд▓рдмреБрд▓ ...? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рднреА рдирд╣реАрдВ, рдЙрди рд╕рднреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рднреА рдЗрдЪреНрдЫреБрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЙрдбрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрдЧрд╛:
class Model { public: virtual ~Model() {} Event_t<void(Model)> changed; };
рдирддреАрдЬрддрди, рд╣рдорд╛рд░рд╛ рдЧреНрд░рд┐рдб рдХрдИ рдЫреЛрдЯреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЯреВрдЯ рдЧрдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдПрдХ рдУрд░, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд┐рдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЫреЛрдЯреА рдФрд░ рд╕рд░рд▓ рдмрди рдЧрдИрдВ, рдЬреЛ рдХреЛрдб рдХреА рд╕рдордЭ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рд░реЗрдВрдЬ, рд▓реЗрдЖрдЙрдЯ, рд╡реНрдпреВ, рдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдореЙрдбрд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдмрд╣реБрдд рд╣реА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред ModelCallback рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЛ рдлрдВрдХреНрд╢рдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рддреЗрдЬрд╝реА рд╕реЗ рдЧреНрд░рд┐рдб рдХреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓реЗ рдиреЛрдЯ рдореЗрдВ, рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдорд╛рдирдХ рдЧреНрд░рд┐рдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП: рдЪрдпрди, рдЫрдБрдЯрд╛рдИ, рд╕реНрддрдВрдн / рдкрдВрдХреНрддрд┐ рдЖрдХрд╛рд░, рдореБрджреНрд░рдг, рдХреИрд╕реЗ рдПрдХ рд╣реЗрдбрд░ (рдирд┐рд╢реНрдЪрд┐рдд рд╢реАрд░реНрд╖ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдмрд╛рдПрдБ рд╕реНрддрдВрдн) рдЬреЛрдбрд╝рдирд╛ред
рдореИрдВ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд░рд╣рд╕реНрдп рдмрддрд╛рдКрдВрдЧрд╛ - рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдЙрдкрд░реЛрдХреНрдд рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╛рдж рдЖрддреА рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдФрд░ рдореИрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред