MFC의 사용

1. 초반에 사용한 심플코드

프로그램에는 두 개의 코드 헤더 파일 mfc.h 및 mfc.cpp 파일이 포함되어 있습니다.

헤더 파일 mfc.h

#pragma once
#include<afxwin.h>

class MyApp:public CWinApp//CWinApp应用程序类
{
public:
    //程序入口
    virtual BOOL InitInstance();
};
class MyFrame : public CFrameWnd//继承窗口框架类a
{
public:
    MyFrame();
};


프로그램 파일 mfc.cpp

#define _CRT_SECURE_NO_WARNINGS

#include"mfc.h"

MyApp app;//全局应用程序对象
BOOL MyApp::InitInstance()
{
    //创建窗口对象
    MyFrame* frame = new MyFrame;
    //显示和更新
    frame->ShowWindow(SW_SHOWNORMAL);
    frame->UpdateWindow();
    
    m_pMainWnd = frame;//保存窗口的指针

    return TRUE;
}

MyFrame::MyFrame()
{
    Create(NULL, L"mfc");//创建窗口
}

코드 분석

mfc가 포함해야 하는 헤더 파일 afxwin.h

사용자 정의 클래스 MyApp은 cWinApp 애플리케이션 클래스를 상속하고 MyApp을 사용하여 애플리케이션 클래스 개체를 생성하며 이 개체에는 단 하나의

MyApp 클래스에 정의된 InitInstance 함수는 전체 애플리케이션의 진입점입니다.

사용자 지정 클래스 MyFrame은 프레임 클래스 CFrameWnd를 상속하고 이 클래스의 생성자를 사용하여 창을 만듭니다.

Create 함수 사용 Create(NULL, 타이틀명)

MyFrame을 사용하여 창 개체 만들기

ShowWindow 및 UpdateWindow 두 함수를 사용하여 표시 및 업데이트

참고 : 이 프로그램에서 컴파일할 때 오류가 발생합니다. 프로젝트 속성 -> 고급 -> MFC 사용 에서 공유 DLL의 MFC를 사용해야 합니다.

2. 메시지 매핑 메커니즘

메시지 맵 선언 및 경계 매크로

DECLARE_MESSAGE_MAP

메시지를 함수에 매핑하기 위해 클래스에서 메시지 맵을 사용할 것이라고 선언합니다(클래스 선언에서 사용해야 함).

BEGIN_MESSAGE_MAP

메시지 맵 정의 시작(클래스 구현에서 사용해야 함)

BEGIN_TEMPLATE_MESSAGE_MAP

단일 템플릿 매개변수를 포함하는 클래스 유형에서 메시지 맵 정의 시작

END_MESSAGE_MAP

종료 메시지 맵 정의(클래스 구현에 사용해야 함)

메시지 처리기용 매크로

지도 항목

함수 프로토타입

ON_WM_LBUTTONDBLCLK()

afx_msg 무효 OnLButtonDblClk (UINT, CPoint)

ON_WM_LBUTTONDOWN()

afx_msg 무효 OnLButtonDown (UINT, CPoint);

ON_WM_CHAR()

afx_msg 무효 OnChar (UINT, UINT, UINT);

더 많은 매핑 항목을 보려면 이 링크를 볼 수 있습니다.

https://learn.microsoft.com/zh-cn/cpp/mfc/reference/wm-message-handlers-ac?view=msvc-170

사용된 기능 코드

class MyFrame : public CFrameWnd//继承窗口框架类a
{
public:
    MyFrame();
    //声明宏 提供消息映射机制
    DECLARE_MESSAGE_MAP()

    afx_msg void OnLButtonDown(UINT, CPoint);//鼠标左键点击的函数原型       ON_WM_LBUTTONDOWN()
    afx_msg void OnChar(UINT, UINT, UINT);//键盘按下的函数原型   ON_WM_CHAR()
    afx_msg void OnPaint();//绘图的函数原型    ON_WM_PAINT()
};
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
    ON_WM_LBUTTONDOWN()//鼠标左键按下
    ON_WM_CHAR()//键盘点击
    ON_WM_PAINT()//绘图宏

//结束 消息映射机制
END_MESSAGE_MAP()

3. 각 기능 및 클래스 분석

1. mfc의 문자열

또한 mfc에는 독점 문자열 CString이 있습니다.CString은 CString 개체를 형식화하고 분석하는 많은 기능을 제공하는 클래스입니다.자세한 내용은 이 링크 https://learn.microsoft.com/zh-cn/cpp/mfc 를 참조하십시오.  / reference/cstring-formatting-and-message-box-display?view=msvc-170

사용된 코드

CString str;
str.Format(L"x = %d  y = %d", point.x, point.y);//格式化字符串
MessageBox(str);

4. 캐릭터셋

멀티바이트: 한 문자가 한 바이트에 해당함을 나타냅니다.

와이드 바이트: 한 문자가 여러 바이트에 해당함을 나타냅니다.

와이드 문자열 길이 통계:

//统计宽字符的字符串长度
    wchar_t p[10] = TEXT("aaa");
    int a = wcslen(p);

char*와 CString 간의 변환

    //char*与CString之间的转换
    //char*转CString
    char str[10] = "aaa";
    char* p1 = str;
    CString cstr = CString(p1);
    //CString 转 char*
    CStringA temp;
    temp = cstr;
    char* pp = temp.GetBuffer();

와이드 문자 비교:

C++에서 문자열 컨테이너의 작업은 strchar, strstr...과 같이 모두 str과 관련이 있습니다.

그러나 이것은 모두 ascll 문자열에 대한 것입니다.

넓은 문자열을 조작하려면 wcswcs 넓은 문자열 비교 함수 와 같이 str을 wcs로 바꾸십시오.

5. 대화 상자 사용

일부 컨트롤:

  1. 버튼 버튼: 다른 컨트롤을 바인딩하도록 이 버튼을 설정하면 클릭 시 컨트롤을 트리거할 수 있고 버튼을 두 번 클릭하면 코드가 자동으로 생성될 수 있습니다.

  1. 정적 텍스트 컨트롤: 이 컨트롤을 제어하려면 변수를 추가해야 합니다.변수를 추가하려면 STATIC으로 끝날 수 없는 ID를 수정해야 합니다.

  1. 편집 제어 컨트롤: 내용을 편집할 수 있는 컨트롤로, 속성에서 한 줄, 여러 줄, 엔터 수신, 스크롤바 등을 설정할 수 있습니다.

  1. Combo Box 컨트롤: 드롭다운 컨트롤로 속성에서 데이터 항목을 추가할 수 있습니다. ;를 사용하여 분할합니다. 기본 정렬이 FALSE로 변경되면 정렬되지 않습니다. 유형 유형이 드롭- 다운 목록에서는 내용을 변경할 수 없습니다.

  1. 목록 제어 제어: 목록 제어, 이 제어는 테이블을 설정할 수 있으며 속성의 보기는 형식을 수정할 수 있습니다.

  1. 트리 제어 제어: 트리 제어, 일부 스타일은 속성에서 설정할 수 있습니다.

일부 작업:

  • 바인딩을 위한 클래스를 추가하려면 대화 상자를 마우스 오른쪽 버튼으로 클릭하십시오.

  • 정적 컨트롤을 마우스 오른쪽 버튼으로 클릭하여 변수 추가

  • Edit Control 컨트롤에는 기본 버그가 있습니다.클래스 뷰에서 대화 상자 클래스를 찾은 다음 속성을 마우스 오른쪽 버튼으로 클릭하고 재정의를 찾고 OnOk 기능을 추가하고 내부 코드를 주석 처리하여 종료하지 않고 Enter 키를 눌러야 합니다. 대화 상자

일부 기능 :

xx.SetWindowTextW(string): 컨트롤 또는 버튼의 내용 설정

xx.GetWindowTextW(문자열 변수): 컨트롤 또는 버튼의 내용 가져오기

xx.EnableWindow(BOOL 값): 버튼 상태 설정

xx.OnOk(): 대화 상자 종료

xx.OnCancel(): 대화 상자 종료

UpdateData(BOOL): FALSE이면 변수 내용이 컨트롤에 동기화됨을 의미하고, TRUE이면 컨트롤 내용이 변수에 동기화됨을 의미합니다.

1. 모달 대화 상자

정의: 메인 윈도우에 서브 윈도우를 띄우고 서브 윈도우를 닫아야 메인 윈도우를 동작시킬 수 있다.이 서브 윈도우는 모달 대화상자이다.

코드 예제

//模态对话框按钮点击事件
void C模态对话框Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    DlgExec dlg;
    dlg.DoModal();//模态对话框弹出

}

2. 비모달 대화 상자

정의: 주 창에 하위 창이 열려 있고 하위 창을 닫지 않고 주 창을 제어할 수 있는 경우 하위 창은 비모달 대화 상자입니다.

코드 예제

//非模态对话框按钮点击事件
void C模态对话框Dlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    //CDlgShow dlg;
    //dlg.Create(IDD_SHOW);//非模态对话框创建
    dlg.ShowWindow(SW_SHOWNORMAL);//显示模态对话框
}

3. 그림을 추가하는 정적 텍스트(정적 텍스트) 컨트롤

고정 코드 스니펫:

 //设置静态控件窗口风格为位图居中显示
    n_pic.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);
    //通过路径获取bitmap句柄
#define HBMP(filepath, width, height) (HBITMAP)LoadImage(AfxGetInstanceHandle(), filepath, IMAGE_BITMAP, width, height, LR_LOADFR)
    //获取静态控件的大小
    CRect rect;
    n_pic.GetWindowRect(rect);
    //静态控件设置bitmap
    n_pic.SetBitmap(HBMP(TEXT("./1.webp"), rect.Width(), rect.Height()));

4.편집 컨트롤(편집 상자)

Edit Control 편집 상자 컨트롤에 변수를 추가할 때 추가된 변수의 유형을 컨트롤 또는 으로 설정할 수 있습니다 .

컨트롤로 설정한 경우 에디트 박스의 내용을 수정하기 위해서는 내부 함수를 호출해야 하며, 설정 유형이 값인 경우 등호를 사용하여 직접 내용을 설정할 수 있습니다 .

제어 유형 코드:

void CMy03EditTextDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码

    CString str;
    n_edit1.GetWindowTextW(str);//获取内容
    n_edit2.SetWindowTextW(str);//设置内容
}

값 유형 코드:

void CMy03EditTextDlg::OnBnClickedButton3()
{
    // TODO: 在此添加控件通知处理程序代码
    //利用关联value的方式 设置和改变edit的内容
    n_text1 = L"哈哈";
    UpdateData(FALSE);//将变量内容 同步到控件中
}

5. 콤보 상자(드롭다운 상자)

기능:

xx.AddString(string): 드롭다운 상자에 내용 추가

xx.SetCurSel(index): 드롭다운 상자의 기본 콘텐츠 설정

xx.InsertString(인덱스, 문자열): 드롭다운 상자에 콘텐츠 삽입, 인덱스는 삽입 위치를 나타냅니다.

xx.DeleteString(index): 드롭다운 상자의 콘텐츠를 삭제합니다. 인덱스는 삭제 위치를 나타냅니다.

xx.GetLBText(인덱스, 문자열): 드롭다운 상자의 콘텐츠 가져오기, 인덱스는 획득한 위치의 콘텐츠를 나타냅니다.

코드 예:

//添加下拉内容
    n_cbx.AddString(L"李白");
    n_cbx.AddString(L"韩信");
    n_cbx.AddString(L"马可");
    n_cbx.AddString(L"刘禅");

    n_cbx.SetCurSel(0);//设置下拉框的默认内容
    n_cbx.InsertString(4, L"妲己");//插入下拉列表中
    n_cbx.DeleteString(3);//删除指定的内容

    CString str;
    n_cbx.GetLBText(1, str);//获取下拉列表中的值
    MessageBox(str);

6.목록 제어(목록 제어)

사용된 함수:

1.xx.InsertColumn 함수: 보기 속성이 보고서 보고서 모드인 경우에만 헤더를 목록에 삽입, 함수 프로토타입

int InsertColumn(
    int nCol,
    const LVCOLUMN* pColumn);

int InsertColumn(
    int nCol,
    LPCTSTR lpszColumnHeading,
    int nFormat = LVCFMT_LEFT,
    int nWidth = -1,
    int nSubItem = -1);

매개 변수 1 nCol: 새 열의 인덱스

매개변수 2 pColumn: 새 열의 속성을 포함하는 LVCOLUMN 구조의 주소 매개변수 2 lpszColumnHeading: 열 헤더를 포함하는 문자열의 주소

매개변수 3 nFormat: 열 정렬을 지정하는 정수. 다음 값 중 하나일 수 있습니다: LVCFMT_LEFT, LVCFMT_RIGHT 또는 LVCFMT_CENTER

매개변수 4 nWidth: 열의 너비(픽셀 단위). 이 매개변수가 -1이면 열 너비 매개변수가 설정되지 않은 것입니다. 5 nSubItem: 해당 열과 관련된 하위 항목의 인덱스입니다. 이 매개 변수가 -1이면 열과 연결된 하위 키가 없습니다.

반환 값: 성공하면 다음 열의 인덱스 반환, 그렇지 않으면 -1 반환

2. xx.InsertItem 함수: 목록 보기 컨트롤에 항목 삽입, 4개의 오버로드, 함수 프로토타입이 있습니다.

int InsertItem(const LVITEM* pItem);

int InsertItem(
    int nItem,
    LPCTSTR lpszItem);

int InsertItem(
    int nItem,
    LPCTSTR lpszItem,
    int nImage);

int InsertItem(
    UINT nMask,
    int nItem,
    LPCTSTR lpszItem,
    UINT nState,
    UINT nStateMask,
    int nImage,
    LPARAM lParam);

매개변수 1 pItem: 지정된 항목 속성 의 LVITEM 구조 에 대한 포인터

Parameter 2 nItem : 삽입할 항목의 인덱스

매개변수 3 lpszItem: 항목 레이블이 포함된 문자열의 주소, 항목이 콜백 항목인 경우 LPSTR_TEXTCALLBACK

Parameter 4 nImage: 아이템 이미지 인덱스, 아이템이 콜백 아이템인 경우 I_IMAGECALLBACK

매개변수 5 nMask: 매개변수로 전달된 항목 속성이 유효한지 지정합니다.

Parameter 6 nState: 아이템의 상태, 상태 이미지, 오버레이 이미지를 나타냅니다.

매개변수 7 nStateMask: 상태 멤버의 어떤 비트를 검색하거나 수정할지 나타냅니다.

매개변수 8 lparam: 항목과 관련된 32비트(x64용으로 컴파일하는 경우 64비트) 애플리케이션별 값

3. xx.SetItemText 함수: 목록 보기 항목 또는 하위 항목의 텍스트 변경, 함수 프로토타입

BOOL SetItemText(
    int nItem,
    int nSubItem,
    LPCTSTR lpszText);

Parameter 1 nItem: 텍스트를 설정할 항목의 인덱스

매개변수 2 nSubItem: 하위 항목의 인덱스, 항목 레이블을 설정하려면 0

매개변수 3 lpszText: 새 항목의 텍스트를 포함하는 문자열에 대한 포인터

반환 값: 성공하면 0이 아닌 값, 그렇지 않으면 0

4. xx.SetExtendedStyle 함수: 목록 보기 컨트롤의 현재 확장 스타일 설정, 함수 프로토타입

DWORD SetExtendedStyle(DWORD dwNewStyle);

매개변수: 목록 보기 컨트롤에서 사용할 확장 스타일의 조합

반환 값: 목록 보기 컨트롤에서 사용하는 이전 확장 스타일의 조합

코드 예:

CString str[] = { L"姓名", L"性别", L"年龄" };
    for (int i = 0; i < 3; i++)
    {
        n_list.InsertColumn(i, str[i], LVCFMT_LEFT, 100);//给列表插入表头
    }
    n_list.InsertItem(0, L"张三");//插入正文,第一行插入
    n_list.SetItemText(0, 1, L"男");//在同一行插入第二列数据
    n_list.SetItemText(0, 2, L"23");//在同一行插入第三列数据
    //设置属性 整行选中状态  显示网格
    n_list.SetExtendedStyle(n_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

7.Tree Control(트리 컨트롤)

일부 기능:

1.xx.SetImageList 함수: 이 함수를 호출하여 트리 뷰 컨트롤의 일반 또는 상태 이미지 목록을 설정하고(즉, 아이콘 리소스를 트리 컨트롤에 바인딩) 새 이미지를 사용하여 컨트롤, 함수 프로토타입을 다시 그립니다.

CImageList* SetImageList(
    CImageList* pImageList,
    int nImageListType);

Parameter 1 pImageList: 할당할 이미지 목록 포인터. pImageList 가 NULL 이면 트리 보기 컨트롤에서 모든 이미지를 제거합니다.

매개변수 2 nImageListType: 검색할 이미지 목록의 유형, 값은 TVSIL_NORMAL 및 VSIL_STATE일 수 있습니다.

자세한 내용은 여기 ➡ https://learn.microsoft.com/zh-cn/cpp/mfc/reference/ctreectrl-class?view=msvc-170#setimagelist

2.xx.InsertItem 함수: 이 함수를 호출하여 트리 보기 컨트롤에 새 항목을 삽입합니다. 자세한 내용은 여기 ➡ https://learn.microsoft.com/zh-cn/cpp/mfc/reference/ctreectrl-class?view= msvc-170#insertitem

3.xx.SelectItem 기능: 이 기능을 호출하여 주어진 트리 보기 항목을 선택합니다. 자세한 내용은 여기 ➡

https://learn.microsoft.com/zh-cn/cpp/mfc/reference/ctreectrl-class?view=msvc-170#selectitem

코드 예:

//树控件使用
    //准备HICON图标
    HICON icons[2];
    icons[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
    icons[1] = AfxGetApp()->LoadIconW(IDI_ICON2);

    //1.设置图标
    //CImageList list;
    list.Create(30, 30, ILC_COLOR32, 2, 2);//创建图片集合
    for (int i = 0; i < 2; i++)
    {
        list.Add(icons[i]);//添加具体的图片
    }
    n_tree.SetImageList(&list, TVSIL_NORMAL);//
    //设置节点
    HTREEITEM root = n_tree.InsertItem(L"根节点", 0, 0, NULL);
    HTREEITEM parent = n_tree.InsertItem(L"父节点", 1, 1, root);
    HTREEITEM sub1 = n_tree.InsertItem(L"字节点1", 2, 2, parent);
    HTREEITEM sub2 = n_tree.InsertItem(L"子节点2", 3, 3, parent);

    //设置默认项
    n_tree.SelectItem(sub1);

6. 프로젝트의 문제점

프로젝트는 mfc 아래의 단일 문서를 기반으로 작성되었습니다.

1. mfc 프로젝트에 mfc 클래스 추가: 프로젝트를 마우스 오른쪽 버튼으로 클릭 -> 추가 -> 새 프로젝트 -> mfc 클래스 선택

CTreeView 기본 클래스는 헤더 파일 afxcview.h를 포함해야 합니다. 

2. 창 분할:

CSplitterWnd는  분할 창 클래스 m_splite의 개체를 만듭니다.

프레임워크에 대한 클라이언트 창을 생성하기 위해 OnCreateClient 함수를 다시 작성해야 하며, 이는 OnCreate 실행 중에 프레임워크에 의해 호출되고 자체 분할을 나타내기 위해 TRUE를 반환합니다. 이 함수에서 m_splite 객체창을 분할하는 함수 함수 프로토타입:

virtual BOOL OnCreateClient(
    LPCREATESTRUCT lpcs,
    CCreateContext* pContext);

m_splite.CreateStatic 함수: 창 분할, 함수 세부 정보 https://learn.microsoft.com/zh-cn/cpp/mfc/reference/csplitterwnd-class?view=msvc-170#createstatic

函数原型:
virtual BOOL CreateStatic(
    CWnd* pParentWnd,
    int nRows,
    int nCols,
    DWORD dwStyle = WS_CHILD | WS_VISIBLE,
    UINT nID = AFX_IDW_PANE_FIRST);

매개변수 1 pParantWnd: 스플리터 창의 상위 프레임 창

매개변수 2 nRows: 행 수. 이 값은 16을 초과할 수 없습니다.

매개변수 3 nCols: 열 수. 이 값은 16을 초과할 수 없습니다.

매개변수 4 dwStyle: 창 스타일을 지정합니다.

매개 변수 5 nID: 창의 자식 창 ID입니다. 분할자 창이 다른 분할자 창 내에 중첩되지 않는 한 ID는 AFX_IDW_PANE_FIRST일 수 있습니다.

m_splite.CreateView 기능: 분할 창 유형 지정, 기능 세부 정보 https://learn.microsoft.com/zh-cn/cpp/mfc/reference/csplitterwnd-class?view=msvc-170#createview

函数原型:
virtual BOOL CreateView(
    int row,
    int col,
    CRuntimeClass* pViewClass,
    SIZE sizeInit,
    CCreateContext* pContext);

매개변수 1 행: 새 뷰를 배치할 분할 창 행을 지정합니다.

매개변수 2 col: 새 보기가 배치될 분할 창 열을 지정합니다. 매개변수 3 pViewClass: 새 보기의 CRuntimeClass를 지정합니다.

매개변수 4 sizeInit: 새 보기의 초기 크기를 지정합니다. 매개변수 5 pContext: 보기를 만드는 데 사용되는 생성 컨텍스트에 대한 포인터(일반적으로 pContext는 부모 프레임의 대체된 CFrameWnd::OnCreateClient 멤버 함수로 전달됩니다. 여기서 분할 창은 생성 중 )

반환 값: 성공하면 0이 아님, 그렇지 않으면 0

코드 예:


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    // TODO: 在此添加专用代码和/或调用基类

    //return CFrameWnd::OnCreateClient(lpcs, pContext);//默认拆分
    
    //拆分成1行2列
    m_splite.CreateStatic(this, 1, 2);
    //左侧和右侧具体的显示内容
    m_splite.CreateView(0, 0, RUNTIME_CLASS(CSelectView), CSize(200, 500), pContext);
    m_splite.CreateView(0, 1, RUNTIME_CLASS(CDisplayView), CSize(600, 500), pContext);

    return TRUE;//表示自己拆分
}

3. 인터페이스 마운트

CCreateContext 구조체를 사용하며   , 기본 클래스가 없습니다.윈도우 생성시,

이 구조의 값은 문서 구성 요소를 데이터 보기에 연결하는 데 사용되는 정보를 제공합니다. 생성 프로세스의 일부를 재정의할 때만 CCreateContext를 사용하십시오.

CCreateContext 구조에는 문서, 프레임 창, 보기 및 문서 템플릿에 대한 포인터가 포함되어 있습니다. 또한 만들 뷰 유형을 식별하는 CRuntimeClass 에 대한 포인터도 포함합니다 . 런타임 클래스 정보 및 현재 문서 포인터는 새 보기를 동적으로 생성하는 데 사용됩니다.

사용된 멤버 함수:

CCreateContext 구조의 멤버 함수

기능

유형

사용

m_pNewViewClass

C런타임클래스*

생성할 새 보기의 CRuntimeClass

m_pCurrentFrame

CFrameWnd*

문서에서 두 번째 프레임 창 만들기와 같이 다른 프레임 창을 모델링하는 데 사용되는 프레임 창

m_pLastView

씨뷰*

분할 창 보기 만들기 또는 문서에서 두 번째 보기 만들기와 같은 다른 보기를 모델링하는 데 사용되는 원래 보기

CSplitterWnd 클래스의 함수

삭제보기

분할자 창에서 보기 제거

CreateView

분할자 창에서 창을 만들기 위해 호출됨

GetPane

지정된 행과 열에 대한 창을 반환합니다.

재계산 레이아웃

분할자 창을 다시 표시하기 위해 행 또는 열의 크기를 조정한 후 호출됩니다.

SetActivePane

창을 프레임의 활성 창으로 설정합니다.

다음 코드는 필요한 인터페이스를 마운트하는 것입니다.

        CCreateContext Context;

        Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg);
        Context.m_pCurrentFrame = this;
        Context.m_pLastView = (CFormView*)m_splite.GetPane(0, 1);
        m_splite.DeleteView(0, 1);
        m_splite.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context);
        CUserDlg* pNewView = (CUserDlg*)m_splite.GetPane(0, 1);
        m_splite.RecalcLayout();
        pNewView->OnInitialUpdate();
        m_splite.SetActivePane(0, 1);

4. 사용자 지정 함수 신호 보내기

        //PostMessage:将消息放入窗口的消息队列中,然后返回且不等待相应的窗口处理消息
        //需要包含框架类头文件#include "MainFrm.h" 
        //CWnd::PostMessage 将一个消息放入窗口的消息队列
        //AfxGetMainWnd():框架窗口对象的指针
        //AfxGetMainWnd()->GetSafeHwnd():获取返回窗口的句柄,CWnd::GetSafeHwnd
        //NM_A:发送自定义消息
        //(WPARAM)NM_A:指定了附加的消息信息
        //(LPARAM)0:指定了附加的消息信息,此参数这里没有意义
        ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);//把消息发出去

보낸 메시지는 CMainFrame 클래스의 사용자 지정 메시지 처리 기능으로 보내집니다.

추천

출처blog.csdn.net/weixin_62859191/article/details/128677096