Контекстное меню на пункт др.меню+разр.экрана

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Контекстное меню на пункт др.меню+разр.экрана

Сообщение Oleg NT » 01.08.2006 (Вт) 21:28

Имеется пункт меню (возможно, к нему прикручено вложенное меню)

Есть способ прицепить к этому пункту контекстное меню? (Свойства ContextMenu у пункта я не нашел)

Т.е. должно быть что-то типа как у меню Пуск -> Программы: а каждого пункта по нажатии правой кнопкой мыши появляется контекстное меню, а левой кнопкой производится клик по пункту...
Последний раз редактировалось Oleg NT 03.08.2006 (Чт) 17:24, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.08.2006 (Вт) 21:32

Нет, такой возможности нет.
В Пуск->Программы тоже не меню, а окно, которое выглядит как меню. А вот контекстное меню -- настоящее меню.
Тебе никто не мешает нарисовать такое же окно.
Изображение

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Сообщение Oleg NT » 02.08.2006 (Ср) 19:10

Понял. Спасибо.

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Сообщение Oleg NT » 03.08.2006 (Чт) 17:18

Извините, а вот еще вопрос: как изменить разрешение экрана? Как получить, я вот вроде нашел:
My.Computer.Screen.Bounds.Width | Height

А вот как изменить?

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 03.08.2006 (Чт) 18:06

Если у тебя ВС2005 то посмотри свойство элемента меню
DropDown
Синтакс:
Me.MenuStrip1.DropDown = Me.ContextMenuStrip1

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Сообщение Oleg NT » 03.08.2006 (Чт) 18:21

temur писал(а):Если у тебя ВС2005 то посмотри свойство элемента меню
DropDown
Синтакс:
Me.MenuStrip1.DropDown = Me.ContextMenuStrip1


Да, VS2005, но тогда получается просто вложенное меню, а мне нужно контекстное.

И как все-таки быть с разрешением экрана? Ни в гугле, ни в других местах не нашел :(

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 03.08.2006 (Чт) 18:35

Тогда приблизительно так
Код: Выделить всё
Private Sub mnuContext_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles mnuContext.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Right Then
            Me.ContextMenuStrip1.Show(Me, e.Location)
        End If
End Sub


Но я не знаю как сделать чтобы меню не закрывальсь
Насчет скрина тоже не знаю.

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Сообщение Oleg NT » 03.08.2006 (Чт) 18:38

temur писал(а):Тогда приблизительно так

не, до этого-то я и сам додумался, так закрывается оно, сволочь...

Ну все равно спасибо за помощь

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.08.2006 (Чт) 20:51

Встроенная в Windows логика не позволяет отображать несколько меню одновременно. Т.е. если на экране одновременно видно несколько меню, значит одно из них ненастоящее.
Изображение

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Сообщение Oleg NT » 03.08.2006 (Чт) 21:17

C меню ясно... А вот с разрешением экрана так и не разобрался... Вот нашел пример:

Код: Выделить всё
Option Explicit
Const WM_DISPLAYCHANGE = &H7E
Const HWND_BROADCAST = &HFFFF&
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1
Const BITSPIXEL = 12
Private Type DEVMODE
    dmDeviceName As String * CCDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As Any) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Dim OldX As Long, OldY As Long, nDC As Long
Sub ChangeRes(X As Long, Y As Long, Bits As Long)
    Dim DevM As DEVMODE, ScInfo As Long, erg As Long, an As VbMsgBoxResult
    'Get the info into DevM
    erg = EnumDisplaySettings(0&, 0&, DevM)
    'This is what we're going to change
    DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
    DevM.dmPelsWidth = X 'ScreenWidth
    DevM.dmPelsHeight = Y 'ScreenHeight
    DevM.dmBitsPerPel = Bits '(can be 8, 16, 24, 32 or even 4)
    'Now change the display and check if possible
    erg = ChangeDisplaySettings(DevM, CDS_TEST)
    'Check if succesfull
    Select Case erg&
        Case DISP_CHANGE_RESTART
            an = MsgBox("You've to reboot", vbYesNo + vbSystemModal, "Info")
            If an = vbYes Then
                erg& = ExitWindowsEx(EWX_REBOOT, 0&)
            End If
        Case DISP_CHANGE_SUCCESSFUL
            erg = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
            ScInfo = Y * 2 ^ 16 + X
            'Notify all the windows of the screen resolution change
            SendMessage HWND_BROADCAST, WM_DISPLAYCHANGE, ByVal Bits, ByVal ScInfo
            MsgBox "Everything's ok", vbOKOnly + vbSystemModal, "It worked!"
        Case Else
            MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
    End Select
End Sub
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim nDC As Long
    'retrieve the screen's resolution
    OldX = Screen.Width / Screen.TwipsPerPixelX
    OldY = Screen.Height / Screen.TwipsPerPixelY
    'Create a device context, compatible with the screen
    nDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
    'Change the screen's resolution
    ChangeRes 640, 480, GetDeviceCaps(nDC, BITSPIXEL)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'restore the screen resolution
    ChangeRes OldX, OldY, GetDeviceCaps(nDC, BITSPIXEL)
    'delete our device context
    DeleteDC nDC
End Sub


Изменил его для VB.NET:

Код: Выделить всё

Const WM_DISPLAYCHANGE = &H7E
    Const HWND_BROADCAST = &HFFFF&
    Const EWX_LOGOFF = 0
    Const EWX_SHUTDOWN = 1
    Const EWX_REBOOT = 2
    Const EWX_FORCE = 4
    Const CCDEVICENAME = 32
    Const CCFORMNAME = 32
    Const DM_BITSPERPEL = &H40000
    Const DM_PELSWIDTH = &H80000
    Const DM_PELSHEIGHT = &H100000
    Const CDS_UPDATEREGISTRY = &H1
    Const CDS_TEST = &H4
    Const DISP_CHANGE_SUCCESSFUL = 0
    Const DISP_CHANGE_RESTART = 1
    Public Const BITSPIXEL = 12

    Private Structure DEVMODE
        Public dmDeviceName As String '* CCDEVICENAME
        Public dmSpecVersion As Short
        Public dmDriverVersion As Short
        Public dmSize As Short
        Public dmDriverExtra As Short
        Public dmFields As Integer
        Public dmOrientation As Short
        Public dmPaperSize As Short
        Public dmPaperLength As Short
        Public dmPaperWidth As Short
        Public dmScale As Short
        Public dmCopies As Short
        Public dmDefaultSource As Short
        Public dmPrintQuality As Short
        Public dmColor As Short
        Public dmDuplex As Short
        Public dmYResolution As Short
        Public dmTTOption As Short
        Public dmCollate As Short
        Public dmFormName As String '* CCFORMNAME
        Public dmUnusedPadding As Short
        Public dmBitsPerPel As Short
        Public dmPelsWidth As Integer
        Public dmPelsHeight As Integer
        Public dmDisplayFlags As Integer
        Public dmDisplayFrequency As Integer
    End Structure

    Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByVal lpDevMode As DEVMODE) As Boolean
    Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByVal lpDevMode As DEVMODE, ByVal dwFlags As Integer) As Integer
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Integer, ByVal dwReserved As Integer) As Integer
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Integer, ByVal nIndex As Integer) As Integer
    Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As Integer) As Integer '4 был any
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Integer) As Integer
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer '4 был any

    Dim OldX As Integer, OldY As Integer, nDC As Integer

    Sub ChangeRes(ByVal X As Integer, ByVal Y As Integer, ByVal Bits As Integer)
        Dim DevM As DEVMODE, ScInfo As Integer, erg As Integer, an As Microsoft.VisualBasic.MsgBoxResult
        'Get the info into DevM
        erg = EnumDisplaySettings(0%, 0%, DevM)
        'This is what we're going to change
        DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
        DevM.dmPelsWidth = X 'ScreenWidth
        DevM.dmPelsHeight = Y 'ScreenHeight
        DevM.dmBitsPerPel = Bits '(can be 8, 16, 24, 32 or even 4)
        'Now change the display and check if possible
        erg = ChangeDisplaySettings(DevM, CDS_TEST)
        'Check if succesfull
        Select Case erg%
            Case DISP_CHANGE_RESTART
                an = MsgBox("You've to reboot", vbYesNo + vbSystemModal, "Info")
                If an = vbYes Then
                    erg% = ExitWindowsEx(EWX_REBOOT, 0&)
                End If
            Case DISP_CHANGE_SUCCESSFUL
                erg = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
                ScInfo = Y * 2 ^ 16 + X
                'Notify all the windows of the screen resolution change
                SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, Bits, ScInfo)
                MsgBox("Everything's ok", vbOKOnly + vbSystemModal, "It worked!")
            Case Else
                MsgBox("Mode not supported", vbOKOnly + vbSystemModal, "Error")
        End Select
    End Sub

Private Sub Form_Load()

    Dim nDC As Integer
    nDC = CreateDC("DISPLAY", vbNullString, vbNullString, 0%)
'исходное разрешение: 1280*1024, надо сменить на 1024*768
    ChangeRes(1024, 768, GetDeviceCaps(nDC, BITSPIXEL))
End Sub
Private Sub Form_Unload(Cancel As Integer)
    ChangeRes(1280, 1024, GetDeviceCaps(nDC, BITSPIXEL))
    DeleteDC(nDC)
End Sub


Ругается на DevM в строках:
Код: Выделить всё
'Get the info into DevM
        erg = EnumDisplaySettings(0&, 0&, DevM)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.08.2006 (Пт) 7:25

А как ругается? Дело в том, что у тебя DevMode определена несколько некорректно для VB.NET. Правильный вариант:

Код: Выделить всё
<StructLayout(LayoutKind.Explicit)> Structure DEVMODE
        <FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst:=CCHDEVICENAME)> Public dmDeviceName() As Char
        <FieldOffset(64)> Public dmSpecVersion As Short
        <FieldOffset(66)> Public dmDriverVersion As Short
        <FieldOffset(68)> Public dmSize As Short
        <FieldOffset(70)> Public dmDriverExtra As Short
        <FieldOffset(72)> Public dmFields As Integer
        '  union {
        '    struct {
        <FieldOffset(76)> Public dmOrientation As Short
        <FieldOffset(78)> Public dmPaperSize As Short
        <FieldOffset(80)> Public dmPaperLength As Short
        <FieldOffset(82)> Public dmPaperWidth As Short
        <FieldOffset(84)> Public dmScale As Short
        <FieldOffset(86)> Public dmCopies As Short
        <FieldOffset(88)> Public dmDefaultSource As Short
        <FieldOffset(90)> Public dmPrintQuality As Short
        '    };
        <FieldOffset(76)> Public dmPosition As POINTL
        <FieldOffset(84)> Public dmDisplayOrientation As Integer
        <FieldOffset(88)> Public dmDisplayFixedOutput As Integer
        '  };

        <FieldOffset(92)> Public dmColor As Short
        <FieldOffset(94)> Public dmDuplex As Short
        <FieldOffset(96)> Public dmYResolution As Short
        <FieldOffset(98)> Public dmTTOption As Short
        <FieldOffset(100)> Public dmCollate As Short
        <FieldOffset(102)> Public dmFormName1 As Char
        <FieldOffset(104), MarshalAs(UnmanagedType.ByValArray, SizeConst:=CCHFORMNAME - 1)> Public dmFormName() As Char
        <FieldOffset(166)> Public dmLogPixels As Short
        <FieldOffset(168)> Public dmBitsPerPel As Integer
        <FieldOffset(172)> Public dmPelsWidth As Integer
        <FieldOffset(176)> Public dmPelsHeight As Integer
        '  union {
        <FieldOffset(180)> Public dmDisplayFlags As Integer
        <FieldOffset(180)> Public dmNup As Integer
        '  }
        <FieldOffset(184)> Public dmDisplayFrequency As Integer
        '#if(WINVER >= as integer =&h0400)
        <FieldOffset(188)> Public dmICMMethod As Integer
        <FieldOffset(192)> Public dmICMIntent As Integer
        <FieldOffset(196)> Public dmMediaType As Integer
        <FieldOffset(200)> Public dmDitherType As Integer
        <FieldOffset(204)> Public dmReserved1 As Integer
        <FieldOffset(208)> Public dmReserved2 As Integer
        '#if (WINVER >= as integer =&h0500) || (_WIN32_WINNT >= as integer =&h0400)
        <FieldOffset(212)> Public dmPanningWidth As Integer
        <FieldOffset(216)> Public dmPanningHeight As Integer
        '#End If
        '#endif /* WINVER >= as integer =&h0400 */
    End Structure


[OFFTOP]к вопросу о подсветке: Structure не является ключевым словом?[/OFFTOP]
Весь мир матрица, а мы в нем потоки байтов!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 04.08.2006 (Пт) 15:15

[OFFTOP]Подсветка рассчитана на VB6[/OFFTOP]
Изображение

Oleg NT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 9
Зарегистрирован: 01.08.2006 (Вт) 20:43

Сообщение Oleg NT » 04.08.2006 (Пт) 18:31

Thanx, щас попробую


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList