自己做了个多文档MFC程序,想在某个位置点击一下按钮,然后把自己的内容显示到输出窗口里面。
下面这是我写的,一直不好使
#include "OutputWnd.h"
// CMainView 消息处理程序
void CMainView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
COutputWnd m_wndOutput;
m_wndOutput.m_wndOutputBuild.AddString(_T("还没调好啊,闹心啊"));
}
但是我看程序在刚启动的时候,自带的程序是好使的。
int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rectDummy;
rectDummy.SetRectEmpty();
// 创建选项卡窗口
if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1))
{
TRACE0("未能创建输出选项卡窗口\n");
return -1; // 未能创建
}
// 创建输出窗格
const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) ||
!m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3) ||
!m_wndOutputFind.Create(dwStyle, rectDummy, &m_wndTabs, 4))
{
TRACE0("未能创建输出窗口\n");
return -1; // 未能创建
}
UpdateFonts();
CString strTabName;
BOOL bNameValid;
// 将列表窗口附加到选项卡
bNameValid = strTabName.LoadString(IDS_BUILD_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0);
bNameValid = strTabName.LoadString(IDS_DEBUG_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1);
bNameValid = strTabName.LoadString(IDS_FIND_TAB);
ASSERT(bNameValid);
m_wndTabs.AddTab(&m_wndOutputFind, strTabName, (UINT)2);
// 使用一些虚拟文本填写输出选项卡(无需复杂数据)
FillBuildWindow();
FillDebugWindow();
FillFindWindow();
return 0;
}
我就奇怪了
尝试过如下方法,都失败了
https://bbs.csdn.net/topics/320241792
你们谁帮我看看问题出在哪里,谢过了。
COutputWnd 是一个独立的窗口吧,不是CMainView的子窗口,你在void CMainView::OnBnClickedButton1()中,实际上是新建了一个CoutputWnd实例,只是给这个临时窗口设置了属性,没有让他显示,需要调一下show函数或者onDialog() (很久没用MFC了,具体啥函数忘记了)。
另外,这样其实还是有问题的,真正的做法应该是:
(1)方法一:
COutputWnd和CMainView是平级的窗口,把COutputWnd实例作为一个全局变量(或者主窗口的子窗口来使用,保证整个工程中只有一个实例),然后在按钮响应函数中,给这个COutputWnd实例发消息(用sendMessage()或者postMessage()函数),COutputWnd实例响应这个消息即可。
sendmessage方法可以看一下下面的文章: