2012-04-19 112 views
1

我一直在试图灰化(和禁用)子菜单项的程序有问题。C++(不使用MFC)禁用/灰化菜单项

我在找的是“运行”项目被禁用,除非所需的.ini条目不为空。

我的代码

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
HMENU hmenu = GetMenu(hWnd); 
// Reading in ini 
    if (0 == strcmp(webLocation, "")){ 
    EnableMenuItem(hmenu,ID_WEBSERVICES_RUN,MF_DISABLED | MF_GRAYED); 
    WritePrivateProfileString(_T("WEBSERVICES"), _T("Location"), _T("Tool Not Found"), WpathStr); 
} 

我不确知我是否正确地得到HMENU,为什么这个代码不工作了预期的效果。

任何帮助,这将不胜感激。

回答

1

你不能只把它放在顶层的WndProc中。 WndProc进程事件,无论窗口是否已经构建。它会因许多不同的原因被多次调用。

您的WndProc几乎肯定会看起来像message上的一个大开关。您要在这里的一个是WM_INITDIALOG

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_INITDIALOG: 
      // jump to a new function that reads the .ini 
      // and disables the control etc. 
      return OnInitDialog(hWnd, wParam, lParam); 

     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
} 
+0

我使用paint而不是对话框(WM_PAINT)。我应该把我的代码放在这里吗? – L337BEAN 2012-04-19 12:33:03

+0

也许你可能会再次调用WM_PAINT,每次窗口的任何部分都需要重新渲染,例如如果它不再被别的东西遮挡或者在被最小化后恢复。如果你把逻辑放在那里,那么你需要用一个标志来保护它,以便它只加载一次.ini文件。不过,我认为有更好的信息可以使用。 – Rup 2012-04-19 12:38:04

+0

我还没有看过旗子。把一个菜单项变成灰色是我原本想的更复杂:/。感谢您的帮助Rup! – L337BEAN 2012-04-19 12:44:06