[ Pobierz całość w formacie PDF ]
.DoModal();}// dynspvw.cpp : implementation of the CDynamicSplitView class//#include "stdafx.h"#include "dynsplit.h"ttinclude "dynspdoc.h" ttinclude "dynspvw.h"ttifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] +_FILE_;#endif/////////////////////////////////////////////////////////////////CDynamicSplitViewIMPLEMENT_DYNCREATE (CDynamicSplitView,CView)BEGIN_MESSAGE_MAP (CDynamicSplitView, CView) // { { AFX_MSG_MAP (CDynamicSplitView)// NOTÊ - the ClassWizard will add and remove // mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//} }AFX_MSG_MAP // Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView: :OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CYiew: :OnFilePrintPreview) ENDMESSAGEMAP ( )/////////////////////////////////////// CDynamicSplitView construction/destruction CDynamicSplitYiew: :CDynamicSplitView ( ){ // TODO: add construction code here}CDynamicSplitView: : -CDynamicSplitView (){}////////////////////////////////////////////////////////////////////// CDynamicSplitYiew drawingvoid CDynamicSplitYiew::OnDraw(CDC* pDC) {CDynamicSplitDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}//////////////////////////////////////////CDynamicSplitView printingBOOL CDynamicSplitView::OnPreparePrinting(CPrintlnfo*plnfo){// default preparationreturn DoPreparePrinting(plnfo);}void CDynamicSplitView::OnBeginPrinting(CDC*/*pDC*/,CPrintlnfo* /*plnfo*/) {// TODO: add extra initialization before printing}void CDynamicSplitView::OnEndPrinting(CDC*/*pDC*/,CPrintlnfo* /*plnfo*/) {// TODO: add cleanup after printing}/////////////////////////////////// CDynamicSplitView diagnostics#ifdef_DEBUGvoid CDynamicSplitView::AssertValid()const{CView::AssertValid();}void CDynamicSplitView::Dump(CDumpContext& dc) const {CView::Dump(dc;}CDynamicSplitDoc* CDynamicSplitYiew::GetDocument() // non-debugversion is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDynamicSplitDoc)));return (CDynamicSplitDoc*)m_pDocument; }#endif //DEBUGSubclassing okien potomnychAby przeprowadziæ subclassing egzemplarza okna, u¿ywaj¹c Windows API, musisz wywo³aæ funkcjê API setwindowLong () i podaæ jej uchwyt subklasowanego okna, indeks GWL_WNDPROC oraz wskaŸnik do procedury subklasuj¹cej.Funkcja SetwindowLong () zwraca wskaŸnik do oryginalnej procedury okna; mo¿esz go u¿yæ w celu przekazania komunikatów do oryginalnego przetworzenia.Procedura subklasuj¹ca musi nastêpnie u¿yæ funkcji callwindowProc () w celu wywo³ania oryginalnej procedury okna.Listing 20.3 przedstawia subklasing egzemplarza kontrolki pola edycji w oknie dialogowym.Subklasuj¹ca procedura okna umo¿liwia kontrolce otrzymywanie wszystkich komunikatów klawiatury, ³¹cznie z wciskaniem klawiszy Enter i Tab, jeœli tylko ta kontrolka znajduje siê w ognisku wprowadzania.Listing 20.3 przedstawia sposób przeprowadzenia subclassingu wy³¹cznie z u¿yciem Windows API.Listing 20.3.Procedura okna wykorzystuj¹ca do subclassingu jedynie Windows APIWNDPROC wpOrigEditProc;LRESULT APIENTRY EditBoxProc(HWND hwndDlg, UINT uMsg,WPARAM wParam, LPARAM1Param){HWND hwndEdit; switch(uMsg){case WM_INITDIALOG:// Pobiera uchwyt kontrolki pola edycji.hwndEdit = GetDlgltem(hwndDlg, ID_EDIT);// Subklasuje kontrolkê pola edycji.wpOrigEditProc = (WNDPROC) SetwindowLong(hwndEdit, GWL_WNDPROC, (LONG) EditSubclassProc);// Kontynuuje procedurê inicjalizacji.return TRUE;case WM_DESTROY:// Usuwa subclassing z kontrolki pola edycji.SetwindowLong(hwndEdit, GWL_WNDPROC, (LONG) wpOrigEditProc);// Kontynuuje procedurê czyszczeniabreak; } return FALSE;UNREFERENCED PARAMETER(IParam);}// Procedura subklasuj¹caLRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg,WPARAM wParam, LPARAM IParam){iffuMsg == WM_GETDLGCODE)return DLGC_WANTALLKEYS;return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, 1Param);}Subclassing okien z pomoc¹ MFCJak mo¿esz oczekiwaæ, MFC zapewnia ³atwiejszy sposób subclassingu okien wyprowadzonych z klasy cwnd.Zamiast wywo³ywaæ funkcjê SetWwindowLong (), mo¿esz po prostu wywo³aæ funkcjê sk³adow¹ SubclassWindowO.Tak jak w przypadku funkcji Setwin-dowLong () w metodzie korzystaj¹cej z API funkcjê SubclasswindowO wywo³ujesz w celu dynamicznego subclassingu okna i pod³¹czenia go do obiektu cwnd wywo³uj¹cego tê funkcjê sk³adow¹.Funkcji SubciassWindow () musisz przekazaæ uchwyt okna (HWND), które ma byæ subklasowane, a ta funkcja z kolei zwróci wartoœæ BOOL okreœlaj¹c¹, czy subclas-sing siê powiód³.Gdy dynamicznie subklasujesz okno, komunikaty Windows przechodz¹ przez mapê komunikatów obiektu cwnd i najpierw wywo³uj¹ funkcje obs³ugi w klasie CWnd.Komunikaty przekazane do klasy bazowej trafi¹ do domyœlnych funkcji obs³ugi w oknie.Po stronie subklasowanego okna funkcja sk³adowa Subclasswindow() ³¹czy okno lub kontrolkê Windows z obiektem cwnd i zastêpuje funkcje wndProc () oraz AfxWndProc () subklasowanego okna.Funkcja przechowuje star¹ funkcjê WndProc () w miejscu zwróconym przez funkcjê sk³adow¹ GetSuperWndProcAddr o.Musisz przes³oniæ funkcjê sk³adow¹ GetSuperWndProcAddr () dla ka¿dej osobnej klasy okna, aby móc przechowaæ stary wskaŸnik do funkcji WndProc (}.Istniej¹c¹ kontrolkê pola edycji w oknie dialogowym mo¿esz subklasowaæ za pomoc¹ kodu przedstawionego na listingu 20.4.Listing 20.4.U¿ycie MFC do subclassingu kontrolki istniej¹cego pola edycji___________BOOL CSubbedDlg::InlnitDialog(){.Inne funkcje inicjalizuj¹ce// Pobranie wskaŸnika do kontrolki pola edycjiCWnd *pEdit;pEdit = GetDlgltem(IDC_NIP);ASSERT(pEdit != NULL);// Niech kontrolka korzysta z systemowej czcionki o sta³ej// szerokoœci znaków, gdy¿ w przypadku liczb i znaku minus// wygl¹da to zdecydowanie lepiej
[ Pobierz całość w formacie PDF ]