我用mfc做了几个程序,现在我想把这几个程序的功能集成在一起。就是想做一个sdi程序,把视图分为2部分,左边是一排按钮。点击其中一个右边出现相应的页面。(把几个功能放一个程序上)
像这样做的话,需要把视图继承自什么类呢。我原来的程序基本都是对话框程序和一个cformview视图
像这样做的话,需要把视图继承自什么类呢。我原来的程序基本都是对话框程序和一个cformview视图
解决方案 »
- 如何实现跨网段的通信,应该用什么技术呢?
- 请问((CReplaceView*) m_pParent)->GetWindowText(str);错在哪儿
- 关于glGetDoublev(GL_MODELVIEW_MATRIX
- 菜鸟提个难题,哪些函数依赖WNetAddConnection2,特别是能够提权那种.(思路||代码)
- 一个同时按键的问题(WM_KEYDOWN)相关,各位大侠帮忙看看。50分相送!
- 退出模式对话框后 不能清除里面定义的变量值.
- 中国优秀编程网站排行榜?希望大家踊跃发言
- 怎么使SliderCtrl控件响应mousedown的事件?
- c语言中怎样调用delphi开发的dll文件?没人懂吗?两周没人回答?
- 请问在2000下如何得到workgroup的名称?
- winsocket send失败,返回10054
- 老版QQ界面 不要带图标的
1.视图是CFormView,分成固定的2部分。
2.左边是一些按钮,点击任意一个按钮,右边显示相应的页面(对话框样式)
控制右边的对话框ShowWindow(SW_HIDE);或者ShowWindow(SW_SHOWNORMAL);
在创建了一个单文档的工程后,先添加类CSplitterWndEx,其基类为CSplitterWnd,在MainFrame引用了头文件后就添加一个CSplitterWndEX的成员变量: CSplitterWndEx m_wndSplitter; 然后在MainFrame的客户区创建事件的处理函数中添加分割的代码:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext)
{
CRect rect;
GetClientRect(rect);
if(!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
if (!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CLeftPaneView),CSize(rect.Width()/4,100),pContext))
return FALSE;
if (!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMainInterface),CSize(100,100),pContext))
return FALSE; return TRUE; }
可我编译就出现错误如下:
error C2653: 'CLeftPaneView' : is not a class or namespace name
F:\My\MainFrm.cpp(78) : error C2065: 'classCLeftPaneView' : undeclared identifier
F:\My\MainFrm.cpp(80) : error C2653: 'CMainInterface' : is not a class or namespace name
F:\My\MainFrm.cpp(80) : error C2065: 'classCMainInterface' : undeclared identifier
Error executing cl.exe.My.exe - 4 error(s), 0 warning(s)
这怎么解决啊
2.固定分隔条的办法是在重载的CSplitterWnd类里面,把OnMouseMove()事件的代码里面只添加
return;(即直接返回)就行了
用属性页或者树形控件呢?
CMainInterface是不是代表总的放置左右页面的页面啊。我也添加了这个类,使它与一个CFormView的对话框资源连接起来。
编译没错,运行有问题,说找不到文件。SwitchViewInSplitter 这个函数我找到了
是用于交换视图的对吗。
固定分隔条(不让别人拖动):锁定切分条的最简单的方法莫过于不让CSplitterWnd类来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是将这些消息交给CWnd窗口进行处理,从而屏蔽掉这些消息。现在我们打开CMySplitter类的头文件,我们手动的添加一些东西(为什么要手动呢?因为,我们选择的是Generic Class),好了,我们来看一下都加入了哪些代码:class CSplitterWndEx : public CSplitterWnd
{
public:
CSplitterWndEx();
virtual ~CSplitterWndEx();//以固定分隔条加入的代码DECLARE_DYNCREATE(CSplitterWndEx)
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()//以上是固定分隔条加入的代码
};我们仔细的看一下在DECLARE_DYNCREATE(CMySplitter)和DECLARE_MESSAGE_MAP()之间是消息处理的声明,告诉计算机,我们重载了这三个消息处理函数。现在我们在打开CSplitterWndEx类的.cpp文件,在构造函数CSplitterWndEx::CSplitterWndEx()上面加入如下代码:IMPLEMENT_DYNCREATE(CSplitterWndEx, CSplitterWnd)BEGIN_MESSAGE_MAP(CSplitterWndEx, CSplitterWnd)
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
在程序结尾添加下面的代码:void CSplitterWndEx::OnLButtonDown(UINT nFlags, CPoint point)
{
// 直接返回,不处理
return;
}BOOL CSplitterWndEx::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// 当光标进入分割窗口时,不允许改变样子,不处理
return FALSE;
}void CSplitterWndEx::OnMouseMove(UINT nFlags, CPoint point)
{ //将CSplitter类的处理改为由CWnd处理
//CSplitterWnd::OnMouseMove(nFlags, point);
CWnd::OnMouseMove(nFlags, point);
}好了,这样我们就实现了分隔条的固定。这一步是比较有难度的,因为我们要自己写一些消息处理代码。结果编译有错误,如下;
rror C2601: 'CreateObject' : local function definitions are illegal
F:\8\SplitterWndEx.cpp(21) : error C2601: '_GetBaseClass' : local function definitions are illegal
F:\8\SplitterWndEx.cpp(21) : error C2655: 'classCSplitterWndEx' : definition or redeclaration illegal in current scope
f:\8\splitterwndex.h(17) : see declaration of 'classCSplitterWndEx'
F:\8\SplitterWndEx.cpp(21) : error C2601: 'GetRuntimeClass' : local function definitions are illegal
F:\8\SplitterWndEx.cpp(23) : error C2601: '_GetBaseMessageMap' : local function definitions are illegal
F:\8\SplitterWndEx.cpp(23) : error C2601: 'GetMessageMap' : local function definitions are illegal
F:\8\SplitterWndEx.cpp(23) : error C2655: 'messageMap' : definition or redeclaration illegal in current scope
f:\8\splitterwndex.h(25) : see declaration of 'messageMap'
F:\8\SplitterWndEx.cpp(23) : error C2655: '_messageEntries' : definition or redeclaration illegal in current scope
f:\8\splitterwndex.h(25) : see declaration of '_messageEntries'
Generating Code...
Compiling...
8.cpp
Generating Code...
Skipping... (no relevant changes detected)
MainFrm.cpp
Error executing cl.exe.8.exe - 8 error(s), 0 warning(s)
不知道什么原因啊
IMPLEMENT_DYNCREATE(CSplitterWndEx, CSplitterWnd)
这两行代码去掉
rror C2601: '_GetBaseMessageMap' : local function definitions are illegal
E:\9\SplitterWndEx.cpp(22) : error C2601: 'GetMessageMap' : local function definitions are illegal
E:\9\SplitterWndEx.cpp(22) : error C2655: 'messageMap' : definition or redeclaration illegal in current scope
e:\9\splitterwndex.h(25) : see declaration of 'messageMap'
E:\9\SplitterWndEx.cpp(22) : error C2655: '_messageEntries' : definition or redeclaration illegal in current scope
e:\9\splitterwndex.h(25) : see declaration of '_messageEntries'
Error executing cl.exe. 9.exe - 4 error(s), 0 warning(s)