关于程序中各类之间的值传递问题?

ndkk 2000-08-17 04:45:00
小弟对于VC繁杂的类应用实在头疼,望高人能用详例指教.特别是在一个类中使用其它类的值和函数.
另求教动态创建控件的问题,我照书上的例子使用Creat函数,总是显示不出.而我在使用DrawIcon函数时也显示不出.
...全文
297 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Holly 2000-08-21
  • 打赏
  • 举报
回复
收邮件!
ndkk 2000-08-19
  • 打赏
  • 举报
回复
小弟一时疏忽,概念尚清楚,用于实际中尚有距离.多谢指教,加分敬上.以后如有求教之处,还请多多指教.
ndkk 2000-08-19
  • 打赏
  • 举报
回复
1.啊呀!feelfree,错误一堆.
2.你误解了,错误是在m_Twist调用类公共函数时产生的.
feelfree 2000-08-19
  • 打赏
  • 举报
回复
hoho
我都看过来了,
1、CMyTempView* pView = (CMyTempView* pView)AfxGetMainWnd()->GetActiveView();加一个类型转换。
2、上面不是有pView->setpicture();
指针要用"-〉"运算符哦。"->setpicture();" == "(* p).setpicture();"
ndkk 2000-08-19
  • 打赏
  • 举报
回复
啊呀!Holly,又出错,不知为何,CMyTempView* pView = AfxGetMainWnd()->GetActiveView();此句有误,且最重要的问题还是没有解决,就是错误"left of '.SetPicture' must have class/struct/union type"望加分的分上,送佛送到西.
ndkk 2000-08-18
  • 打赏
  • 举报
回复
我在一个类的成员变量中定义了一个其他类的实例,在这个类的成员函数中使用这个类的实例通过"."访问其他类的公共函数,就会出错"left of '.SetPicture' must have class/struct/union type"SetPicture 是其他类的公共函数.
另我在创建控件时使用了WS_VISIBLE属性,似乎不是这个问题.望使用过动态创建的朋友能一详例荐之.
Holly 2000-08-18
  • 打赏
  • 举报
回复
如果必须采用你设计的调用流程的话,通常处理你的问题的方法是这样:
(以下方法只限于SDI的MFC程序)
void CMainFrame::On?????()
{
...;
((CMyTempApp*)AfxGetApp())->Show();
...;
}
void CMyTempApp::Show()
{
...;
CMyTempView* pView = AfxGetMainWnd()->GetActiveView();
if (pView)
{
pView->setpicture();
}
...;
}
至于静态函数和静态变量的具体细节你自己先看书吧!如果实在看不懂,再问!
Holly 2000-08-18
  • 打赏
  • 举报
回复
下次在讲静态的使用!
Holly 2000-08-18
  • 打赏
  • 举报
回复
1.我只能猜测你的做法,你在VC下的编程经验很少吧!
我估计你是这样调用的:
void CMainFrame::On?????()
{
...;
CMyTempApp::Show();
...;
}
void CMyTempApp::Show()
{
...;
CMyTempView::setpicture()
...;
}
如果你真的是这样调用的话,你还没有理解有关C++的静态成员函数、静态成员变量的原理和使用方法(建议你补补C++的课,好好找一本讲C++的书啃一下);
静态的成员函数(变量)意味着不需要实体的变量声明就可以使用的函数(变量);
编译器将静态的成员变量象全局变量一样处理使之在程序启动时就初始化了;而普通的成员变量必须要有类的实体变量声明,才可以使用;

Holly 2000-08-18
  • 打赏
  • 举报
回复
2.先解决你的控件问题,你没有发现你的控件使用都是局部变量吗?一旦函数执行完毕该控件就会被销毁,不复存在,你不是一直都这样用吧!,我提供的代码之所以在EDIT控件的变量前有”m_“主要是指明它是一个成员变量,使它在父窗口类的生命期内一直有效,你不知道"m_"的缺省含义吗?那么以后注意了,你可以找些讲匈牙利标记法的书看一下,这是C++程序员比较通用的命名方法;
ndkk 2000-08-18
  • 打赏
  • 举报
回复
望高手对我的设计方法提出更多的建议和批评
ndkk 2000-08-18
  • 打赏
  • 举报
回复
我只能大体说明一下程序,使用FormView类建立的单文档例程,加入了一个ActivX控件类,我原意是想测试一下此类在VC中的接口,VC自动在视类头文件里加入了对此类的头文件声明,并加入了我建的一个此类的成员变量m_Twist.
我在MainFram类里加入了对菜单事件的响应函数,调用主执行类中的公共成员函数,在这里调试时出现问题,大意是说公共成员函数要为静态,(我的调用方法是CMyTempApp::show())将函数改成静态通过.
接着,我在show()函数中调用视类里的公共函数setpicture(),(CMyTempView::setpicture())调试时问题同上,我用相同的方法解决.在setpicture()函数里使用m_Twist.SetPicture(),就出现了我以前所说的错误.
另,Holly,不幸的事又发生了.程序如下:
BOOL CMy7Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
...................
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here以上为自动生成
CEdit m_editResult;
DWORD dwStyle = WS_CHILD|WS_VISIBLE|ES_WANTRETURN|ES_READONLY|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL;
m_editResult.Create(dwStyle, CRect(0, 0, 100, 100), this, 102);


return TRUE;
}
void CMy7Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
............................
dc.DrawIcon(x, y, m_hIcon);
}
else //以上为自动生成
{CEdit m_editResult;
DWORD dwStyle = WS_CHILD|WS_VISIBLE|ES_WANTRETURN|ES_READONLY|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL;
m_editResult.Create(dwStyle, CRect(0, 0, 100, 100), this, 102);
CDialog::OnPaint();
}

int CMy7Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CEdit m_editResult;
DWORD dwStyle = WS_CHILD|WS_VISIBLE|ES_WANTRETURN|ES_READONLY|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL;
m_editResult.Create(dwStyle, CRect(0, 0, 100, 100), this, 102);
CDialog::OnPaint();
return 0;
}
U皮特U 2000-08-18
  • 打赏
  • 举报
回复
方便的话把你的程序发过来看看。
Holly 2000-08-18
  • 打赏
  • 举报
回复
1.如果你的变量名没有输入错误的话,请注意你是否采用了类的提前引用方法,如果是,请检查所有使用???.SetPicture(...)的函数的源文件是否都有include 声明的头文件,如若不行,你把工程发过来,我不信!
2.请注意我忘记改CRect的值使之有实际大小,我刚刚建立的例子有效!
DWORD dwStyle = WS_CHILD|WS_VISIBLE|ES_WANTRETURN|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL;
m_editResult.Create(dwStyle, CRect(0, 0, 100, 100), this, 102);
ndkk 2000-08-18
  • 打赏
  • 举报
回复
问题是已经包含了头文件,而且在编辑时对于所调用的函数是有参数提示的,不象是语法错误.
另不幸的是,Holly,我用你的代码加在新建的Dialog例程中的OnInitDialog()和OnPaint()里,结果和我原先的一样没有显示.
Holly 2000-08-18
  • 打赏
  • 举报
回复
1.显然是头文件的包含问题,编译器没有找到你的???.SetPicture(...)中???的声明原型,估计你是在使用该类的头文件中写了一句:class ???;但在使用该类的实例变量的Cpp文件中没有include 类的声明头文件;
2.我用过类似如下代码,没有问题不知你如何使用;
DWORD dwStyle = WS_CHILD|WS_VISIBLE|ES_WANTRETURN|ES_READONLY|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL;
m_editResult.Create(dwStyle, CRect(0, 0, 0, 0), this, 102);

dwStyle = WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP | WS_VSCROLL | WS_BORDER | LVS_ALIGNLEFT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING;
m_listSearch.Create(dwStyle, CRect(0, 0, 0, 0), this, 103);

dwStyle = WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP | CBS_AUTOHSCROLL | CBS_DROPDOWN | CBS_SORT | CBS_DISABLENOSCROLL;
m_comboInput.Create(dwStyle, CRect(0, 0, 0, 0), this, 104);
Holly 2000-08-17
  • 打赏
  • 举报
回复
1.你可以用友元的办法;
2.我见过的新手通常不知Create()时使用WS_VISIBLE属性;
liang2001 2000-08-17
  • 打赏
  • 举报
回复
1.若使用其他类的成员,可以在此类中定义其他类的一个变量,通过“."就可以访问其他类的公用成员了。
2.动态创建控件只要各个参数指定正确,应该不会有什么问题的。
U皮特U 2000-08-17
  • 打赏
  • 举报
回复
你的问题实在太广泛了一点,能否具体一点?比如你举一个你实际做过的例子中出现的问题,这样别人才好有针对性地回答。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧