resource中看不到view相关的控件,所以只能自己动态创建,看到网上的例子,照着写了,结果动不动就崩溃,好不容易调好了
h文件
#pragma once
#include <afxwin.h>
class HQ_ScrollView :
public CView
{
DECLARE_DYNCREATE(HQ_ScrollView)//这个重要,但是DECLARE_DYNCREATE千万不要写成了DECLARE_DYNAMIC
public:
HQ_ScrollView();
~HQ_ScrollView();
private:
void OnDraw(CDC *);//不重要
};
cpp文件
#include "HQ_ScrollView.h"
IMPLEMENT_DYNCREATE(HQ_ScrollView, CView)//重要,千万不要写成了IMPLEMENT_DYNAMIC
HQ_ScrollView::HQ_ScrollView()
:CView()
{
}
HQ_ScrollView::~HQ_ScrollView()
{
}
VOID HQ_ScrollView::OnDraw(CDC* pDC)
{
//CScrollView::OnInitialUpdate();
}
调用
再dialog的cpp文件中的onInitDialog中
HQ_ScrollView*a = new HQ_ScrollView();
a->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rectWndClient, this, 0x4040, NULL);
a->OnInitialUpdate();
或者
CRect rectWndClient;
GetClientRect(&rectWndClient);
CRuntimeClass *pViewRuntimeClass = RUNTIME_CLASS(CMyScrollView);
HQ_ScrollView *pView = (HQ_ScrollView *)pViewRuntimeClass->CreateObject();
//HQ_ScrollView *pView = new HQ_ScrollView();
pView->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rectWndClient, this, 0x4040, NULL);
pView->OnInitialUpdate();
注释掉pView->OnInitialUpdate();好像也没出什么问题
CView中添加控件
m_pictureBox.Create(_T(""), WS_CHILD | WS_VISIBLE | SS_GRAYRECT,
CRect(0, 0, 120, 90), m_pView, ++maxControlID);
也就是控件设置CView为父窗口就可以了
自己的失误;
一开始用VS2017闯进一个继承与CView的类,类里面只是生成了继承关系、构造函数、析构函数。没有任何其他帮助代码。所以仿照CDialog的子类写了DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC。死活创建不出来,createobject返回null,一直返回null,用msdn的例子CPerson,一样一直返回null。https://msdn.microsoft.com/zh-cn/library/47ecfxkh(v=vs.120).aspx。不小心看到DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE才得以解决。返回有效数据
鼠标左键单击,界面崩溃了,以为是网上说的在SDI(单文档)程序中的对话框中使用CView的错误,写了如下代码
void videoDialog::createScrollView()
{
CRect rectWndClient;
GetClientRect(&rectWndClient);
rectWndClient.right = 190;
CFrameWnd *pFrame = new CFrameWnd();
pFrame->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rectWndClient, this);
CRuntimeClass *pViewClass = RUNTIME_CLASS(HQ_ScrollView);
HQ_ScrollView *pView = (HQ_ScrollView*)pViewClass->CreateObject();
pView->Create(NULL, NULL, WS_VISIBLE | WS_CHILD,
rectWndClient,
pFrame, 0x804);
pView->OnInitialUpdate();
}
依然崩溃。原来是调试CView的时候注释了部分初始化的代码,导致鼠标左键事件处理函数中使用了未初始化的对象。