トップ回答者
VB.NETで年月しか表示/選択させないコントロール(テキストボックスと組合わせ)

質問
回答
-
こんな
Imports System Imports System.ComponentModel Imports System.Runtime.InteropServices Imports System.Windows.Forms Namespace WindowsFormsApp1 Public Class MonthPicker Inherits DateTimePicker Public Sub New() Me.Format = DateTimePickerFormat.Custom Me.CustomFormat = "yyyy/MM" End Sub Protected Overrides Sub OnDropDown(eventargs As EventArgs) MyBase.OnDropDown(eventargs) 'カレンダーを開いたら月選択に表示を変える Dim hwndCal As IntPtr = Win32API.SendMessage(MyBase.Handle, Win32API.DTM.DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero) Win32API.SendMessage(hwndCal, Win32API.MCM.MCM_SETCURRENTVIEW, IntPtr.Zero, New IntPtr(Win32API.MCMV.MCMV_YEAR)) End Sub Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = Win32API.WM.WM_NOFITY Then Dim nmhdr As Win32API.NMHDR = CType(Marshal.PtrToStructure(m.LParam, GetType(Win32API.NMHDR)), Win32API.NMHDR) Select Case (nmhdr.code) Case Win32API.MCN.MCN_VIEWCHANGE Dim nmvc As Win32API.NMVIEWCHANGE = CType(Marshal.PtrToStructure(m.LParam, GetType(Win32API.NMVIEWCHANGE)), Win32API.NMVIEWCHANGE) Select Case (nmvc.dwNewView) Case Win32API.MCMV.MCMV_MONTH '月内の日付選択になったらカレンダーを閉じる Win32API.SendMessage(MyBase.Handle, Win32API.DTM.DTM_CLOSEMONTHCAL, IntPtr.Zero, IntPtr.Zero) End Select End Select End If MyBase.WndProc(m) End Sub End Class Module Win32API <DllImport("user32.dll", CharSet:=CharSet.Auto)> Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function <StructLayout(LayoutKind.Sequential)> Public Structure NMVIEWCHANGE Public nmhdr As NMHDR Public dwOldView As UInteger Public dwNewView As UInteger End Structure <StructLayout(LayoutKind.Sequential)> Public Structure NMHDR Public hwndFrom As IntPtr Public idFrom As IntPtr Public code As Integer End Structure Public Enum WM WM_NOFITY = &H4E End Enum Public Enum DTM DTM_GETMONTHCAL = &H1008 DTM_CLOSEMONTHCAL = &H100D End Enum Public Enum MCM MCM_FIRST = &H1000 MCM_GETCURRENTVIEW = MCM_FIRST + 22 MCM_SETCURRENTVIEW = MCM_FIRST + 32 End Enum Public Enum MCN MCN_FIRST = -746 MCN_VIEWCHANGE = MCN_FIRST - 4 End Enum Public Enum MCMV MCMV_MONTH = 0 '日付選択 MCMV_YEAR = 1 '月選択 MCMV_DECADE = 2 '年選択 MCMV_CENTURY = 3 End Enum End Module End Namespace
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 AzuleanMVP, Moderator 2020年12月6日 3:08
- 回答としてマーク xiaohu19740509 2020年12月7日 9:40
すべての返信
-
小出ししてすみませんが、
OS:WIN10 64bit
Visual Studio のバージョン:2010
.NET4.0、4.5
Coreは2-4個ぐらいです。
inputmanというミドルウエアを使っています。
他には特になしです。
よろしくお願い致します。
xiaohu
- 編集済み xiaohu19740509 2020年12月5日 12:13
-
> Coreは2-4個ぐらいです。
意味が分かりませんし、
> inputmanというミドルウエアを使っています。
そういう制約があるなら GrapeCity のサポートに聞くべきでは?
自分が提案できるのは DateTimePicker を使うことぐらいです。初期表示は普通のカレンダー表示ですが、下の画像の赤枠部分のクリックにより表示を変えることができます。- 編集済み SurferOnWww 2020年12月5日 13:11 訂正
-
-
こんな
Imports System Imports System.ComponentModel Imports System.Runtime.InteropServices Imports System.Windows.Forms Namespace WindowsFormsApp1 Public Class MonthPicker Inherits DateTimePicker Public Sub New() Me.Format = DateTimePickerFormat.Custom Me.CustomFormat = "yyyy/MM" End Sub Protected Overrides Sub OnDropDown(eventargs As EventArgs) MyBase.OnDropDown(eventargs) 'カレンダーを開いたら月選択に表示を変える Dim hwndCal As IntPtr = Win32API.SendMessage(MyBase.Handle, Win32API.DTM.DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero) Win32API.SendMessage(hwndCal, Win32API.MCM.MCM_SETCURRENTVIEW, IntPtr.Zero, New IntPtr(Win32API.MCMV.MCMV_YEAR)) End Sub Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = Win32API.WM.WM_NOFITY Then Dim nmhdr As Win32API.NMHDR = CType(Marshal.PtrToStructure(m.LParam, GetType(Win32API.NMHDR)), Win32API.NMHDR) Select Case (nmhdr.code) Case Win32API.MCN.MCN_VIEWCHANGE Dim nmvc As Win32API.NMVIEWCHANGE = CType(Marshal.PtrToStructure(m.LParam, GetType(Win32API.NMVIEWCHANGE)), Win32API.NMVIEWCHANGE) Select Case (nmvc.dwNewView) Case Win32API.MCMV.MCMV_MONTH '月内の日付選択になったらカレンダーを閉じる Win32API.SendMessage(MyBase.Handle, Win32API.DTM.DTM_CLOSEMONTHCAL, IntPtr.Zero, IntPtr.Zero) End Select End Select End If MyBase.WndProc(m) End Sub End Class Module Win32API <DllImport("user32.dll", CharSet:=CharSet.Auto)> Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function <StructLayout(LayoutKind.Sequential)> Public Structure NMVIEWCHANGE Public nmhdr As NMHDR Public dwOldView As UInteger Public dwNewView As UInteger End Structure <StructLayout(LayoutKind.Sequential)> Public Structure NMHDR Public hwndFrom As IntPtr Public idFrom As IntPtr Public code As Integer End Structure Public Enum WM WM_NOFITY = &H4E End Enum Public Enum DTM DTM_GETMONTHCAL = &H1008 DTM_CLOSEMONTHCAL = &H100D End Enum Public Enum MCM MCM_FIRST = &H1000 MCM_GETCURRENTVIEW = MCM_FIRST + 22 MCM_SETCURRENTVIEW = MCM_FIRST + 32 End Enum Public Enum MCN MCN_FIRST = -746 MCN_VIEWCHANGE = MCN_FIRST - 4 End Enum Public Enum MCMV MCMV_MONTH = 0 '日付選択 MCMV_YEAR = 1 '月選択 MCMV_DECADE = 2 '年選択 MCMV_CENTURY = 3 End Enum End Module End Namespace
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 AzuleanMVP, Moderator 2020年12月6日 3:08
- 回答としてマーク xiaohu19740509 2020年12月7日 9:40
-
gekka さんがサンプルを実装してくれているようなのでデバッグしつつ、コードの理解に努めた方が良いと思います。
個人的には、標準のコントロールできないことを要求された際のアクションとして、上司・先輩・同僚に相談して解決ではなく、インターネット上で尋ねている…という現状に危惧を抱きます。
- インターネット上の誰かの厚意を待つことになる(いわゆる丸投げ)ので、開発スピードの低下を招く
- 本来の実力以上のものを納品してしまうことで今後の要求も同程度以上になって、あなたの実力と要求のギャップが広がり、あなたの立場がますます悪くなるかもしれない
- サンプルや助言が提供されたとして、最終的にはあなたが成果物の責任を負うことになる
スキル・経験の不足を補う手段としてサンプルを動かして理解を深めることは良いと思いますが、上記に挙げたように、あなたが責任を持てるよう、かつ今後の開発に活かせるように読み解く努力を忘れないようにしてください。
-
xiaohu19740509さん、こんにちは。フォーラムオペレーターのKumoです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
本件、gekkaさんより参考になる投稿が寄せられたようでなによりです。
[回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。
お手数ですが、ご協力の程どうかよろしくお願いいたします。
引き続きMSDNフォーラムをご利用いただけますようお願い申し上げます。MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~