この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.7 顧客情報の印刷処理
●Win32APIを使ってユーザーにプリンタを選択させる

○実際の実装
 では,説明はこのぐらいにして,具体的な実装に移ろう。今回は[印刷]または[プリンタの設定]ダイアログボックスを表示するために,List 7-58に示すPrintSetupというプロシージャを実装する。PrinterSetupプロシージャは,次のような書式を持つ。

PrintSetup(表示方法を示すフラグ, _
           親となるフォームのハンドル)

 表示方法を示すフラグには,PRINTDLG構造体のFlagsメンバの値を指定する(Table 7-18を参照)。この引数にPD_PRINTSETUP定数を指定すると[プリンタの設定]ダイアログボックスが表示される。親となるフォームのハンドルには,[印刷]または[プリンタの設定]ダイアログボックスの親となるフォームのハンドルを指定する。これには,Me.hWndを指定すればよい。

 PrintSetupプロシージャは,[印刷]または[プリンタの設定]ダイアログボックスを表示し,ユーザーが設定したプリンタならびに用紙設定をPrinterオブジェクトに反映させるという機能を持つ。つまり,このプロシージャさえ呼び出せば,それだけでプリンタの設定が変更されるようになる。

 さて,今回のアプリケーションでは,「●メニュー項目の設定」で説明したとおり,メニューから[ファイル]−[プリンタの設定]を選択したときに[プリンタの設定]ダイアログボックスを表示するようにしたい。Table 7-3に示したように,[プリンタの設定]メニューにはMenu_Printerという名前を付けた。そこで,そのメニューが選択されたときに実行されるMenu_Printer_ClickプロシージャをList 7-59のように実装する。List 7-59は,List 7-58で示したPrintSetupプロシージャを呼び出すだけの内容となっている。

  COLUMN    Visual BasicでWin32APIを使う方法

 今回は,Win32APIを使ってプリンタを設定する方法について説明してきたわけだが,ここでWin32APIを使うための情報収集について説明しておく。

 まず,Visual BasicでWin32APIを使うときに必要となるのが,Win32API関数のDeclare宣言や利用する構造体のType宣言などである。これらの宣言は,Visual Basicに付属している「APIビューア」を使うことで参照できる(Fig.7-66)。

Fig.7-66 APIビューア
fig7_66

 実際,本文中に示した関数や構造体の宣言は,APIビューアを使って取得したものを示しているにすぎない。ただしAPIビューアは,実際にはWin32API.TXTというファイルを参照して表示しているだけである。そのため,Win32API.TXTに記されていない,Windws 98やWindows 2000などに新規搭載された比較的新しい関数や構造体は表示することができない。また,一部の定数にヌケがあるのも事実である。

 もし新しい関数や構造体を使いたいのであれば,自らDeclare宣言やType宣言を記述しなければならない。その際には,Platform SDKのドキュメントを参照することになる。Platform SDKはVisual Studioに付属するMSDNライブラリにも含まれているが,単体でMicrosoftのMSDNのホームページから取得することもできる。

 関数のDeclare宣言は,Platform SDKのドキュメントを読めば何とかなるのだが,問題は定数の宣言である。Platform SDKのドキュメントには関数の書式や定数などは記載されているが,定数の値までは表記されていない。そのため,定数の値を調べるために,C言語のヘッダファイルを参照しなければならないこともある。

 それには,C言語の知識も必要となってくるが,定数値を調べたいだけであれば比較的簡単である。まず,調べたい定数の文字列を検索する。C言語のヘッダファイルは,拡張子が「.h」になっているので,Platform SDKがインストールされたフォルダのなかにあるincludeフォルダから「.h」の拡張子を持つファイルを検索すればよい。すると,その定義を見つけることができるはずである。たとえば,GlobalAlloc関数の引数として使うGMEM_MOVEABLEという定数は,winbase.hファイルに次のように宣言されている。

#define GMEM_MOVEABLE       0x0002

 C言語では,0x0002のように0xから始まるものは16進数を示す。よって,この定数をVisual Basicで使いたいのであれば,次のように宣言すればよい。

Const GMEM_MOVEABLE = &H0002

 Visual Basicで開発する際,もしVisual Basicでできる処理であれば,極力Visual Basicのみで処理したほうがよい。Win32 APIを使うのは,最終手段だと考えてほしい。Win32 APIを使うと,開発は難しくなるし,Visual Basicのデバッガを使ったときの相性も悪く,デバッガを使うと暴走することもある。

 とはいえ,今回説明したプリンタの処理のように,Win32APIを使わないと実現できない処理があるのも事実である。そのようなときに備え,Visual Basicのプログラマであっても,少々はWin32 APIの知識を修得しておいたほうがよいだろう。

Prev 64/134 Next