我下载了源码觉得不错,于是我把HyperLink.cpp、HyperLink.h、ImageTabWnd.cpp、ImageTabWnd.h复制过来并做了一个,界面效果有了,但是不能切换,怎么回事?
源码下载地址:
http://www.yuanshengkj.com/bbs/topic.asp?topic_id=1798&forum_id=39
源码下载地址:
http://www.yuanshengkj.com/bbs/topic.asp?topic_id=1798&forum_id=39
模版代码中的问题:
mainFrame.h中:
CDemoDlgA m_wndDlgA;
CDemoDlgA m_wndDlgB;
改为:
CDemoDlgA m_wndDlgA;
CDemoDlgB m_wndDlgB;
你代码中也存在上述问题,另外还存在问题是:
在MainFrame.cpp::OnCreate中,将代码改为:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//////////////////////////////////////////////////////////////////////////
//创建Tab
if (!m_wndImageTab.Create(NULL, NULL, WS_CHILD|WS_VISIBLE,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -1;
} m_wndImageTab.SetBkImage(IDB_BITMAP_BACK);
m_wndImageTab.SetLeftImage(IDB_BITMAP_LEFTMARGIN);
m_wndImageTab.SetRightImage(IDB_BITMAP_RIGHTMARGIN);
m_wndImageTab.SetTopImage(IDB_BITMAP_TOPMARGIN);
m_wndImageTab.SetBottomImage(IDB_BITMAP_BOTTOMMARGIN); m_wndImageTab.SetTabCount(2); int nIndex = 0; m_wndImageTab.SetTabImage(nIndex, IDB_BITMAP_TAB1);
m_wndImageTab.SetTabRect(nIndex, CRect(0, 0, 32, 42));
m_wndImageTab.SetToolTip(nIndex, "演示对话A");
m_wndDlgA.Create(IDD_DIALOG1, &m_wndImageTab);
m_wndImageTab.SetTabWnd(nIndex, &m_wndDlgA);
nIndex++;
m_wndImageTab.SetTabImage(nIndex, IDB_BITMAP_TAB2);
m_wndImageTab.SetTabRect(nIndex, CRect(0, 52, 32, 94));
m_wndImageTab.SetToolTip(nIndex, "演示对话B");
m_wndDlgB.Create(IDD_DIALOG2, &m_wndImageTab);
m_wndImageTab.SetTabWnd(nIndex, &m_wndDlgB); CenterWindow(); return 0;
}
代码中存在的问题自己去找。下面是不能切换的原因:
在模版代码中,在APP类中:
BOOL CMessengerApp::InitInstance()
{
AfxEnableControlContainer(); // Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif // Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
// To create the main window, this code creates a new frame window
// object and then sets it as the application's main window object. CMainFrame* pFrame = new CMainFrame;
m_pMainWnd = pFrame; // create and load the frame with its resources pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
NULL);
// The one and only window has been initialized, so show and update it.
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow(); return TRUE;
}
没有做视图文档的关联,而你的代码中用的是文档视图关联。因此导致了鼠标点击事件由视图接收。
解决方法1:
按照模版程序该APP类。
解决方法2:
在视图中捕获鼠标点击事件:
void CAbView::OnLButtonDown(UINT nFlags, CPoint point)
{
::SendMessage(GetParent()->m_hWnd, WM_LBUTTONDOWN, (WPARAM)&nFlags, (LPARAM)&point); CView::OnLButtonDown(nFlags, point);
}
然后再MainFrame中接收鼠标点击事件,并将该事件发送给m_wndImageTab。
LRESULT CMainFrame::OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
::SendMessage(m_wndImageTab.m_hWnd, WM_LBUTTONDOWN, wParam, lParam);
return 0; //CFrameWnd::OnLButtonDown(nFlags, point);
}
在修改CImageTabWnd类中的OnLButtonDown未如下代码:
LPARAM CImageTabWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your message handler code here and/or call default
CPoint point = *(CPoint *)lParam;
for(int i=0; i<m_nTabCount; i++)
{
if (m_pRectTab[i].PtInRect(point) && m_nCurrentIndex != i)
{
m_nCurrentIndex = i;
ShowDialog();
Invalidate();
break;
}
}
//CWnd::OnLButtonDown(nFlags, point);
return 0;
}
OK,如此问题解决。
谢谢!!