求救 MFC中运用Tab控件导致子窗口消息映射失败
我利用TAB控件 把几个对话框当子窗口 再用子窗口创建类 结果消息映射不到
在button1和button2的事件下断点不会断 写其他代码也不执行
// MyTabCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "Main.h"
#include "MyTabCtrl.h"
// CMyTabCtrl
IMPLEMENT_DYNAMIC(CMyTabCtrl, CTabCtrl)
// CMyTabCtrl 消息处理程序
BEGIN_MESSAGE_MAP(CMyTabCtrl, CTabCtrl)
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
void CMyTabCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_tabCurrent != GetCurFocus())
{
m_tabPages[m_tabCurrent]->ShowWindow(SW_HIDE);
m_tabCurrent=GetCurFocus();
m_tabPages[m_tabCurrent]->ShowWindow(SW_SHOW);
m_tabPages[m_tabCurrent]->SetFocus();
}
CTabCtrl::OnLButtonDown(nFlags, point);
}
void CMyTabCtrl::Init(PINT pDlgID, INT nPageCount)
{
m_nNumberOfPages = nPageCount;
m_tabPages = new CDialog *[m_nNumberOfPages];
for (int i=0; i<m_nNumberOfPages; ++i)
{
m_tabPages[i] = new CDialogEx;
}
if ( m_nNumberOfPages<= 0 )
{
return;
}
m_tabCurrent=0;
for (int i=0; i<m_nNumberOfPages; ++i)
{
m_tabPages[i]->Create(pDlgID[i], this);
if (i == 0)
{
m_tabPages[i]->ShowWindow(SW_SHOW);
}
else
{
m_tabPages[i]->ShowWindow(SW_HIDE);
}
}
SetRectangle();
}
void CMyTabCtrl::SetRectangle()
{
CRect r;
GetClientRect(&r);
m_tabPages[0]->SetWindowPos(&wndTop,r.left+5 ,r.top+20 ,r.right-10 ,r.bottom-25 ,SWP_SHOWWINDOW);
for(int nCount=1; nCount < m_nNumberOfPages; nCount++)
m_tabPages[nCount]->SetWindowPos(&wndTop,r.left+5 ,r.top+20 ,r.right-10 ,r.bottom-25 , SWP_HIDEWINDOW);
}
这是我的Tab.cpp
// Tab1Dlg.cpp : 实现文件
//
#include "stdafx.h"
#include "Main.h"
#include "Tab1Dlg.h"
#include "afxdialogex.h"
#include "MyFunction.hpp"
MyFuction myFuction;
// CTab1Dlg 对话框
IMPLEMENT_DYNAMIC(CTab1Dlg, CDialogEx)
CTab1Dlg::CTab1Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CTab1Dlg::IDD, pParent)
{
}
CTab1Dlg::~CTab1Dlg()
{
}
void CTab1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTab1Dlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &CTab1Dlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CTab1Dlg::OnBnClickedButton2)
END_MESSAGE_MAP()
// CTab1Dlg 消息处理程序
void CTab1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
}
void CTab1Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
}
这是我的子对话框的cpp
// MainDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "Main.h"
#include "MainDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMainDlg 对话框
CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMainDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TAB1, m_tab);
}
BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
// CMainDlg 消息处理程序
BOOL CMainDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO: 在此添加额外的初始化代码
m_explorer.CreateFromStatic(IDC_STATIC, this);
m_explorer.Navigate(_T("www.baidu.com"),0,0,0,0,0);
int nDlg[2] = {IDD_DIALOG1, IDD_DIALOG2};
m_tab.InsertItem(0, _T("TAB1"));
m_tab.InsertItem(1, _T("TAB2"));
m_tab.Init(nDlg, 2);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMainDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMainDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
这是我的主窗口的cpp
[解决办法]
m_tabPages[i]->Create(pDlgID[i], this);
改成下面试试看:
m_tabPages[i]->Create(pDlgID[i], GetParent());