★★★ 轻松取分,多文档界面上的几个小问题,请进! ★★★
问题1. 菜单上有两个子菜单ID_PlAY, ID_STOP,m_bPlay,m_bStop为控制他们的标记(子菜单能否起作用)
void MyFunction() // 全局函数
{
...
// 结束
// 这里怎么让
// m_bPlay = true;
// m_bStop = false; 系统收到这个消息?
}
void CMainFrame::OnPlay()
{
m_bPlay = false;
m_bStop = true;
MyFunction();
}
问题2. 在多文档中,每次我点击打开,我要同时打开两个子窗口,同时在这之前关闭已有的子窗体.
而且我要在程序中随时操作该两个子窗口,该怎么做?
问题3.在一个BUTTON1上面放置位图(bitmap,在DELPHI中很EASY),该怎么办?
分数不够,大家可以开口,谢谢大家!!!
问题点数:100、回复次数:25Top
1 楼USTCTony(Tony)回复于 2003-06-03 18:51:29 得分 5
3可以使用CButtonST.可以到google上去搜索一下。
Top
2 楼jenneyme(没有)回复于 2003-06-03 18:52:20 得分 5
问题1. 你在MAINFRAME里面对每个菜单的ID加入onUpdateCmdUI函数,这里面判断如果你的控制菜单ID的值为真或假的话的情况。
问题2. 没看懂。
问题3.你查一下CButton的类,里面有专门的函数吧Top
3 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-03 19:04:50 得分 0
关于问题2.
因为我要在多文档功能中作图,数据可以从文件调入. 每次调入二个文件,在两个子窗口显示,同时关闭(如果有的话)已经有的其他子窗口.
关键是如何在调入新的文件后,关闭调入文件前的子窗口(如果存在)Top
4 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-03 19:18:15 得分 0
问题1.我知道什么原因了,谢谢...Top
5 楼yg_xh(果皮)回复于 2003-06-03 19:34:49 得分 5
关于问题2
可以在打开文件时设置一个标志bool m_bOpen;
则可以在打开函数里这样写:
if(m_bOpen)
PostMessage()//发送一个文档关闭的消息,比如给VIEW发个WM_CLOSE
else
//正常的开启代码。
然后在文档关闭函数里,m_bOpen=false;Top
6 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-03 20:50:47 得分 0
关于问题2:
我想如此执行:
if(已经存在子子窗体)
先全部关闭;
// 新创建两个子窗体
SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0);// 子窗体1
SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0);// 子窗体2
void CFuzzyLogicView::OnDraw(CDC* pDC)
{
CFuzzyLogicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
////////////////
if(当前==子窗体1)
ShowFigure1();
if(当前==子窗体2)
ShowFigure2();
}
// 能否把我上面的话写成代码?
谢谢!!!Top
7 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-03 21:26:32 得分 0
关于问题3:
CButton* pButton;
pButton = (CButton*)GetDlgItem(IDOK); // 执行到这里错误
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
pButton->SetBitmap(bitmap);
//
为什么执行的时候有误?
该怎么写? 还有MSDN中的BS_LEFT 该写在哪里? 谢谢!
Top
8 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-03 21:47:58 得分 0
问题4: 存在 c:\test.txt
WinExec("notepad.exe c:\\test.txt",SW_SHOW); // 记事本打开,可以
WinExec("wordpad.exe c:\\test.txt",SW_SHOW); // 写字板打开,不行?
是参数不对,还是别的原因? 该如果打开?Top
9 楼alphapaopao(炮炮)回复于 2003-06-03 22:50:04 得分 5
:(
不擅长Top
10 楼ukyoking(累)回复于 2003-06-04 09:26:53 得分 0
gzTop
11 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-04 09:39:33 得分 0
请各位大侠帮忙看看:问题2->问题4,分数不够加...thanksTop
12 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-04 11:04:38 得分 0
问题4已经解决了,是写字板的路径不在系统路径的缘故....
剩余问题2,问题3....
大侠们,拉兄弟一把 :-)Top
13 楼hwonzor(闲人)回复于 2003-06-04 15:27:26 得分 0
问题2
关掉所有子窗体
void CMainFrame::CloseAllMDIWindows()
{
CFrameWnd* pWnd = GetActiveFrame();
while(pWnd!=this)
{
pWnd->SendMessage(WM_CLOSE);
pWnd = GetActiveFrame();
}
}
问题3
void CXXX::OnShowWindow(BOOL bShow, UINT nStatus)
{
CXXX::OnShowWindow(bShow, nStatus);
m_btm.LoadBitmap(IDB_BITMAP);//m_btm为CBitmap成员变量
m_btn.SetBitmap((HBITMAP)m_btm);//m_btn为CButton成员变量
m_btm.Detach();
}Top
14 楼hwonzor(闲人)回复于 2003-06-04 16:35:44 得分 0
忘了说明了,m_btn要有bitmap的styleTop
15 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-04 17:43:28 得分 0
hwonzor(闲人) :
你总是那么热心,呵呵... 问题2按照你的意思已经解决了,谢谢...
问题3 研究ing...
回头结帐...Top
16 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-06 15:30:50 得分 0
hwonzor(闲人) :
关于问题2,还有一点问题,就是:
BOOL g_bShowFigure1;
BOOL g_bShowFigure2;
CloseAllMDIWindows(); // 如果已经存在子窗体,先关闭
SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0); // 子窗体1
SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0); // 子窗体2
对于窗体1,2我将调用不同的自定义作图函数如ShowFigure1();ShowFigure2();
那么我如果在下面说明
void CFuzzyLogicView::OnDraw(CDC* pDC)
{
...
if(g_bShowFigure1)
{
// 怎么让ShowFigure1();在子窗体1中显示?
}
if(g_bShowFigure2)
{
// 怎么让ShowFigure2();在子窗体2中显示?
}
}
Top
17 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-06 15:35:43 得分 0
补充说明:ShowFigure1();ShowFigure2();具体是什么这里不用考虑,你理解成由它们产生的图形,是不断地在变化,就可以了.Top
18 楼hwonzor(闲人)回复于 2003-06-06 16:16:58 得分 50
推荐不采用全局变量
假设我的工程为MdiTest2
1.首先在CMdiTest2Doc加入2个成员变量并初始化为false。
public:
BOOL m_bShowFigure1;
BOOL m_bShowFigure2;
2.修改以下
CloseAllMDIWindows();
SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0); // 子窗体1
SendMessage(WM_COMMAND,(WPARAM)ID_FILE_NEW,0); // 子窗体2
CMdiTest2App * pApp = (CMdiTest2App*)AfxGetApp();
POSITION pos = pApp->GetFirstDocTemplatePosition();
ASSERT(pos);
CDocTemplate * pDocTemplate = pApp->GetNextDocTemplate(pos);
pos = pDocTemplate->GetFirstDocPosition();
ASSERT(pos);
CMdiTest2Doc * pDoc1;
CMdiTest2Doc * pDoc2;
pDoc1 = (CMdiTest2Doc *)pDocTemplate->GetNextDoc(pos);
pDoc1->m_bShowFigure1 = TRUE;
ASSERT(pos);
pDoc2 = (CMdiTest2Doc *)pDocTemplate->GetNextDoc(pos);
pDoc2->m_bShowFigure2 = TRUE;
3.修改void CMdiTest2View::OnDraw(CDC* pDC)
{
CMdiTest2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (pDoc->m_bShowFigure1)
ShowFigure1();
if (pDoc->m_bShowFigure2)
ShowFigure2();
}Top
19 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-06 16:44:59 得分 0
闲人:
谢谢你的代码,你的热心让我无法不感动...我先加入它到我的程序中调试一下... 再次谢谢!Top
20 楼zzyx(菜农)回复于 2003-06-06 17:20:58 得分 30
问题3,闲人提供了比较好的解决方案
你的代码:
CButton* pButton;
pButton = (CButton*)GetDlgItem(IDOK); // 执行到这里错误
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
pButton->SetBitmap(bitmap);
问题有两个:
1. bitmap是个局部变量,函数执行完毕之后会被释放,结果是位图不能显示。解决办法是把它定义为类的成员变量,在初始化或其他合适的时候,进行LoadBitmap(只进行一次)。
2. 在SetBitmap前,需要设置BS_BITMAP。
pButton->SetButtonStyle ( BS_BITMAP,true);
你提到的BS_LEFT也这样设置即可
至于你的运行出错,按说不应该,除非你根本就没有IDOK这个资源按钮。但俺测
试发现,对于IDOK似乎不管用。
俺的测试代码:
OnInitDialog
{
bRet=m_bitmap.LoadBitmap(IDB_BITMAP1);
}
void CDlgWordDlg::OnBtnBmp()
{
CButton* pButton;
pButton = (CButton*)GetDlgItem(IDC_BTN_TEST);
pButton->SetButtonStyle ( BS_BITMAP,true);
pButton->SetBitmap(m_bitmap);
}
Top
21 楼Waitan(大雾)回复于 2003-06-06 17:27:37 得分 0
闲人终于写对了。
我着急啊!Top
22 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-06 18:02:38 得分 0
闲人:
你调试的第2部分是写在哪里的?
void CMainFrame::OnFlsDataload()
{
// 我写在这里
}
其余的都安装你的意思写的,好像两个子窗口都显示同样的内容.
你定义的 CMdiTest2Doc * pDoc1;
CMdiTest2Doc * pDoc2;
(我定义在上面的函数体里,全局也试过)会一直影响着Draw()?Top
23 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-06 18:27:42 得分 0
闲人:
呵呵,你写的对的,是我没有对两个标记做初始化!太感谢了.
菜农:
好久不见,又看到你可爱的代码了,谢谢...
Top
24 楼unrise(进了这条船,就下不来了 ^-^)回复于 2003-06-06 20:34:08 得分 0
to:闲人 again
由于我自定义的两个函数ShowFigure1();ShowFigure2();是动态变化了.因此,你写的代码存在更新上的不足:
以你pDoc1,pDoc2的先后次序,pDoc2->m_bShowFigure2所对应的函数,总是动态更新(我就是需要这样),
但是pDoc1->m_bShowFigure1 所对应的函数,在作图时,总是需要先点击pDoc2对应的子窗体,再回头点击pDoc1对应的子窗体,它才会更新一次!
有什么方法改进吗?
再次谢谢...
Top
25 楼hwonzor(闲人)回复于 2003-06-07 11:04:52 得分 0
unrise(小超) :
你所说的问题不存在吧!如果你是用定时器来控制视图的刷新的,即使pDoc1对应的子窗体没有处在激活状态,它的视图仍然在更新啊。Top



