【问题标题】:Custom form designer, move/resize controls using WinAPI自定义表单设计器,使用 WinAPI 移动/调整控件大小
【发布时间】:2010-10-20 06:42:07
【问题描述】:

我必须解决一些问题并增强很久以前为数据库项目编写的表单设计器。 在设计面板类代码中我遇到了这些行

private void DesignPanel_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        (sender as Control).Capture = false;
        switch (FMousePosition)
        {
        case MousePosition.mpNone: 
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF009, 0);
            break;// Move
        case MousePosition.mpRightBottom: 
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF008, 0);
            break;//RB
        case MousePosition.mpLeftBottom: 
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF007, 0); 
            // ... here are similar cases ...
        case MousePosition.mpLeft:
            SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF001, 0);
            break;//L  
        }
    }
}

FMousePosition 指示鼠标是否在选定控件的任何边缘上。

让我困惑的是这些 Windows 消息:似乎没有关于 WM_SYSCOMMAND 参数为 0xF001-0xF009 的文档(也许它启动了某种“拖动/调整大小序列”)。有任何想法吗?

如果我的建议是正确的,那么我该如何取消这些序列?

【问题讨论】:

    标签: c# winapi form-designer


    【解决方案1】:

    它们是undocumented 参数。经过搜索,我设法找到了这个列表。

    • 0xF000SC_SIZE,光标居中)
    • 0xF001SC_SZLEFT,从左侧调整大小)
    • 0xF002SC_SZRIGHT,从右侧调整大小)
    • 0xF003SC_SZTOP,从顶部调整大小)
    • 0xF004SC_SZTOPLEFT,锁定窗体右下角,左上角移动调整大小)
    • 0xF005SC_SZTOPRIGHT,左下角相同)
    • 0xF006SC_SZBOTTOM,锁定左右边框,调整底部大小)
    • 0xF007SC_SZBOTTOMLEFT,锁定上下边框,调整其他边框大小)
    • 0xF008SC_SZBOTTOMRIGHT,锁定左右边框并调整其他大小)
    • 0xF009SC_SIZE|0x9,从任意位置拖动)
    • 0xF00F (SC_SEPARATOR)
    • 0xF010SC_MOVE,将光标置于高位居中)
    • 0xF012SC_DRAGMOVE,拖动移动)
    • 0xF020SC_MINIMIZE,自动最小化表单)
    • 0xF030SC_MAXIMIZE,自动最大化表格)
    • 0xF040SC_NEXTWINDOW,停止!你不想这样,它会锁定所有鼠标点击并让你重新启动)
    • 0xF148SC_SCREENSAVE|0x8,激活屏幕保护程序)
    • 0xF13ESC_TASKLIST|0xE,激活开始按钮)

    参考:http://www.delphi3000.com/articles/article_1054.asp#Comments

    【讨论】:

      【解决方案2】:

      基于我的Win32 编程(校长和新人)p902-903 解释了WM_SYSCOMMAND 在用户从系统菜单中选择项目时发送(而不是发送正常的WM_COMMAND)。

      MSDN help 说 SC_SIZE = 0xF000 并且它和 Win32 编程 还说 Windows 在内部使用预定义系统菜单 ID 的四个低位,但没有t 继续澄清它们的用途。感谢 stukelly 澄清它们。

      【讨论】:

        【解决方案3】:

        查看APIViewer 并查看以 SC_ 开头的常量

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 2013-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多