Visual Basic 6.0 初級講座 |
第12回 オプションボタンとチェックボックスとフレーム
アプリケーションを作っているとユーザー(そのアプリケーションを使う人)に、いくつかの中から選択してもらいたいことがあるでしょう。たとえば「はい」か「いいえ」か、「男」か「女」か、あるいは「日本人」か「中国人」か「韓国人」か「ベトナム人」か・・・・。今回はそんなときにつかえるオプションボタンとチェックボタンについてやります。
オプションボタンとチェックボタンのアイコンは下の画像で確認してください。
オプションボタンは、複数の項目の中から一つを選択してもらうときに使います。機能は単純ですからこれ以上の説明は具体的な使い方を見ながら説明していきます。それで、いきなりプログラムを作ってもらいましょう。
三角形を色でぬりつぶすプログラムです。何色(なにいろ)で塗りつぶすかをユーザーにオプションボタンから選んでもらうことにします。
まず、三角形を描かなければいけませんが、これはLineメソッドを3回使うことにしましょう。
具体的には次のようになります。
Line (3000, 500)-(1000, 3964) Line -(5000, 3964) Line -(3000, 500) |
念のために復習しておくとLineメソッドは2つの点を結ぶ線を引くのでしたね。たとえば、最初のLine (3000, 500)-(1000, 3964)は「点(3000,500)から点(1000,3964)を線で結べ」という意味になるのでした。点を意味する数字は「座標」で、フォームの左上を座標(0,0)で表すと言うことでした。覚えていましたか?
ところで、2行目と3行目のLineメソッドは点が1つずつしか示されていません。実はLineメソッドは初めの点を省略することができるのです。省略した場合は最後にたどり着いた点から描き始めます。つまり、2行目はLine (1000, 3964)-(5000, 3964)と書くのと全く同じです。
それから、この3964というのは別に適当でも良かったのですが、せっかくだから正三角形にしようと思って私が座標を計算した結果です。この計算の方法は中学3年生で習います。
一応理由を書いておくと、正三角形は30度、60度、90度の直角三角形2つに分けることができて、この直角三角形の辺の比は 1:2:√3(1.7320508・・・)となることを利用しているのです。
さて、それでは具体的な手順に入りましょう。フォームをダブルクリックして、次のようにコーディング(プログラム)してください。
Private Sub Form_Load() Form1.AutoRedraw = True
Line (3000, 500)-(1000, 3964)
|
正三角形を描く部分はすでに説明したとおりです。Form1.AutoRedraw = True は「描かれた物を記憶せよ」という命令です。これがないとForm_Load()プロシージャでは絵が描けないのです(この辺も機会があったらまた詳しくやりましょう。今は覚えて置いてください)。
この段階で実行してみると、なるほど、正三角形が書かれているでしょう?
それでは、いよいよオプションボタンを配置します。まず、一つ目のオプションボタンを配置してください。このとき正三角形が書かれる場所に配置するとじゃまですからもっと右の方がよいでしょう。配置したら名前はそのままでCaptionプロパティを 赤 にしてください。プロパティの変更の仕方はもう大丈夫でしょう。右にあるプロパティウィンドウから変更するのでしたね。(プロパティウィンドウの画像)
次に後2つオプションボタンを配置して Captionプロパティをそれぞれ 青 、 黄色 にしてください。
それが終わったらコマンドボタンを一つ配置して こちらはCaptionを 色を塗る にします。最後にもう一度一つ目のオプションボタン(「赤」にしたやつ)に戻って、Valueプロパティを TRUE にしてください。これがチェックを表します。つまりこのプログラムは「赤」を選択した状態から始まるわけです。
それではコマンドボタンをクリックしたら色を塗りつぶすようなプログラムをしましょう!
「三角形の中を色でぬれ」という命令は何という命令でしょうか?VB以前のN88-BASICというものではPAINT命令を使うと指定した図形の中を指定した色でぬってくれました。VB(VISUAL BASIC)ではどうでしょうか?
実は私もVBを始めた頃PAINT命令ができないのにおどろきました。なんと、VBには「三角形の中を色でぬれ」という命令はないのです!
そこで、とても初級編とは言えないのですが、VBから命令することをあきらめて、Windows(ウィンドウズ)に直接命令を出して三角形の中を色でぬらせることにします。そうなんです。VBはWindows(ウィンドウズ)に直接命令することもできるのです。このような命令は API と呼ばれます。
とはいっても、初級編なので API についての細かいことは言いません。これから説明するようにプログラミングしてみてください。今日のメインはあくまでオプションボタンとチェックボタンですから。
1.フォームをダブルクリックして、一番上の行に次のように打ち込んでください。これは必ず一番上の行にしてくださいよ!
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
なんだか、すごく長いのでこのままこれをコピーして、貼り付ければいいでしょう。また、1行で表示できないので、多分この画面では2行か3行に表示されていると思いますが、打ち込むときは1行で打ち込んでください。
APIを使うにはこんなに長ったらしいことを書かなければいけないのです。
2.さらに、その下に続けてこうプログラムしてください。
Private Function Paint(X As Long, Y As Long)
Dim T
T = Screen.TwipsPerPixelX
ExtFloodFill Me.hdc, X / T, Y / T, vbBlack, 0
Me.Refresh
End Functionこのコードは自分でPaintメソッドを作るコードです。自分でメソッドやプロパティを作ることもできるのですね。今回は指定した座標をかこむ部分をぬりつぶす機能をプログラムしましたが、APIと関係のある処理なので詳しい説明は省略します。必ずこの通りに打ってください。(なお、黒でかこまれている部分だけがぬりつぶされます。赤で正三角形を書いたり、すきまがあいていたりしたらぬりつぶされませんので注意)
3.これで準備はできました。あとはコードで 自分で作ったPaintメソッドを使うだけで塗りつぶしてくれます。ここでは、下のように打ってみましょう。
Private Sub Command1_Click() Me.FillColor = vbRed '赤いペンを持つ
Paint 3000,3000 'ここで自作のPaintメソッドを呼び出している。
End Sub
「Me.FillColor = vbRed」について少し補足します。MeというのはForm1のことです(前にやりました)。FillColorプロパティは「ペンの色」を表すと思ってください。これから、三角形をぬりつぶすので色のついたペンを使う必要があったのです。ペンの色はvbRed(赤)です。vbRedはRGB(255,0,0)としても同じです。
4.(補遺)以上の準備にもかかわらずこれだけでは色をぬってくれません。フォームには色の塗り方を指定するプロパティがあって最初それが 1 - 透明 になっているからです。これはFillStyle(フィルスタイル)プロパティで、今回の用に色を塗るプログラムを作るときはこの値を 0 - 塗りつぶし にしておく必要があります。この部分はプロパテティウィンドウから手動で変更しても良いのですが今回はコードで変更しておきます。Form_Loadプロシージャの中にどこでもいいのでForm1.FillStyle = 0 の1行を追加しておいてください。
長くなってきたので、ここまでのコードを打ち込んだ全体をのせておきます。
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long |
Private Sub Command1_Click() Me.FillColor = vbRed Paint 3000, 3000 End Sub |
Private Function Paint(X As Long, Y As Long) Dim T T = Screen.TwipsPerPixelX ExtFloodFill Me.hdc, X / T, Y / T, vbBlack, 0 Me.Refresh End Function |
Private Sub Form_Load() Form1.AutoRedraw = True Form1.FillStyle = 0
Line (3000, 500)-(1000, 3964) |
これでAPIの部分は完成しました。しかしあわてて実行しないようにして下さいよ。というのもAPIを使用するときにエラーがあるとひどいときにはWindowsが狂ってしまうときがあるからです。今回はそんなに危険な処理はしていませんが、APIを使っているときは「実行する前に保存する」ようにしましょう。
保存したら、実行してみてください。コマンドボタンを押すと、正三角形が赤く塗りつぶされたでしょう!
ここまででとりあえず三角形を塗りつぶすプログラムは完成しましたが、まだ今回のメインであるオプションボタンで色を選択する部分は完成していません。最後にこの部分を完成させましょう。
どのオプションボタンが選択されているかによってペンの色を変えるようにプログラムすればいいわけです。ペンの色はMe.FillColorで設定するのです。問題は「どのオプションボタンが選択されているかどうやったらわかるか」と言うことです。
結論から言うとオプションボタンのValueプロパティを使うとわかります。選択されているオプションボタンのValueプロパティはTrueになっていて、選択されていないオプションボタンではFalseになっています。
「もし、オプションボタン1が選択されていたらペンの色を赤にしろ」という命令は
If Option1.Value = True Then Me.FillColor = vbRed |
となります。あとは、「もし、オプションボタン2が選択されていたらペンの色を青にしろ」とオプションボタン3が選択されていたらペンの色を黄色にしろ」の部分を完成させれば終わりです。
具体的にはコマンドボタンをクリックしてCommand1_Click()プロシージャを次のようになおして下さい。
Private Sub Command1_Click() If Option1.Value = True Then Me.FillColor = vbRed If Option2.Value = True Then Me.FillColor = vbBlue If Option3.Value = True Then Me.FillColor = vbYellow Paint 3000, 3000 End Sub |
できたら、実行してください。選択するオプションボタンが違うと塗りつぶす色もちがくなるのが分かるでしょう?
それにしても苦労しましたね。やっぱり正三角形を書いたり、APIを使ったりちょっとよけいなことが多かったかもしれません。
赤、青、黄色から色を選んで塗りつぶすというプログラムはようやく完成しました。しかし安心しては行けません。1つしか選べないと言うのは困るときもあります。たとえば、「男」か「女」かを選んでもらい、その他に「小学生」か「中学生」か「高校生」を選んでもらいたいときがあるとしましょう。どうしたらよいでしょう。
ためしに「男」「女」「小学生」「中学生」「高校生」と書いた5つのオプションボタンを配置して実行してみると、この5つの中から1つしか選べないことが分かります。「男」を選んでから「中学生」をえらぶと、「男」のチェックがはずれてしますでしょう。
こんなときはフレームを使います。フレームもコントロールの一つです。このページの上の方にある画像でアイコンを確認してください。それでは新しくプログラムしましょう。
フォームに一つフレームを配置します。少し大きめにしてください。そして、その中にオプションボタンを2つ配置してCaptionを「男」と「女」にしてください。
次に、また別のフレームを配置して、その中に3つのオプションボタンを配置して「小学生」「中学生」「高校生」と表示されるようにします。以上で終わりです。
実行してみると、「男」「女」から1つ、「小学生」「中学生」「高校生」から1つと合計2つえらべるようになっていますね。このようにフレームを使うとオプションボタンをグループ化できるので覚えて置いてください。それにフレームってなんだかみかけもかっこいい。もちろんフレームにも Captionプロパティがありますから、「性別」とか「学年」とか表示させればかっこもつくでしょう。
ここまでで疲れていると思うので、チェックボックスの説明は簡単にします。チェックボックスの使い方はオプションボタンとほとんど同じです。違いはオプションボタンは1つだけを選択させるときに使うのに対して、チェック ボックスはいくつでも選択できる点です。たとえば「小学生」「中学生」「高校生」の中から2つ選択されると困るのでこのときはオプションボタンを使います。しかし好きな教科を聞くときに「国語」「社会」「算数」「理科」「体育」「音楽」から1つしか選択できないとなると困るでしょう。この場合はいくつでも選択していいことにすべきなのでチェック ボックスを使うわけです。
このようにチェックボックスは初めからいくつでも選択できるのでフレームを使ってグループ化する必要はありませんが、フレームを使ってかっこよくまとめたい場合には使ってもいいでしょう。
また、オプションボタンとの重要な違いは、選択されているかどうか調べる方法の違いです。
オプションボタン(Option1)が選択されているかどうかは、
If Option1.Value = True Then ・・・ で判断しましたが、
チェックボックスが(Check1)が選択されているかどうかは、
If Check1.Value = vbChecked Then ・・・ で判断します。
True ではなく vbChecked が選択されている状態を表すのです。選択されていない状態もFalse ではなく vbUnChecked です。この点に気をつけてください。
それでは、三角形を四角形や円にしていろいろ楽しんでみて下さい。次回は多分スクロールバーについてやるつもりです。
では。