Cómo combinar la barra de menú y la barra de título en una sola
Dibujar el menú en la barra de título.
Elimina la barra de título y usa la barra de menú como título.
Aquí hay una breve descripción del efecto: en la interfaz de la aplicación, la barra de título y la barra de menú se muestran en la misma área, y el usuario hace clic en el área del menú para abrir el menú correspondiente; en otras áreas en blanco es como hacer clic en la barra de título (no está claro, pero creo que todos lo entienden).
La segunda opción en realidad tiene dos puntos principales: eliminar la barra de título y usar la barra de menú para simular la barra de título.
EstablecerWindowPos
WM_NCHITTEST
. A través de esta noticia sabemos que una ventana se subdivide en más de 20 áreas, dos de las cuales ahora nos interesan, HTMENU y HTCAPTION. Ahora viene la idea. Al procesar el mensaje WM_NCHITTEST, si parte del HTMENU devuelto por el sistema se puede convertir a HTCAPTION, ¿se puede lograr el efecto de simular la barra de título? Los hechos nos dicen que básicamente se ha logrado. El código es el siguiente: 1: uintcls_onnchittest (hwndhwnd,
intx,
inty) 2: { 3: UINT uNcHitResult = FORWARD _ WM _ NCHITTEST (hwnd, x, y, DefWindowProc); 4:5: if (ht menu = = uNcHitResult) 6: { 7: hm enu hm enu = obtener menú (hwnd); 8: intnMenuItemCount = GetMenuItemCount (hMenu); 0, 0, 0, 0 }; 11: if (GetMenuItemRect (hwnd, hMenu, nMenuItemCount - 1, & ampRCTHELASTMENU)) 12: { 13:// Al hacer clic en el área en blanco del menú, simula el Comportamiento de la barra de título 14: if (RCTHELASTMENU. Derecha
Después de este procesamiento, hacer clic/doble clic en el área en blanco de la barra de menú y arrastrarla parecerá que está operando la barra de título.
Después de escribir este código, encontrará algunas cosas:
Haga clic derecho en un área vacía de la barra de menú para ver el menú del sistema. Cuando está maximizada, la ventana cubre la barra de tareas.
Entonces, este método de simulación solo implementa básicamente la función y no cumple completamente con los requisitos.
intx,
(Igual que las organizaciones internacionales
y, código UINT hittest)2:{ 3:if(ht caption == código hittest)4:{ 5:HMENU hsys menu = get system menu(hwnd,
False); 6:intnMenuAlign = GetSystemMetrics(SM_MENUDROPALIGNMENT); 7:8://Preste especial atención a TPM_RETURNCMD.
Necesitamos saber en qué elemento del menú del sistema hizo clic el usuario: bool bres = trackpupmenuex(hsysmenu,nmenuualign|TPM_returncmd,x,y,hwnd,null); 10:return forward_WM_sys command(hwnd,bRes,x,y, DefWindowProc); :} 12:13:FORWARD _ WM _ NCRBUTTONUP (hwnd, x, y, codeHitTest, DefWindowProc); 14:}
Hasta ahora, parece que hemos resuelto todas las preguntas sobre los menús. Pero todavía hay algunos problemas. Parece que hay algún problema con el estado de los elementos del menú del sistema. Para resolver este problema, necesitamos usar el mensaje WM_INITMENU para desafiar el estado del elemento de menú correspondiente maximizando o minimizando el estado de la ventana actual.
Mire el código: 1: void cls _ en el menú de inicio (hwnd hwnd, hmenu hmenu) 2: { 3: if (obtener menú del sistema (hwnd,
FALSE) = = hMenu) 4: { 5 : UINT uSysCmds[]= { SC_SIZE, SC_MOVE, SC_MINIMIZE, SC_MAXIMIZE, SC_CLOSE, SC_RESTORE}; 6:if(isi cónico(hwnd))7:{ 8:for(inti = 0;i<_count of(uSysCmds);++ I )9:{ 10:switch(uSysCmds[i])11:{ 12:caseSC _ MAXIMIZE:13:caseSC _ RESTORE:14:caseSC _ CLOSE:15:EnableMenuItem(hMenu,uSysCmds[I], MF_ENABLED); roto; 17: 18: Valor predeterminado: 19: EnableMenuItem(hMenu, uSysCmds[i], MF_DISABLED | MF_GRAYED 20: roto 21:} 22:} 23:} 24: else if(iszolled(hwnd))25:{ 26:for(inti = 0;i<_count of(uSysCmds);++I)27:{ 28:switch(uSysCmds[i])29:{ 30: caseSC_RESTORE:31:caseSC_MINIMIZE:32:caseSC_CLOSE:33:EnableMenuItem(hMenu ,uSysCmds[I],MF_ENABLED); 34:Roto; 35:36:Predeterminado: 37:EnableMenuItem(hMenu,uSysCmds [i], MF_DISABLED | MF_GRAYED); else 43:{ 44: for (inti = 0; i<_count of(uSysCmds); + + I)45:{ 46:switch(uSysCmds[i])47:{ 48:caseSC_RESTORE:49:habilitar menuitem(hMenu, uSysCmds[ I], MF_DISABLED | MF_GRAYED); 50: roto; 51:52: Predeterminado: 53: EnableMenuItem(hMenu, uSysCmds[i], MF_ENABLED); else 60:{ 61:FORWARD_WM_ menú de inicio(hwnd, hMenu, DefWindowProc 62:}63:}
Ya terminaste. Por desgracia, algo parece estar mal. Parece que hay algún problema con el estado del menú del sistema que aparece por primera vez. Si vuelve a aparecer, parece correcto. ¿Qué pasó? Es culpa de GetSystemMenu. Para solucionar este problema, simplemente llame a GetSystemMenu para copiar antes de mostrar el menú del sistema.
Llegado a este punto los problemas con el menú del sistema deberían estar solucionados. Lo siguiente es para resolver el problema de la pantalla completa.