MFC TabControl外掛 非對話方塊類中獲得主視窗和子視窗的指標

yynz發表於2020-11-28

前言

在非對話方塊類中無法使用如(CParentDlg*)或者(CChildDlg*)進行強制轉換。
所以一般通過一下來程式碼來實現通過獲取CParentDlg的指標進行操作:

CWnd* m_pParentDialog = AfxGetApp()->m_pMainWnd; //Get parent dialog pointer directly
CEdit* pEdit = (CEdit*)m_pParentDialog->GetDlgItem(/*Edit Item ID*/);
pEdit->SetWindowText(_T("Done"));

GetDlgItem();可以傳入子對話方塊的ID如下:

CEdit* pEdit = (CEdit*)m_pParentDialog->GetDlgItem(/*child dialog ID*/)->GetDlgItem(/*Edit Item ID*/);

但在Tab控制元件中無法使用,得到指標為空,所以我們通過設定全域性變數,再在相應對話方塊的初始化函式中給全域性變數賦值,從而儲存對話方塊的指標或控制程式碼。

一、構建標頭檔案和原始檔

前言

定義兩個對話方塊,主對話方塊:CParentDlg,子對話方塊CChildDlg。

1.構建標頭檔案CPublic.h並新增到專案中

CPublic.h中程式碼

#pragma once
#include "pch.h"

class CPublic
{
public:
	static HWND CPublic::m_hWndChlidDialog;
public:
	CPublic(void);
	~CPublic(void);
};

2.構建原始檔CPublic.cpp並新增到專案中

CPublic.cpp中程式碼

#include "pch.h"
#include "CPublic.h"


HWND CPublic::m_hWndChlidDialog= 0;

CPublic::CPublic(void)
{
}
CPublic::~CPublic(void)
{
}

二、儲存對話方塊指標

CChildDlg.cpp中程式碼:

BOOL CChildDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	//TODO:  在此新增額外的初始化
	
	CPublic::m_hWndChlidDialog= this->m_hWnd;
}

這裡我們就得到了CChildDlg的控制程式碼,並儲存在m_hWndChlidDialog中。

三、使用

在非對話方塊的類中

CWnd* m_pChildDialog = CWnd::FromHandle(CPublic::m_hWndChlidDialog);//convert handle of child dialog to pointer
CEdit* pEdit = (CEdit*)m_pChildDialog->GetDlgItem(/*Edit Item ID*/);
pEdit->SetWindowText(_T("Done"));

總結

原連結: MFC中主視窗為TAB的非對話方塊類中取得TAB下面子對話方塊的控制程式碼的操作辦法

相關文章