Registro del mecanismo de interoperabilidad del marco MFC

Jaja, finalmente encontré una introducción en esta área hoy. Creo que muchos novatos en mfc sienten que mfc no es tan fácil de usar como winform, y no es tan directo como winform, y el mapeo de mensajes es demasiado complicado de dominar. Cuando lea esta introducción a la interoperabilidad, pensará que MFC es muy lindo e incluso se enamorará de su mecanismo de mapeo de mensajes. Por supuesto, primero debe comprender el significado de los punteros.
A partir de aquí escribir el contenido enlazado que
aquí se presenta es muy importante. ¡Gracias a el!

//这个是在view类窗口中添加鼠标移动事件消息,通过这个事件在状态栏显示鼠标的x,y
//同时将这个字符输出到mfc默认生成的输出窗口;
void CmfcktView::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CString str;
    str.Format("X=%d,Y=%d",point.x,point.y);//获取鼠标点的x,y
    //获取父框架指针并使用SetMessageText(str)设置状态栏的信息
    ((CFrameWnd*)GetParent())->SetMessageText(str); 

   //获取应用程序的CMainFrame* pMainFrame指针然后就在view类中操作了CMainFrame类中的内容,CMainFrame中有涵盖了许多框架窗口的成员,所以获得了操作这些类的权利,这样是不是好复杂又好灵活!mfc开始喜欢你了!
    CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); 
    pMainFrame->Addmesg(str);

    CView::OnMouseMove(nFlags, point);

}

Extraeré y comentaré aquí y lo extenderé, gracias al blogger original:
1. Obtenga el puntero de la aplicación
CMyApp * pApp = (CMyApp *) AfxGetApp ();

2. Obtener
la variable miembro pública m_pMainWnd en el puntero de marco principal CWinApp es el puntero del bastidor principal
CMainFrame * pMainFrame = (CMainFrame *) (AfxGetApp () -> m_pMainWnd);
o
CMainFrame * pMainFrame = (CMainFrame *) AfxGetMainWnd ();
// Después de obtener estos punteros, puede llamar a funciones en otra clase a través del mecanismo de mensajes en otras clases.
3. Obtenga el puntero de menú
CMenu * pMenu = AfxGetMainWnd () -> GetMenu ();

4, obteniendo una barra de herramientas, el puntero
de la barra de estado en el marco principal se puede usar directamente m_wndToolBar, m_wndStatusBar
Otro:

CToolBar * pToolBar = (CToolBar *) AfxGetMainWnd () -> GetDescendantWindow (AFX_IDW_TOOLBAR);
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd () -> GetDescendantWindow (AFX_IDW_STATUS_BAR);

5, el puntero obtiene el control
para usar GetDlgItem () y luego se convierte, como:

CButton * pButton = (CButton *) GetDlgItem (IDC_MYBUTTON);

6. Obtenga el documento y vea el puntero a través del marco.

SDI:
CMainFrame * pMainFrame = (CMainFrame *) AfxGetMainWnd ();
CYourDoc * pDoc = (CYourDoc *) pMainFrame-> GetActiveDocument ();
CYourView * pView = (CYourView *) pMainFrame-> GetActiveView ();

MDI:
CMainFrame * pMainFrame = (CMainFrame *) AfxGetMainWnd ();
CChildFrame * pChildFrame = (CChildFrame *) pMainFrame-> GetActiveFrame ();
CYourDoc * pDoc = (CYourDoc *) pChildFrame-> GetActiveDocument ();
CYourView * pView = (CYourView *) pChildFrame-> GetActiveView ();

7, documentos, vistas

Obtenga el puntero del documento de la vista:
CYourDoc * pDoc = GetDocument ();

Obtener el puntero de vista del documento:
Utilice las funciones miembro GetFirstViewPosition () y GetNextView () para recorrer la
POSICIÓN virtual GetFirstViewPosition () const;
CView virtual * GetNextView (POSITION & rPosition) const;

SDI:
CYourView * pView;
POSICIÓN pos = GetFirstViewPosition ();
pView = GetNextView (pos);

MDI:

Definir la función
CView * CYourDoc :: GetView (CRuntimeClass * pClass)

{

CView * pView;
POSICIÓN pos = GetFirstViewPosition ();
while (pos! = NULL)
{
pView = GetNextView (pos);
if (! pView-> IsKindOf (pClass))
break;
}
if (! pView-> IsKindOf (pClass))
{
AfxMessageBox ("Connt Localizar la vista.");
return NULL;
}
return pView;
}

Utilice de la siguiente manera:
CYourView * pView = (CYourView *) GetView (RUNTIME_CLASS (CYourView));

8. Plantillas de documentos, documentos

Obtenga el puntero de plantilla de documento del documento:
CDocTemplate * GetDocTemplate () const;

Obtenga el puntero del documento de la plantilla de documento:
viaual POSITION GetFirstDocPosition () const = 0;
visual CDocument * GetNextDoc (POSITION & rPos) const = 0;

9. Obtenga los punteros de cada vista en la vista dividida

Definido en el marco principal: CSplitterWnd m_wndSplitter;

Defina dos clases de vista: CView1, CView2

Sobrecarga en la clase de marco:
BOOL CMainFrame :: OnCreateClient (LPCREATESTRUCT, CCreateContext * pContext)
{
VERIFY (m_splitter.CreateStatic (this, 2,1)); // Dividir en dos filas y una columna
VERIFY (m_splitter.CreateView (0,0, RUNTIME_CLASS (CView1), CSize (100,100), pContext));
VERIFY (m_splitter.CreateView (1,0, RUNTIME_CLASS (CView2), CSize (100,100), pContext));
return TRUE;
}

Obtenga el puntero de vista dividida
CView1 * pView1 = (CView1 *) m_wndSplitter.GetPane (0,0);
CView2 * pView2 = (CView2 *) m_wndSplitter.GetPane (1,0);

10. Obtenga el puntero de la ventana secundaria con el mouse

* ChildWindowFromPoint el CWnd (el Punto de PUNTO) const;
el CWnd * ChildWindowFromPoint (el Punto de PUNTO, UINT nFlags) const;
una subventana contiene el punto especificado para determinar
si el punto especificado está fuera del área del cliente, la función devuelve NULL;
si el punto especificado en el área del cliente , Pero no pertenece a ninguna ventana secundaria, la función devuelve el puntero de CWnd;
si hay varias ventanas secundarias que contienen el punto especificado, devuelve el puntero de la primera ventana secundaria.
También tenga en cuenta que esta función devuelve un puntero de pseudoventana, que no se puede guardar para su uso posterior.
El segundo parámetro nFlags tiene varios significados:
CWP_ALL file: // No ignore ninguna ventana secundaria
CWP_SKIPNIVSIBLE file: // Ignore las ventanas secundarias invisibles
CWP_SKIPDISABLED file: // Ignore las ventanas secundarias prohibidas
CWP_SKIPRANSPARENT file: // Ignore las ventanas secundarias transparentes

Supongo que te gusta

Origin blog.csdn.net/sun19890716/article/details/51151541
Recomendado
Clasificación