我在MFC中的对话框中创建了一个视图。 我想从对话框中调用一个函数来查看。 如何在不同的视图中调用彼此的功能?
这是代码我也附加了link
void Cmfc_test5Dlg::OnDropFiles(HDROP hDropInfo)
{
int nFiles;
char szPathName[MAX_PATH];
CString strFileName;
nFiles = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH );
{
::DragQueryFile(hDropInfo, 0, szPathName, MAX_PATH);
}
::DragFinish(hDropInfo);
CDialog::OnDropFiles(hDropInfo);
DoDisplayImage(); <---Here is My call function.
CDialogEx::OnDropFiles(hDropInfo);
}
这是另一个功能
void CTestview::DoDisplayImage()
{
CDC *pDC = GetDC();
if (pDC != NULL && m_Image.isValid() )
{
CRect rectClient;
GetClientRect(rectClient);
pDC->FillSolidRect(rectClient,pDC->GetBkColor());
// Set up the Windows bitmap header
BITMAPINFOHEADER bmi;
bmi.biSize = sizeof(BITMAPINFOHEADER); // Size of structure
bmi.biWidth = m_Image.columns(); // Bitmaps width in pixels
bmi.biHeight = (-1)*m_Image.rows(); // Bitmaps height n pixels
bmi.biPlanes = 1; // Number of planes in the image
bmi.biBitCount = 32; // The number of bits per pixel
bmi.biCompression = BI_RGB; // The type of
...
和从这里调用的DoDisplayImage函数
void CTestview::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
DoDisplayImage();
}
但是,如你所知,我的问题是我无法在void Cmfc_test5Dlg :: OnDropFiles(HDROP hDropInfo)函数中调用DoDisplayImage()我也希望在DoDisplayImage中获取OnDropFiles函数的szPathName。
我应该怎样做才能解决这个问题?
我做以下时有错误。
1&gt; d:\ work \ mfc_test5 \ mfc_test5 \ Testview.h(29):错误C2143:语法错误:缺少';'在'*'之前 1&gt; d:\ work \ mfc_test5 \ mfc_test5 \ Testview.h(29):错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int 1&gt; d:\ work \ mfc_test5 \ mfc_test5 \ Testview.h(29):错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int 1 GT; 1&gt; Build FAILED。
在TestView.h中,
#pragma once
// CTestview view
class CTestview : public CScrollView
{
DECLARE_DYNCREATE(CTestview)
protected:
CTestview(); // protected constructor used by dynamic creation
virtual ~CTestview();
public:
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
DECLARE_MESSAGE_MAP()
public:
CTestView* pTestView; <---- is this right?
};
这是代码我也附加了link
我做了如下。
// mfc_test5Dlg.h : header file
//
#pragma once
#include "afxcmn.h"
// Cmfc_test5Dlg dialog
class CTestview;//adding
class Cmfc_test5Dlg : public CDialogEx
{
// Construction
public:
Cmfc_test5Dlg(CWnd* pParent = NULL); // standard constructor
CTestview* pTestView;//adding
// Dialog Data
enum { IDD = IDD_MFC_TEST5_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
Cmfc_test5Dlg::Cmfc_test5Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(Cmfc_test5Dlg::IDD, pParent)
, m_CString(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pTestView = NULL; //adding
}
但我无法理解这部分如何在我的案例中实现它。
You have to set pTestView each time the dialog is created. For example:
void CTestview::foo()
{
Cmfc_test5Dlg dlg(...);
dlg.pTestView = this;
dlg.DoModal();
}
答案 0 :(得分:2)
在MFC的文档/视图架构中,您不要从外部调用View方法。
通过更新内容并调用UpdateAllViews(),可能通过提示(用于优化)来获取View以绘制内容的方法是通过其Document实现。
答案 1 :(得分:0)
这是基本的c ++。你有A级和B级不相关。你怎么从B访问A?试试这个控制台程序:
class TA {
public:
void foo() {
cout << "TA\n";
}
};
class TB {
public:
TA *A;
TB() {
A = nullptr;
}
void foo() {
if (A)
A->foo();
}
};
int main()
{
TA *a = new TA;
TB *b = new TB;
b->A = a;
b->foo(); //prints "TA"
delete a;
delete b;
return 0;
}
在MFC中也是如此。您可以声明指向CTestView
的指针,并在对话框类中使用该指针:
class CTestview;
class Cmfc_test5Dlg : public CDialogEx
{
public:
CTestView* pTestView;
...
};
include "TestView.h"
Cmfc_test5Dlg::Cmfc_test5Dlg()
{
pTestView = NULL;
}
每次创建对话框时都必须设置pTestView
。例如:
void CTestview::foo()
{
Cmfc_test5Dlg dlg(...);
dlg.pTestView = this;
dlg.DoModal();
}
然后在pTestView->DoDisplayImage()
中的任意位置使用Cmfc_test5Dlg
。例如:
void Cmfc_test5Dlg::OnDropFiles(HDROP hDropInfo)
{
...
if (pTestView != NULL)
pTestView->DoDisplayImage();
}
另一种方法是使用全局变量:
CTestview *global_TestView;
CTestview::CTestview()
{
global_TestView = this;
...
}
//---- another cpp file:
extern CTestview *global_TestView;
...
void Cmfc_test5Dlg::OnDropFiles(HDROP hDropInfo)
{
...
if (global_TestView != NULL)
global_TestView->DoDisplayImage();
}
但是这种方法可能由于多种原因而失败。例如,如果可能有多个CTestview
。
ps,不要连续拨打CDialogEx::OnDropFiles(hDropInfo);
和CDialogEx::OnDropFiles(hDropInfo);
,这没有用。
答案 2 :(得分:0)
因此,只要在子对话框中删除文件,您就希望在视图中显示图像?
在对话框的构造函数中提供指向视图的指针作为附加参数,并将其存储在对话框成员变量m_view
中。然后叫它:
m_view->DoDisplayImage();