VCLZ-42 2023-02-25 11:19 采纳率: 72.2%
浏览 9
已结题

这个MFC自定义消息映射函数的逻辑是什么?

今天读到一个自定义消息函数修改发包命令,下载文件的命令号是4, 没太看懂此处用位运算的逻辑。“4 << 1 | 0”


//int ret = SendCommandPacket(4, false, (BYTE*)(LPCTSTR)strFile, strFile.GetLength());    //修改前
    int ret = SendMessageA(WM_SEND_PACKET, 4 << 1 | 0, (LPARAM)(LPCSTR)strFile);   //用自定义消息函数发送下载文件命令
......

#define WM_SEND_PACKET (WM_USER + 1) 
//自定义消息响应函数
/*用位运算合并参数*/

LRESULT CRemoteControlClientDlg::OnSendPacket(WPARAM wParam, LPARAM lParam)
{
    int ret = 0;
    int cmd = wParam >> 1;
    switch (cmd) 
    {
case 4: //下载文件
    {
        CString strFile = (LPCTSTR)lParam;
        ret = SendCommandPacket(cmd, wParam & 1,
            (BYTE*)(LPCTSTR)strFile, strFile.GetLength());
    }
            break;
    case 6://截取屏幕
    {
        ret = SendCommandPacket(cmd, wParam & 1);
    }
            break;
    default:
        ret = -1;
    }
    return ret;
}
  • 写回答

2条回答 默认 最新

  • MarkHan_ 2023-02-25 11:27
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    这里的位运算逻辑是将命令号左移1位(相当于乘以2)然后与0按位或运算。这样做的目的是将命令号的最后一位用作一个标志位,表示是否需要等待服务器的回应。如果等待回应,标志位就是1,否则是0。这样通过位运算合并参数,就可以在发送命令时将等待回应的标志位一并传递给服务器。在自定义消息响应函数中,使用位运算将参数还原,并根据命令号执行相应的操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月5日
  • 已采纳回答 2月25日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?
  • ¥20 用户端如何上传图片到服务器和数据库里
  • ¥15 现在研究生在烦开题,看了一些文献,但不知道自己要做什么,求指导。
  • ¥30 vivado封装时总是显示缺少一个dcp文件
  • ¥100 pxe uefi启动 tinycore
  • ¥15 我pycharm运行jupyter时出现Jupyter server process exited with code 1,然后打开cmd显示如下
  • ¥15 可否使用carsim-simulink进行四轮独立转向汽车的联合仿真,实现四轮独立转向汽车原地旋转、斜向形式、横移等动作,如果可以的话在carsim中如何进行相应设置
  • ¥15 Caché 2016 在Java环境通过jdbc 执行sql报Parameter list mismatch错误,但是同样的sql使用连接工具可以查询出数据
  • ¥15 疾病的获得与年龄是否有关