如何为DocTemplate自定义绘制MFC菜单

时间:2017-09-05 06:15:07

标签: menu mfc ownerdrawn

我用这一行初步了解我的MFC应用程序的视图:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Draggable - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">
  <style>
    #parent {
      position: absolute;top:0px;left:0px; width: 1280px; height: 720px;
       background-color:red;
    }
    #rect1 { width: 150px; height: 150px; padding: 0.5em; }

    .circleBase {
    border-radius: 50%;
    behavior: url(PIE.htc); /* remove if you don't care about IE8 */
    }

    .type1 {
    width: 100px;
    height: 100px;
    background: yellow;
    border: 3px solid red;
    }
  </style>
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
  //
  // !!!IMPORTANT!!! GOAL
  // ============================= ******
  // Get the coords after dragging and store the last value here
  // ============================= ******
  //
  var rect_coords = "";
  var circle_coords = "";

  $(function(){
    $( "#rect1" ).draggable({ containment: "parent" });
    $( "#circle1" ).draggable({ containment: "parent" });
  });
  </script>
</head>
<body>

  <div id="parent">

    <div id="rect1" class="ui-widget-content">
      <p>Rect</p>
    </div>


    <div id="circle1" class="ui-widget-content circleBase type1">
      <p>Circle</p>
    </div>    

  </div>



</body>
</html>

IDR_MAINFRAME是我的主菜单的标识符。 使此菜单自定义绘制的最佳方法是什么?我已经有了一个来自CMenu的课程,它为上下文菜单做了很好的工作。不同之处在于我自己创建了上下文菜单,而这个菜单是由框架创建的。

为了覆盖主菜单,我尝试了:

CSingleDocTemplate pDocTemplate(
   new CSingleDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CMyDoc),
      RUNTIME_CLASS(CMainFrame),
      RUNTIME_CLASS(CMyDataView)
   )
);
AddDocTemplate(pDocTemplate);

,但不知何故,对于第一个项目(即POPUP),MeasureItem不会在customMenu类实例化中触发,导致点击一个小方块,并且不同按钮的文本相互重叠。

MENUITEM按预期显示,但对于每个POPUP到子菜单(以及子子和子子菜单),样式错误(读取:不调用MeasureItem)。对于sub,subsub和subsubsubmenus中的MENUITEMS,我从框架接收一个MeasureItem调用。

1 个答案:

答案 0 :(得分:0)

感谢您的评论。事实证明我的CMenu派生类中有一个错误。我使用了codeguru中的代码示例。 在那里,ModifyMenu为POPUP菜单发送ID 0,而不是POPUP菜单的真实ID。 void CWnd::OnMeasureItem(...)搜索要测量的菜单,但没有找到任何内容(它查找0,因为ModifyMenu告诉他这样做,但实际的POPUP菜单有一些其他ID)并返回NULL。如果您的菜单中有一个SEPARATOR,它会找到一个要测量的菜单,因为分隔符的ID为0.

解决方案如下:

  • 不是发送0,而是发送reinterpret_cast<UINT>(menu.GetSubMenu(i)->GetSafeHmenu())作为ID(wincore.cpp中的AFX_STATIC CMenu* AFXAPI _AfxFindPopupMenuFromID(CMenu* pMenu, UINT nID)检查ID的方式相同)。
  • 此外,添加标志MF_POPUP。