2011-11-11 2 views
3

VB2008 Express를 사용하고 있습니다. 그리고 저는 "팝업"을 사용하여 기간을 선택했습니다. DateTimePicker는 일요일부터 토요일까지 항상 1 주일의 기간을 선택하기 때문에 이상적이지 않습니다. 컨트롤이 잘 작동하고 꽤 자랑 스럽습니다. 내 문제는 이것을 위해 ToolstripControlHost를 사용할 때 추가 된 경계와 관련이 있습니다. 스크린 샷과 코드를 포함 시켰습니다. 아래의 코드에서 Popsting/Size/Margin, 팝업 컨트롤 용 ToolstripControlHost 사용

enter image description here

이있다 생각 나는 몇 가지 사용자 정의 항목이 포함 된 패널을 표시하고자하는 아래 "btnTimePeriod"라는 이름의 버튼을, 존재하고 패널의 이름은 "pnlDateRangePicker"입니다.

IT 작업 ...하지만 제대로 보이지 않습니다. 패널 자체는 147 x 326 픽셀이지만 첨부 된 그래픽에서 패널 주위에 경계선을 추가하고 싶지는 않습니다. 위쪽, 아래쪽, 왼쪽에 테두리가 있습니다 ... 그러나 어떤 이유로 인해 오른쪽 테두리가 특히 큽니다. 내 코드가 명시 적으로 설정하지는 않았지만 AutoSize = true로 설정하면 패널 주변에서 축소 될 것으로 예상됩니다.

필요에 따라 내 코드는 이미 ShowCheckMargin 및 ShowImageMargin을 false로 설정합니다. 관련이 없기 때문에 DrawDateCalander Sub 코드를 포함하지 않았습니다. 나는 빈 패널조차도 같은 결과를 얻을 것이라고 믿는다. 나는이 마진이 어디에서오고 있는지 전혀 모른다. 어떤 지침?

Private Sub btnTimePeriod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTimePeriod.Click 
    Call DrawDateCalendar(DatePart(DateInterval.Month, FirstDisplayedSunday), DatePart(DateInterval.Year, FirstDisplayedSunday)) 
    Call ShowControlBelow(btnTimePeriod, pnlDateRangePicker) 
End Sub 

Sub ShowControlBelow(ByVal Showbutton As Control, ByVal ShownControl As Control) 

    Dim PopupContainer As New ToolStripControlHost(ShownControl) 
    PopupContainer.Margin = New Padding(0) 
    Dim mnuDropDown As New ContextMenuStrip 
    mnuDropDown.Padding = New Padding(0) 
    mnuDropDown.ShowCheckMargin = False 
    mnuDropDown.ShowImageMargin = False 
    mnuDropDown.Items.Add(PopupContainer) 
    ShowMenuBelow(Showbutton, mnuDropDown) 

End Sub 

Sub ShowMenuBelow(ByVal Showbutton As Control, ByVal WhichMenu As ContextMenuStrip, Optional ByVal AlignRight As Boolean = False) 
    Dim x As Integer = 0 
    Dim y As Integer = 0 
    Dim itscontainer As Control = Showbutton.Parent 
    x = Showbutton.Location.X 
    y = Showbutton.Location.Y 
    If Not itscontainer Is Nothing Then 
     Do Until TypeOf itscontainer Is Form 
      x = x + itscontainer.Location.X 
      y = y + itscontainer.Location.Y 
      itscontainer = itscontainer.Parent 
      If itscontainer Is Nothing Then Exit Do 
     Loop 
    End If 
    y = y + Showbutton.Height 
    If AlignRight = True Then 
     x = x - WhichMenu.Width + Showbutton.Width 
    End If 
    Dim xy As New Point(x, y) 
    WhichMenu.Show(Showbutton.FindForm, xy) 


End Sub 

답변

3

나는 이것을 위해 ContextMenuStrip을 사용한 적이 한번도 없었습니다.

당신은 ToolStripDropDown를 사용하는 대신 시도 할 수 있습니다 :

Private Sub ShowControl(ByVal fromControl As Control, ByVal whichControl As Control) 
    '\\ whichControl needs MinimumSize set: 
    whichControl.MinimumSize = whichControl.Size 

    Dim toolDrop As New ToolStripDropDown() 
    Dim toolHost As New ToolStripControlHost(whichControl) 
    toolHost.Margin = New Padding(0) 
    toolDrop.Padding = New Padding(0) 
    toolDrop.Items.Add(toolHost) 
    toolDrop.Show(Me, New Point(fromControl.Left, fromControl.Bottom)) 
End Sub 

Private Sub btnTimePeriod_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTimePeriod.Click 
    Call DrawDateCalendar(DatePart(DateInterval.Month, FirstDisplayedSunday), DatePart(DateInterval.Year, FirstDisplayedSunday)) 
    '\\Call ShowControlBelow(btnTimePeriod, pnlDateRangePicker) 
    Call ShowControl(btnTimePeriod, pnlDateRangePicker) 
End Sub 
+0

감사합니다! LarsTech의 대답이 올바른 것입니다. 그러나 두 가지주의 사항 : 1) mnuDropDown.Maximumsize를 명시 적으로 mnuDropDown 크기로 설정해야했습니다. ShownControl보다 폭과 높이가 3 픽셀 적습니다. 패딩이나 마진 설정이라고 가정했지만 컨트롤이 설정되면 어떤 속성도 영향을 미치지 않았습니다. 2) 내 ShowMenuBelow 프로 시저의 목적은 버튼이 중첩 된 컨테이너의 여러 레이어 내에있을 때 폼에 상대적인 적절한 X/Y 위치를 찾는 것입니다. – PaulOTron2000