1

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

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 的文档(也许它启动了某种“拖动/调整大小序列”)。有任何想法吗?

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

4

2 回答 2

4

它们是未记录的参数。搜索后,我设法找到了这个列表。

  • 0xF000 ( SC_SIZE, 表格居中光标)
  • 0xF001 ( SC_SZLEFT, 从左调整大小)
  • 0xF002 (SC_SZRIGHT, Resize from right)
  • 0xF003 (SC_SZTOP, Resize from top)
  • 0xF004 (SC_SZTOPLEFT, Lock the bottom right corner of the form, the top left corner move for resize)
  • 0xF005 (SC_SZTOPRIGHT, Same from bottom left corner)
  • 0xF006 (SC_SZBOTTOM, Lock top right and left border, resize bottom)
  • 0xF007 (SC_SZBOTTOMLEFT, Lock top and right border, resize other border)
  • 0xF008 (SC_SZBOTTOMRIGHT, Lock left and top border and resize other)
  • 0xF009 (SC_SIZE|0x9, Drag from anywhere)
  • 0xF00F (SC_SEPARATOR)
  • 0xF010 (SC_MOVE, Put cursor centered at the upper order)
  • 0xF012 (SC_DRAGMOVE, move by dragging)
  • 0xF020 (SC_MINIMIZE, Auto-Minimize Form)
  • 0xF030 (SC_MAXIMIZE, Auto-Maximize Form)
  • 0xF040 (SC_NEXTWINDOW, Stop! You don't want that, it will lock all mouse click and make you reboot)
  • 0xF148 (SC_SCREENSAVE|0x8, Activate ScreenSaver)
  • 0xF13E (SC_TASKLIST|0xE, Activate StartButton)

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

于 2009-04-18T10:42:09.113 回答
1

Based on my Win32 Programming (Rector and Newcomer) p902-903 explains WM_SYSCOMMAND is sent when the user selects an item from the system menu (rather than sending the normal WM_COMMAND).

The MSDN help says SC_SIZE = 0xF000 and it and Win32 Programming also say Windows uses the four low-order bits of the predefined system menu IDs internally but doesn't go on to clarify their use. Thanks stukelly for clarifying them.

于 2009-04-18T10:42:45.837 回答