Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Microsoft Visual C++ ΠΈ MFC. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Windows 95 ΠΈ Windows NT. Π§Π°ΡΡ‚ΡŒ 2Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 9

Автор АлСксандр Π€Ρ€ΠΎΠ»ΠΎΠ²

void CMultiDoc::DeleteContents() {

 // ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, удаляя всС элСмСнты массива arrayFig.

 pointFigCenter.RemoveAll( );


 // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ DeleteContents Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CDocument

 CDocument::DeleteContents();

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ создан ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° экранС, остаСтся Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ ΠΌΠΎΠ³Π»ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² Ρ„Π°ΠΉΠ»Π΅ Π½Π° дискС ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ². Для этого ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Serialize класса Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Π¨Π°Π±Π»ΠΎΠ½ для этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:

//////////////////////////////////////////////////////////////

// CMultiDoc serialization

void CMultiDoc::Serialize(CArchive& ar) {

 pointFigCenter.Serialize(ar);

}

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ запуститС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ». Π£ вас получился настоящий ΠΌΠ½ΠΎΠ³ΠΎΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ графичСский Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ нСсколько ΠΎΠΊΠΎΠ½ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π½Π° дискС ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запускС прилоТСния.

Бинхронизация ΠΎΠΊΠΎΠ½ просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠ½ΠΎΠ³ΠΎΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ прилоТСния ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° нСсколько ΠΎΠΊΠΎΠ½ просмотра. НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ составляСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для просмотра ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· мСню Window строку New.

ΠžΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΠΊΠΎΠ½ просмотра ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ числовой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π°. На рисункС 1.14 ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Multi, Ссли Π² Π½Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Multi1 ΠΈ Multi2, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠ½Π° для просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Multi2.

Рис. 1.14. Окно Project Workspace, класс CMultiView


К соТалСнию, ΠΎΠΊΠ½Π° просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° нСсогласованны. Если Π²Ρ‹ внСсСтС Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ измСнСния Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½ΠΎ ΠΎΠΊΠ½ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ появятся Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° содСрТимоС ΠΎΠΊΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ пСрСрисовано. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ рассогласования ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΊΠ½Π°ΠΌΠΈ просмотра ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сразу послС измСнСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ UpdateAllViews, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² классС CDocument:

void UpdateAllViews(CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL);

ΠœΠ΅Ρ‚ΠΎΠ΄ UpdateAllViews Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ CView::OnUpdate для всСх ΠΎΠΊΠΎΠ½ просмотра Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΊΠ½Π° просмотра, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ pSender. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² качСствС pSender ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° просмотра Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚. Π•Π³ΠΎ состояниС ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ послСдниС измСнСния Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅.

Если ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹Π·Π²Π°Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ, Π½Π΅ связанными с ΠΎΠΊΠ½Π°ΠΌΠΈ просмотра, Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° pSender ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL. Π’ этом случаС Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ OnUpdate всСх ΠΎΠΊΠΎΠ½ просмотра Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ lHint ΠΈ pHint ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ OnUpdate ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ значСния lHint ΠΈ pHint ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ пСрСрисовку Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

ΠœΡ‹ измСняСм Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ OnLButtonDown. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ² UpdateAllViews Π² Π½Π΅ΠΌ. РазмСститС Π΅Π³ΠΎ послС добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² массив pointFigCenter ΠΈ установки Ρ„Π»Π°Π³Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° (ΠΌΠ΅Ρ‚ΠΎΠ΄ UpdateAllViews слСдуСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ послС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° SetModifiedFlag):

void CMultiView::OnLButtonDown(UINT nFlags, CPoint point) {

 // …


 // УстанавливаСм Ρ„Π»Π°Π³ измСнСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

 pDoc->SetModifiedFlag();


 // Π‘ΠΎΠΎΠ±Ρ‰Π°Π΅ΠΌ всСм ΠΎΠΊΠ½Π°ΠΌ просмотра ΠΊΡ€ΠΎΠΌΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±

 // ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

 pDoc->UpdateAllViews(this);


 // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnLButtonDown Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CView

 CView::OnLButtonDown(nFlags, point);

}

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС ΠΎΠΊΠ½Π° просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° синхронизированы. Когда Π²Ρ‹ мСняСтС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅, автоматичСски происходит измСнСния Π²ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠ½Π°Ρ… просмотра.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° содСрТимоС Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΊΠΎΠ½ просмотра пСрСрисовываСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π΄ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ. ΠŸΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²ΠΊΠ° всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния, особСнно Π½Π° слабых ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ….

Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· этого полоТСния сущСствуСт. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° UpdateAllViews ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π°Π΄ΠΎ Π΄ΠΎΡ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. А ΠΏΠΎΡ‚ΠΎΠΌ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnUpdate Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ дорисовывало Π² ΠΎΠΊΠ½Π°Ρ… просмотра ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ. Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° UpdateAllViews ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ OnUpdate ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ lHint ΠΈ pHint.

Рассмотрим Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnUpdate:

virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pSender содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ΠΎΠΊΠ½Π° просмотра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Если ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ всС ΠΎΠΊΠ½Π° просмотра, этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ – lHint ΠΈ pHint содСрТат Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ. ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²ΠΎ врСмя Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° UpdateAllViews. Если Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚ΠΎΠ³Π΄Π° эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ содСрТат значСния 0L ΠΈ NULL соотвСтствСнно.

ΠœΠ΅Ρ‚ΠΎΠ΄ OnUpdate вызываСтся, ΠΊΠΎΠ³Π΄Π° послС измСнСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ CDocument::UpdateAllViews. ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ OnInitialUpdate (Ссли Π²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnInitialUpdate).

РСализация OnUpdate ΠΈΠ· класса CView, опрСдСляСт, Ρ‡Ρ‚ΠΎ вся внутрСнняя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° просмотра ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ обновлСнию ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ сообщСниС WM_PAINT (для этого вызываСтся функция InvalidateRect). Π­Ρ‚ΠΎ сообщСниС обрабатываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ OnDraw.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lHint ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ LPARAM ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ любоС 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ нашСм случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ индСкс элСмСнта массива Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pHint являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° CObject. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнный класс, наслСдованный ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CObject, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого класса ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ UpdateAllViews.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, наслСдованного ΠΎΡ‚ CObject, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса CObject, поэтому такая опСрация Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Π΅Ρ€Π΅Π· этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², наслСдованных ΠΎΡ‚ CObject.

Когда Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnUpdate, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pHint. Для этого ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ IsKindOf класса CObject. ΠœΠ΅Ρ‚ΠΎΠ΄ IsKindOf позволяСт ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡƒΠΆΠ΅ Π½Π° этапС выполнСния прилоТСния.

Π’ нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния WM_LBUTTONDOWN ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ OnLButtonDown класса ΠΎΠΊΠ½Π° просмотра. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС измСнСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ UpdateAllViews ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π» ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΠ½Π°ΠΌ просмотра индСкс Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта Π² массивС pointFigCenter Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°:

//////////////////////////////////////////////////////////////

// ΠœΠ΅Ρ‚ΠΎΠ΄ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния WM_LBUTTONDOWN

void CMultiView::OnLButtonDown(UINT nFlags, CPoint point) {

 // …

 // ДобавляСм ΠΊ массиву, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΌΡƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π½ΠΎΠ²Ρ‹ΠΉ

 // элСмСнт

 pDoc->pointFigCenter.Add(point);


 // УстанавливаСм Ρ„Π»Π°Π³ измСнСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

 pDoc->SetModifiedFlag();


 // ЗаписываСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ nNewFig индСкс послСднСго

 // элСмСнта массива pointFigCenter

 int nNewFig;

 nNewFig = pDoc->pointFigCenter.GetUpperBound();


 // Π‘ΠΎΠΎΠ±Ρ‰Π°Π΅ΠΌ всСм ΠΎΠΊΠ½Π°ΠΌ просмотра ΠΊΡ€ΠΎΠΌΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±

 // ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, указывая индСкс Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта

 // массива, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

 pDoc->UpdateAllViews(this, nNewFig);


 // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnLButtonDown Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CView

 CView::OnLButtonDown(nFlags, point);

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnUpdate Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ UpdateAllViews ΠΎΠ½ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π» Π½Π° экранС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдний элСмСнт массива pointFigCenter.

Для пСрСопрСдСлСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° OnUpdate Π»ΡƒΡ‡ΡˆΠ΅ всСго Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ срСдствами ClassWizard. ClassWizard создаст шаблон ΠΌΠ΅Ρ‚ΠΎΠ΄Π° OnUpdate, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для отобраТСния Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π² ΠΎΠΊΠ½Π΅ просмотра.

Когда Π²Ρ‹ пСрСопрСдСляСтС ΠΌΠ΅Ρ‚ΠΎΠ΄ OnUpdate, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ UpdateAllViews. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½, Ссли Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ всС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠΊΠ½Π΅ просмотра. Π’ этом случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lHint содСрТит 0, Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pHint – NULL Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ InvalidateRect ΠΈ обновляя всС ΠΎΠΊΠ½ΠΎ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ:

//////////////////////////////////////////////////////////////

// CMultiView

void CMultiView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) {

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, относящийся ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ

 // ΠΎΠΊΠ½Ρƒ просмотра

 CMultiDoc* pDoc = GetDocument();

 ASSERT_VALID(pDoc);


 // Если lHint Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, выполняСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ