【问题标题】:Editing EDIT causes program crash编辑 EDIT 导致程序崩溃
【发布时间】:2012-09-05 21:34:19
【问题描述】:

我在编辑 EDIT 窗口时遇到问题(无论是通过写入还是向其发送文本)。 Here's my code.

几天前,我遇到了从新窗口中删除 MSG 处理循环的问题。 一切都会好起来的,但它引起了另一个问题。我无法编辑编辑窗口。 当该处理循环在新窗口中时,编辑工作,而不是它。

父窗口 - MainWindow
子窗口 - ChatWindow

关于 Winapi 的教程很少,所以有时我不得不使用我不完全理解的代码(比如 2 个 Wndproc 方法来处理窗口操作)

感谢您的宝贵时间

【问题讨论】:

  • 在我看来,您有点迷失了,无法在这里找到真正有帮助的答案。我会考虑从Programming Windows, 4th Edition(Charles Petzold 着)的副本开始。请注意,有较新的版本,但它们主要处理 .net,而不是 Windows API,因此它们可能不适合您想做的事情。
  • main 中的指针不是必需的,并且您的包含保护是保留标识符。那只是我看的2秒钟。另外,windowTitle = ss.str().c_str(); 也会给你带来麻烦。
  • @chris Ironic 然后真正的问题是 Sorontur 没有使用他应该使用的指针。

标签: c++ winapi crash


【解决方案1】:

好的,问题来了,这个

ChatWindow::ChatWindow()
{
    ...
    window = CreateWindowEx( WS_EX_CLIENTEDGE, 
        NazwaKlasy,windowTitle,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,DEFAULT_WIDTH , 
        DEFAULT_HEIGHT, NULL, NULL, hIns, this );
    ...

还有这个

okna.push_back(ChatWindow(dwSel,(char*)chBuffer));

ChatWindow 构造函数中存储this 指针(参见CreateWindowEx 的最后一个参数)。但是,当您保存 ChatWindow 对象时,您会在 okna 向量中保存 copy。所以传递给CreateWindowExChatWindow对象的地址和你vector中ChatWindow对象的地址是不一样的。

你应该有一个指针向量std::vector<ChatWindow*> okna;,而不是std::vector<ChatWindow> okna;。这应该可以解决问题。

您设计的基本问题是您的窗口对象不可复制,因为您告诉 Windows this 指针是什么。您应该添加一个私有复制构造函数和赋值运算符以防止您错误地复制它们,就像这样。

class NewWindow
{
private:
  NewWindow(const NewWindow&); // prevent copying
  NewWindow& operator=(const NewWindow&); // prevent copying
};

哦,我同意 Jerry 的说法,买一份 Petzold。

【讨论】:

  • 现在当我通过键入编辑它时它不会崩溃,但我不能按功能设置文本,所以它确实工作在 50%。编译器还警告我:“警告:获取临时地址”与 okna.push_back(&ChatWindow(dwSel,(char*)chBuffer));
  • okna.push_back(&ChatWindow(dwSel,(char*)chBuffer)); 并不比以前好。您必须使用新的okna.push_back(new ChatWindow(dwSel,(char*)chBuffer)); 进行分配,这样您的窗口对象就不会被破坏。我感觉你在学习 Windows 编程的同时也在学习 C++ 编程。
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2012-01-07
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多