CDialog中使用CView

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的时候注释了部分初始化的代码,导致鼠标左键事件处理函数中使用了未初始化的对象。

猜你喜欢

转载自blog.csdn.net/youyudexiaowangzi/article/details/83549190