2013-11-12 4 views
1

Я немного confussed, структура menuinfo в MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ms647575%28v=vs.85%29.aspx говорит:Каким образом можно установить и использовать структуру MenuInfo?

hbrBack 
Type: HBRUSH 
A handle to the brush to be used for the menu's background. 

Итак ... Как я мог получить, что необходимый дескриптор кисти ?, я не вижу какой-либо метод ручки для объекта Brush ... это кисть, это противоречит.

А также, я не могу просто использовать растровое изображение для фона меню? Я попытался использовать ручку растрового изображения, но фон меню не изменился.

UPDATE

Этот код не работал, не изменил цвет фона.

Public Sub SetMenuBackground() 

    MenuHandle = GetSystemMenu(form.Handle, False) 

    Dim brush As IntPtr = 
     CreateSolidBrush(CUInt(ColorTranslator.ToWin32(Color.Red))) 

    Dim mi As New MenuInfo 
    mi.cbSize = Marshal.SizeOf(GetType(MenuInfo)) 
    mi.fMask = &H2 ' MIM_BACKGROUND 
    mi.hbrBack = brush 

    SetMenuInfo(MenuHandle, mi) 

End Sub 

В API FUNC и структура:

<DllImport("user32.dll")> _ 
Private Shared Function SetMenuInfo(
     ByVal hmenu As IntPtr, 
     <[In]> ByRef lpcmi As MenuInfo 
) As Boolean 
End Function 

Private Structure MenuInfo 
    Dim cbSize As Int32 
    Dim fMask As Int32 
    Dim dwStyle As Int32 
    Dim cyMax As Int32 
    Dim hbrBack As IntPtr 
    Dim dwContextHelpID As Int32 
    Dim dwMenuData As Int32 
    Public Sub New(ByVal owner As Control) 
     cbSize = Marshal.SizeOf(GetType(MENUINFO)) 
    End Sub 
End Structure 
+0

http://msdn.microsoft.com/en-us/library/windows/desktop/dd183518(v=vs.85).aspx (его не объект, его дескриптор кисти) – Plutonix

+1

Вы используете WinApi, вам нужно использовать ссылку Brush, созданную таким же образом. http://pinvoke.net/search.aspx?search=brush&namespace=[All] –

+0

Вы пытаетесь смешивать несколько разных типов дескрипторов (например, 'HBITMAP'! =' HBRUSH' и 'Graphics.Bitmap' ! = 'BITMAP'). Это может помочь прояснить ситуацию, если вы объясните, почему * вы хотите использовать структуру WinAPI 'MENUINFO' (предназначенную для сырых вызовов API) в коде .NET. Что вы пытаетесь сделать здесь? –

ответ

1

Я изменил структуру, и теперь он работает отлично

<System.Runtime.InteropServices. 
StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, 
CharSet:=System.Runtime.InteropServices.CharSet.Auto)> 
Public Structure MenuInfo 
    Public cbSize As UInteger 
    Public fMask As UInteger 
    Public dwStyle As UInteger 
    Public cyMax As UInteger 
    Public hbrBack As IntPtr 
    Public dwContextHelpID As UInteger 
    Public dwMenuData As UIntPtr 
End Structure 

Что я узнал с этим ?: PInvoke. net site никогда не дает эффективных/рабочих примеров.

Смежные вопросы