读书人

MFC中运用Tab控件导致子窗口消息映射失

发布时间: 2013-01-02 13:08:44 作者: rapoo

求救 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());

读书人网 >C++

热点推荐