2012-04-19 117 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