C++/CLR c++底层代码操作上层ui

我是菜鸟999 2017-04-13 05:02:25

public ref class MainForm : public System::Windows::Forms::Form
{
public:
MainForm(CNetWorkImpl* m_Impl_)
{
InitializeComponent();

comboBoxEx1->SelectedIndex = 0;
comboBoxEx2->SelectedIndex = 0;
textBoxX_CodeSignal->Enabled = false;
textBoxX_CodeTrade->Enabled = false;

checkBoxX_AllData->Checked = true;
dateTimeInput_Start->Enabled = false;
dateTimeInput_End->Enabled = false;
textBoxX_KlineCount->Enabled = false;

m_SyncContext = SynchronizationContext::Current;

m_Impl = m_Impl_;
m_Impl->IniImpl(atoi(cfg.GetValue("network","port").c_str()), cfg.GetValue("network","ip").c_str(), (HWND)this->Handle.ToPointer());
}
//...其他方法、属性
private:
CNetWorkImpl* m_Impl;

};
}

上层UI通过m_Impl->IniImpl()函数的第三个参数将句柄传下去。


#define NETWORK_CONNECTED (WM_USER)+0x01

class CNetWorkImpl : public CAsioNetWorkSpi
{
public:
CNetWorkImpl(const char* pFilePath) : bConnected(false),pApi(nullptr) {
strcpy_s(szFilePath, pFilePath);
}

void IniImpl(unsigned int nPort, const char* pAddress,HWND hwnd)
{
pApi = CAsioNetWorkApi::CreateNewWorkApi();
pApi->RegistSpi(this);
pApi->ConnectService(nPort, const_cast<char*>(pAddress));
upper_layer = hwnd;
}

void OnRspConnect()
{
bConnected = true;
::SendMessage(upper_layer, NETWORK_CONNECTED, NULL, NULL);
}
}

底层想通过发送消息::SendMessage(upper_layer, NETWORK_CONNECTED, NULL, NULL);给上层更新UI。
请问上层的消息接收函数怎么写?注意:这是c++/clr代码,不是c#。

或者有别的思路,可以让底层操作上层UI。
...全文
1011 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2018-02-28
  • 打赏
  • 举报
回复
直接给这个 HWND 窗口句柄发送消息。 SendMessage
qq_33874870 2018-02-27
  • 打赏
  • 举报
回复
我用九楼这个写法,用是可以用,但是wndproc这个回调函数必须有windows系统消息才能触发,有没有什么方法让我不用触发系统消息,比如不用动鼠标键盘就能控制上层UI的方法
我是菜鸟999 2017-04-14
  • 打赏
  • 举报
回复
引用 9 楼 Saleayas 的回复:
在 C++ 中的 签名是这样的:
protected:
virtual void WndProc(
	Message% m
) override
大神,真是这样。 贴上全部响应,方便以后的人。结贴。

protected : virtual void WndProc(Message% m) override
			 {
				 switch (m.Msg)
				 {
				 case NETWORK_CONNECTED:
					 //do your event
					 MessageBox::Show("connect ok.");
					 break;
				 }
//this->Form是我的基类
				 this->Form::WndProc(m);
			 }
Saleayas 2017-04-14
  • 打赏
  • 举报
回复
在 C++ 中的 签名是这样的:
protected:
virtual void WndProc(
	Message% m
) override
我是菜鸟999 2017-04-14
  • 打赏
  • 举报
回复
引用 7 楼 stherix 的回复:
普通函数不行 一定要override才有用 当然你用Invoke也可以在线程里操作界面
用了override关键字了。 我用多了c++,就想用消息实现UI操作,Invoke感觉麻烦。你能写个clr demo,实现消息操作UI吗?
stherix 2017-04-14
  • 打赏
  • 举报
回复
引用 6 楼 u013533826 的回复:
[quote=引用 5 楼 stherix 的回复:] 我知道是c++/cli 不过都差不太多,只是改成c++写法 只能override WndProc另一个不是虚函数 而且你都看到Form类有一个virtual void WndProc() override了 说明你派生类里可以继续重写的啊
然而,代码走不到重写方法里面。唉[/quote] 普通函数不行 一定要override才有用 当然你用Invoke也可以在线程里操作界面
我是菜鸟999 2017-04-14
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
我知道是c++/cli 不过都差不太多,只是改成c++写法 只能override WndProc另一个不是虚函数 而且你都看到Form类有一个virtual void WndProc() override了 说明你派生类里可以继续重写的啊
然而,代码走不到重写方法里面。唉
stherix 2017-04-14
  • 打赏
  • 举报
回复
我知道是c++/cli 不过都差不太多,只是改成c++写法 只能override WndProc另一个不是虚函数 而且你都看到Form类有一个virtual void WndProc() override了 说明你派生类里可以继续重写的啊
我是菜鸟999 2017-04-14
  • 打赏
  • 举报
回复
我的窗体继承于System::Windows::Forms::Form
public ref class MainForm : public System::Windows::Forms::Form

查看对象浏览器的函数
有WndProc函数,也有DefWndProc函数。
但是重写到代码里面,如下

protected : virtual void WndProc(System::Windows::Forms::Message m) override
{
switch (m.Msg)
{
case NETWORK_CONNECTED:
//do your event
MessageBox::Show("connect ok.");
break;
}
}

protected : virtual void DefWndProc(System::Windows::Forms::Message m) override
{
switch (m.Msg)
{
case NETWORK_CONNECTED:
//do your event
MessageBox::Show("connect ok.");
break;
}
}

warning C4490: “override”: 重写说明符的用法不正确;“HRCenterBackTest::MainForm::WndProc”与 ref 基类方法不匹配
1> 只有存在来自 ref 类的匹配基方法时,才允许使用“new”或“override”
warning C4490: “override”: 重写说明符的用法不正确;“HRCenterBackTest::MainForm::DefWndProc”与 ref 基类方法不匹配
1> 只有存在来自 ref 类的匹配基方法时,才允许使用“new”或“override”

这两句是说基类不是ref类。
到底怎么做才能修改到UI啊
莫非是用Invoke?
我是菜鸟999 2017-04-14
  • 打赏
  • 举报
回复
引用 2 楼 stherix 的回复:
在upper_layer这个窗体中重载WndProc函数
在里面处理消息
类似如下
protected override void WndProc(ref Message message)
{
switch (message.Msg)
{
case NETWORK_CONNECTED:
//do your event
break;
}
base.WndProc(ref message);
}


这个不是C#代码,是c++/clr,和C#有区别。
我重写WndProc函数编译不过。


如下写倒是不报错,但是不响应消息,应该是没用对。

protected: void WndProc(Message^ message)
{
switch (message->Msg)
{
case NETWORK_CONNECTED:
//do your event
MessageBox::Show("connect ok.");
break;
}
}

stherix 2017-04-14
  • 打赏
  • 举报
回复
在upper_layer这个窗体中重载WndProc函数 在里面处理消息 类似如下
protected override void WndProc(ref Message message)
        {
            switch (message.Msg)
            {
                case NETWORK_CONNECTED:
                    //do your event
                    break;
            }
            base.WndProc(ref message);
        }
我是菜鸟999 2017-04-14
  • 打赏
  • 举报
回复
自己顶一下!

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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