Visual Basic 6.0 テクニック
VB6対応

 

Visual Basic 中学校 > VB6 テクニック >

4.ワンポイントテクニック

 

今回は互いに関連のない、ちょっとしたテクニックを紹介します。

 

1.コマンドボタンに画像や色をつける

 

通常の設定では、コマンドボタンには色を付けたり画像を表示させたりすることはできませんが、Styleプロパティを1にすることで可能になります。

色を付けるには、Styleプロパティを1にした後でBackColorプロパティを変更します。画像を表示するには、ピクチャーボックスなどと同様にPictureプロパティを使います。

 

2.ESCキーでプログラムの実行を終了させる

 

フォーム上にコマンドボタンを配置して、CancelプロパティをTrueにします。そうすると、ESCキーを押したときには自動的にこのボタンのクリックイベントプロシージャが呼び出されますから、そこに一言ENDと記述すれば終わりです。

しかし、フォーム上にこのためのコマンドボタンを配置したくない場合もあるでしょう。そんなときはこのコマンドボタンをユーザーの目に触れないようにすることで目的を達成することができます。といってもVisibleプロパティをFalseにするのではありません。VisibleプロパティをFalseにするとESCキーを押しても反応してくれません。

解決策はフォームのResizeイベントプロシージャに次のように記載することです。(なお、目的のボタンの名前をCmdESCとしています。)

VB6

Private Sub Form_Resize()

CmdEsc.Left = Me.Width

End Sub

おわかりでしょうか?このテクニックを使うともっと便利なことができます。それは次をご覧下さい。

 

3.ショートカットキーを設定する

 

メニューエディタを使えば簡単にショートカットキーを設定できます。しかし、メニューを使いたくない場合はどうしたらよいでしょう。

1つの方法はフォームのKeyPreviewプロパティをTrueにしてキー入力を一括してトラップする方法です。これでも全く問題はないのですがショートカットキーの数が多いとコードがごちゃごちゃしてきて嫌な物です。

そこで、今回はコマンドボタンを使う方法を説明します。コマンドボタンはCaptionプロパティに 終了(&Q) のように入力すると、Alt + Q でそのコマンドボタンにアクセスできるようになります。この機能を利用して次のようなサンプルを作ってみました。フォーム上にコマンドボタンは表示されないのでユーザーにはコマンドボタンを呼び出しているという感覚はありません。

Command1のCpationプロパティを (&C) にしておいてください。

VB6

Private Sub Command1_Click()

MsgBox "Command1が呼び出されました。"

End Sub

Private Sub Form_Resize()

Command1.Left = Me.Width

End Sub

これで、このプログラムは、Alt + C でメッセージが表示されるようになります。もちろんコマンドボタンは見えていません。

 

4.右クリックでポップアップメニューを呼び出す

 

Windowsの通常のアプリケーションは右クリックをするとポップアップメニューという物が出現します。よくあるのは、コピー、切り取り、貼り付け、キャンセルですね。このようなポップアップメニューはVBでも簡単に呼び出せるのですが、なぜか知らない人が多いようです。

まず、呼び出されるメニューを作っておきましょう。メニューエディタを使って、次のように打ち込んでみてください。

親メニュー 名前 キャプション 備考
  mnuPopup ポップアップ 表示チェックボックスをオフにします。
mnuPopup mnuJapanese 日本語  
mnuPopup mnuEnglish 英語  

親メニューに書いてあるようにmnuJapanesemnuEnglishmnuPopupのサブメニューとしてください。メニューエディタでサブメニューをつくるにはサブメニューにしたい項目の所で「→」ボタンをクリックします。サブメニューになっている項目はメニューエディタ上では先頭に「・・・・」が付いて表示されます。

なお、メニューが普段から表示されていは具合の悪い場合は、やはりメニューエディタでそのメニューを非表示にすることもできます。

さて、このメニューを呼び出すにはフォームのPopupMenuメソッドを呼び出すだけです。たとえば、

VB6


Me.PopupMenu mnuPopup
 

とするだけでよいのです。

以上で要点の解説は終わりですが、念のため右クリックメニューを使ったサンプルプログラムの全文を紹介しておきます。上の表のようなメニューをあらかじめ作成しておいてください。

VB6

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

'もし、クリックされたのが右ボタンならポップアップメニューを表示する。

If Button = vbRightButton Then
    Me.PopupMenu mnuPopup
End If

End Sub

Private Sub mnuJapanese_Click()

MsgBox "こんにちは!" & vbNewLine & "日本の首都は東京です。"

End Sub

Private Sub mnuEnglish_Click

MsgBox "Hello!" & vbNewLine & "The American capital is WashingtonDC."

End Sub

 

 

5.タイトルバーのないフォームでもポップアップメニューを表示する

 

フォームのBorderStyleプロパティを0にすると、タイトルバーがなくなります。詳しいことは分からないのですが、タイトルバーがないとメニューも設定できないようです。メニューが設定できないとポップアップメニューも作成できません!(BorderStyleが0のフォームにメニューを設定するとタイトルバーが出現する。これはVBのバグか?)

しかし、ご安心。ポップアップメニューは他のフォームのメニューを呼び出しても良いのです。たとえば、次の例では、Form2からForm1のmnuPopメニューをポップアップメニューとして呼び出します。

VB6


Form2.PopupMenu Form1.mnuPop
 

ただ、これをやるとフォームをまたいだ処理をしなければならないのでちょっと面倒くさいです。

 

6.プログラムの実行を指定した時間だけ中断させる

 

理由は様々ですがプログラム中に実行をごく短い時間だけ中断したい場合があります。中断をしないとプログラムの実行速度が速すぎて不都合な場合もあると言うことです。また、ユーザとの関係で中断を使用したい場合もあるかもしれません。

さて、プログラムの実行を中断させるもっとも有名な方法はSleep関数を使う方法です。Sleep関数はミリ秒で時間を指定してその間のプログラムの実行を中断します。(1000ミリ秒=1秒)。

Sleep関数はAPI関数なので使用する前に宣言する必要があります。その宣言は次のようになります。

VB6


Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
 

宣言さえしてしまえば使用は簡単です。次の例はプログラムに実行を3秒間停止させます。

VB6


Sleep 3000
 

しかし、Sleep関数では事足りない場合もあります。というのはSleep関数はプログラムの実行を完全に中断してしまうので一部分だけ停止したいという場合には不向きなのです。

考えられるのはある処理を一時中断したいけれどもその間にもユーザーがコマンドボタンをクリックするなど別の動作は行えるようにしたい等の場合です。

そんなとき、私は次のようなWait関数を使っています。この関数は私が作った物です。使用したい場合はこれと同じように記述してください。

VB6

Private Sub Wait (WaitTime As Single)

Dim FirstTime As Single
Dim
NowTime As Single

FirstTime = Timer()

Do

NowTime = Timer()
DoEvents

Loop While (NowTime - FirstTime < WaitTime)

End Sub

これを記述してしまえば後は簡単です。次の例ではプロシージャの実行を3秒間停止させます。

VB6


Wait 3
 

簡単に解説しておきますと、Timer関数はVBの組み込み関数で午前0時からの経過時間を秒単位で返します(ただし、小数部を見ればもっと細かい時間も取得できます)。そこでTimer関数をループで呼び出して指定した時間が経過すればループを脱出するということです。このときDoEventsをループ内に挿入し忘れるとそのプログラムどころかパソコンのCPUを指定時間占拠してしまうので注意してください。

最後に一つ問題点を指摘しておきます。Timer関数は午前0時からの経過秒を返す関数なので、このWait関数の実行が日をまたぐとやばいことになります(永遠にループすることになります)。

 

7.VBでディスプレイ全体を占領する

 

ビジネスアプリケーションなどでは不必要なことですが、VBで画面全体を占領したい場合もあります。たとえばゲームを作るときやスクリーンセーバーを作るときです。フォームのWindowStateを2にすれば最大化はできますが、タスクバーやタイトルバーは表示されたままです。

さて、問題の解決法はとても簡単ですプロパティをちょっといじるだけで済みます。VBで画面全体を占領するためには次の2つのプロパティを指定してください。

BorderStyle    0  なし

WindowState    2  最大化

この2つを設定してプログラムを実行すると期待通りVBで画面全体を占領することができます。占領して何をするかはみなさん次第です。いろいろおもしろいことができそうですよね。

ところで、これだけだとプログラムを終了させる方法がないので気をつけてください。(ちなみにCtrl + Break(Pause)キーでプログラムの実行を強制中断できます)。