DOBON.NET DOBON.NETプログラミング掲示板過去ログ

カレンダーに休日表示したい

環境/言語:[Windows XP VB.NET(VS2002)]
分類:[.NET]

お早うございます。平ちゃんです。
いつも勉強させて頂いています。
すみませんがまた教えて下さい。

DateTimePicker で月間のカレンダーがドロップダウン表示されます。
このカレンダーに休日表示したいのですがいい方法はありますでしょうか?

土、日、祝日、会社の休日 を赤文字で赤丸で囲む等一般のカレンダーのイメージです。

サイズが小さいのでDateTimePickerがいいですが無理ならMonthCalendarでもOkです。

ご存知の方よろしくお願いします。
■No10378に返信(平ちゃんさんの記事)
> DateTimePicker で月間のカレンダーがドロップダウン表示されます。
> このカレンダーに休日表示したいのですがいい方法はありますでしょうか?

ないです。

> 土、日、祝日、会社の休日 を赤文字で赤丸で囲む等一般のカレンダーのイメージです。
> サイズが小さいのでDateTimePickerがいいですが無理ならMonthCalendarでもOkです。

MonthCalendarであるならば、AddAnnuallyBoldedDateメソッド辺りで表現された方が賢明かと思います。

> ご存知の方よろしくお願いします。

そういうコントロールを自作した方が早いと思いますよ。
2005/04/14(Thu) 09:47:03 編集(投稿者)

■No10382に返信(はいこ〜んさんの記事)


はいこ〜んさん 返信ありがとうございます。

>
> そういうコントロールを自作した方が早いと思いますよ。

MonthCalendar を継承したコントロールでは特定日の文字色を変更する方法がわかりません。
休日は赤 土曜日は青 ですね。
休日の赤丸は grf.DrawEllipse(pen, 20, 60, 15, 15) で座標、円の半径を適当に調整するといけそうです。

DateTimePickerを継承したコントロールでは赤丸も書けません。

何かありましたら宜しくお願いします。
■No10395に返信(平ちゃんさんの記事)
> MonthCalendar を継承したコントロールでは特定日の文字色を変更する方法がわかりません。
> 休日は赤 土曜日は青 ですね。
> 休日の赤丸は grf.DrawEllipse(pen, 20, 60, 15, 15) で座標、円の半径を適当に調整するといけそうです。
> DateTimePickerを継承したコントロールでは赤丸も書けません。
> 何かありましたら宜しくお願いします。

いや、何で継承という解釈を選択したんでしょ。
完全に自作した方が良いと言っているんですが。
まあ、それも自由ですけども。
■No10397に返信(はいこ〜んさんの記事)

はいこ〜んさん こんにちは

> いや、何で継承という解釈を選択したんでしょ。

実はMonthCalendarの機能はそのまま使いたかったものですから。

> 完全に自作した方が良いと言っているんですが。
> まあ、それも自由ですけども。


カレンダー表示以外の機能(MonthCalendarの機能)も必要ですので完全に自作となるとかなり大変かなと。

有難うございました。
適当なキーワードでググってみたのは勿論、 MSDN Library の Month Calendar Controls に関する項目等に目を通したり、いくつかのサイトのサンプルにも当ってみたのですけど−矢張りというか−思うような内容のものはなく、一度は諦めたのですが

コントロールの背景色を2色にわけたい
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=10070&rev=&no=0

で紹介されている内容に光明を見出しました。これを応用すれば実現できるのでは!?

 早速 実験してみました。内容は『 MonthCalendar を継承したクラスで土日曜列の文字色を変更する』というものです。
 結果は成功! 少し触った感じでは問題なさそうです♪
#実験なので諸々のプロパティを変更すると表示が崩れますけど(^_^;)

色を入れ替えて画像を描画する
http://dobon.net/vb/dotnet/graphics/setremaptable.html

を用いることで比較的簡単に実現できますので、よろしかったら一度試してみてくださいませ。


 尚、 C++ のコードを .NET に置き換える際、 THE CODE PROJECT にあった次のサンプルも参考にしました。これをご覧になれば、「比較的簡単に」と上述したのにも納得して頂けると思います。
#核になる部分はこのサンプルと大差ありませんので、私が実験に使用したコードは掲載しません。

Correct theme support for the .NET CheckBox control with FlatStyle = FlatStyle.System
http://www.codeproject.com/useritems/themedcombobox.asp



(補足+余談)
 DateTimePicker コントロールでドロップダウン表示されるカレンダーは Month Calendar なので、”頑張れば”こちらでも実現できそうな気はします。でもそこまでするなら、 C++ & MFC で開発したほうがすっきりするでしょうね。
 因みに、 DateTimePicker のカレンダー表示で週の開始曜日を指定することは可能※ですが、日付の太字表示はできないようです。 Month Calendar に MCS_DAYSTATE スタイルが設定されておらず、このスタイルは生成済みのウィンドウに対して設定できないようなので。
#そういった文献を見つけたわけではないのですけど、 SetWindowLong ( GWL_STYLE ) が成功しても変わらなかったので無理なのかなぁと。

※参考
DateTimePickerの週の開始曜日を変更する
http://www.sugi-family.net/papanvb/vbnet_tips.php?cate=23&tips=23001
2005/04/19(Tue) 20:29:17 編集(投稿者)

■No10532に返信(深山さんの記事)

いつも大変お世話になります。
自作コントロールを作るのか。それとも標準の Month Calendar に
赤丸、青丸の情けないカレンダーにするか。
踏ん切りがつかず悩んでいたところです。

いま書き込みを見たところで、確認は明日になりますが
とりあえず先にお礼申し上げます。
数日後に感想や結果をご報告させて頂きます。
有難うございます。!!
■No10532に返信(深山さんの記事)

深山さん こんばんは
いつもお世話になっています。

早速試しましたが、技術力の壁、プログラミング言語の壁、英語の壁が厳しく全然進展がありません。
お手数ですがアドバイスの程お願いします。

>
> コントロールの背景色を2色にわけたい
> http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=10070&rev=&no=0
>
> で紹介されている内容に光明を見出しました。これを応用すれば実現できるのでは!?
>
>  早速 実験してみました。内容は『 MonthCalendar を継承したクラスで土日曜列の文字色を変更する』というものです。
>  結果は成功! 少し触った感じでは問題なさそうです♪
> #実験なので諸々のプロパティを変更すると表示が崩れますけど(^_^;)

このサイトがどのように役立ったのでしようか?
CodeGuru: Using a bitmap as a background image
http://www.codeguru.com/Cpp/controls/treeview/misc-advanced/article.php/c679

@  これに書いてあることはBitmapでマスクをつくり変更が必要な部分書き換える方法と思います。

次に

> 色を入れ替えて画像を描画する
> http://dobon.net/vb/dotnet/graphics/setremaptable.html
>

A  Bitmap 上の特定の色を変更する  (これは解りやすいので特に問題はないです。)

次に

>  尚、 C++ のコードを .NET に置き換える際、 THE CODE PROJECT にあった次のサンプルも参考にしました。これをご覧になれば、「比較的簡単に」と上述したのにも納得して頂けると思います。
> #核になる部分はこのサンプルと大差ありませんので、私が実験に使用したコードは掲載しません。
>
> Correct theme support for the .NET CheckBox control with FlatStyle = FlatStyle.System
> http://www.codeproject.com/useritems/themedcombobox.asp


B  このサンプルは実際に動作させまして、チェックボックスコントロールを透明にする方法である確認はできました。


さて問題は @ABをどのようにすると『 MonthCalendar を継承したクラスで土日曜列の文字色を変更する』になったのでしょうか?

  MonthCalendar の Bitmap をつくる  Bが役立つ
  Bitmap 上の特定の色を変更する  @ A が役立つ

という事でよいのでしょうか?
基本的なところが解らず行き詰りました。


> (補足+余談)
>  DateTimePicker コントロールでドロップダウン表示されるカレンダーは Month Calendar なので、”頑張れば”こちらでも実現できそうな気はします。でもそこまでするなら、 C++ & MFC で開発したほうがすっきりするでしょうね。
>  因みに、 DateTimePicker のカレンダー表示で週の開始曜日を指定することは可能※ですが、日付の太字表示はできないようです。 Month Calendar に MCS_DAYSTATE スタイルが設定されておらず、このスタイルは生成済みのウィンドウに対して設定できないようなので。
> #そういった文献を見つけたわけではないのですけど、 SetWindowLong ( GWL_STYLE ) が成功しても変わらなかったので無理なのかなぁと。
>
> ※参考
> DateTimePickerの週の開始曜日を変更する
> http://www.sugi-family.net/papanvb/vbnet_tips.php?cate=23&tips=23001


お手数ですが宜しくお願いします。
2005/04/21(Thu) 01:43:51 編集(投稿者)

#丸数字は機種依存文字なので、丸括弧に書き換えています。

>   MonthCalendar の Bitmap をつくる  (3)が役立つ
>   Bitmap 上の特定の色を変更する  (1) (2) が役立つ
> という事でよいのでしょうか?

 少し違います
>> C++ のコードを .NET に置き換える際 ( 中略 ) 参考にしました。
と書いた通り、本質的には (1) = (3) であり、平ちゃんさんの仰るように『 MonthCalendar の Bitmap を取得する』というのがポイントとなります。
# C++ のソース (1) だけでは解析が困難かも知れないと思い (3) を併記したのですけど、混乱させただけになってしまったようですね。申し訳ありませんm(__)m


> このサイトがどのように役立ったのでしようか?
> CodeGuru: Using a bitmap as a background image
> http://www.codeguru.com/Cpp/controls/treeview/misc-advanced/article.php/c679

 然程詳しくないので誤りがあるかも知れませんが、私は処理の流れを次のように理解しました。

  1. Bitmap を用意する
  2. ( Window ではなく ) Bitmap の DC を用いて標準の描画を行う
  3. 標準の描画がされた Bitmap を加工する
  4. Window の DC を用いて加工した Bitmap の描画を行う

 私にとってこの 1 、 2 の手順は目から鱗でした。標準の描画内容が取得できるのなら、それを加工するのは難しいことではありません。 3 の内容を変えてやれば色々できそうだと思ったのです。

 ということで
> さて問題は (1)(2)(3)をどのようにすると『 MonthCalendar を継承したクラスで土日曜列の文字色を変更する』になったのでしょうか?
に対する答えにもなっていると思うのですけど、どうでしょうか?



(追記)
 必要ない気もしますけど、 (2) について少し補足。
 Graphics.DrawImage メソッドには多数のオーバーロードがあります。範囲を指定して色変換した描画を行うことで、特定の曜日列だけ文字色を変えることができるわけです。
■No10571に返信(深山さんの記事)

こんばんは 平ちゃんです。

無事完成しました。(ニコニコです)
当初の予定通り MonthCalendar で土曜日は青、日曜日祝祭日は赤文字です。
当然休日の赤丸もつけられますが、見づらくなるので仕様検討中です。

深山さんのアドバイスは全て的確でした。
どれが抜けてもだめだったでしょう。


> # C++ のソース (1) だけでは解析が困難かも知れないと思い (3) を併記したのですけど、混乱させただけになってしまったようですね。申し訳ありませんm(__)m

とんでもないです。これが無ければ全く無理でした。

> (追記)
>  必要ない気もしますけど、 (2) について少し補足。
>  Graphics.DrawImage メソッドには多数のオーバーロードがあります。範囲を指定して色変換した描画を行うことで、特定の曜日列だけ文字色を変えることができるわけです。

いえいえ 助かりました。


#今回もすごく勉強させて頂き感謝しております。


大変有難うございました。今後とも宜しくお願いします。
解決済み!
環境/言語:[Visual Studio 2003 DE C#]
分類:[.NET]

現在VS2003のC#でmonthCalendarの週末の色の事で検索し、ここにたどり着きました、
土曜を青色で日曜を赤色、できれば祝日を赤、
もしくは別色で表示させたいと思っているのですが、
掲示板の内容が高度で理解ができませんでした。

できましたらソースを交えて解説していただけないでしょうか?
よろしくお願いします。

DOBON.NET | プログラミング道 | プログラミング掲示板