レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API ペンの概要

ペンとは、 Microsoft(R) Windows(TM) 用のアプリケーションが直線や曲線を描画するのに使うグラフィック ツールです。描画アプリケーションでは、 ペンを使って、 フリーハンドの線、 直線、 曲線を描画します。CADアプリケーションでは、 ペンを使って、 外形線、 隠れ線、 破断線、 中心線などを描画します。ワード プロセッサ アプリケーションやDTPアプリケーションは、 ペンを使って枠や罫線を描画します。表計算アプリケーションは、 ペンを使って、 グラフの傾向を示したり、 棒グラフや円グラフの輪郭を描画します。

ペンには、 コスメティックとジオメトリックの2種類があります。「コスメティック ペン」は、 固定幅の直線を高速に描画しなければならないときに使います。たとえば、 CADアプリケーションでは、 スケール係数にかかわらず、 0.015インチから0.022インチまでの隠れ線、 破断線、 中心線、 寸法線をコスメティック ペンで描画します。「ジオメトリック ペン」は、 線をスケール変更したり、 線の端や接合部分に特殊な処理を施したり、 幅が2ピクセル以上の線を描画するのに使います。たとえば、 表計算アプリケーションは、 棒グラフの各棒をジオメトリック ペンを使って幅広線として定義します。

次に示すトピックでは、 ペンについて説明しています。

コスメティック ペン

ジオメトリック ペン

ペンの属性

ペンの使用

ダイアログ ボックス テンプレートの修正

ダイアログ ボックス入力の処理

ペン関数

 

 

コスメティック ペン

コスメティック ペンの寸法は、 デバイス単位で指定します。このため、 コスメティック ペンで描画する線は常に固定幅です。一般に、 コスメティック ペンによる線の描画は、 ジオメトリック ペンによる描画の3倍から10倍高速です。コスメティック ペンには、 幅、 スタイル、 色の3つの属性があります。これらの属性について詳しくはペンの属性を参照してください。

コスメティック ペンを取得するには、 CreatePen関数、 CreatePenIndirect関数、 ExtCreatePen関数を使います。ウィンドウ マネージャが管理する3つの「ストック」 コスメティック ペンのいずれかを取得するには、 GetStockObject関数を使います。

ペンを作成したら (または、 ストック ペンのいずれかを識別するハンドルを取得したら)、 SelectObjectを呼び出して、 ペンをアプリケーションのデバイス コンテキストで選択します。これによって、 クライアント領域での線描画操作でそのペンが使われるようになります。

 

 

ジオメトリック ペン

ジオメトリック ペンの寸法は、 論理単位で指定します。このため、 ジオメトリック ペンで描画する線はスケール変更されます。つまり、 現在のワールド座標変換によって、 線の幅は異なります。ワールド変換について詳しくは、 座標空間および座標変換を参照してください。

ジオメトリック ペンには、 コスメティック ペンと同じ3つの属性 (幅、 スタイル、 色) のほかに、 パターン、 オプションのハッチ、 端点のスタイル、 接合のスタイルの4つの属性があります。これらの属性について詳しくは、 ペンの属性を参照してください。

ジオメトリック ペンを作成するには、 ExtCreatePen関数を使います。コスメティック ペンと同様に、 SelectObject関数を使ってジオメトリック ペンをアプリケーションのデバイス コンテキストで選択できます。

 

 

ペンの属性

ペンの種類と特徴を定義する属性には、 幅、 スタイル、 色、 パターン、 ハッチ、 端点のスタイル、 接合のスタイルの7つがあります。幅、 スタイル、 色の3つの属性は、 コスメティック ペンとジオメトリック ペンの両方にあります。パターン、 ハッチ、 端点のスタイル、 接合のスタイルの4つの属性は、 ジオメトリック ペンにしかありません。通常、 パターン属性とオプションのハッチ属性はブラシで使われますが、 ジオメトリック ペンでも使えます。

 

コスメティック ペンの場合、 幅属性は、 デバイス単位での幅を示します。しかし、 ジオメトリック ペンの場合は、 論理単位でのペン幅を示します。デバイス単位について詳しくは、 座標空間および座標変換の概要を参照してください。

現在、 Windowsは、 コスメティック ペンの幅を1ピクセルに限定しています。しかし、 将来のバージョンではこの制限はなくなる可能性があります。

 

スタイル

スタイル属性は、 特定のコスメティック ペンやジオメトリック ペンを使ったときに表示される線パターンを示します。8種類のペン スタイルがすでに定義されています。次の図は、 Windowsが定義している属性のうち7つを示しています。

コスメティック ペンの場合、 枠内スタイルは実線スタイルと同じです。しかし、 描画関数が幅が1ピクセルより大きいジオメトリック ペンを使って塗りつぶしオブジェクトのまわりの境界線を描画する場合、 Windowsは、 境界線をオブジェクトの枠の内側に描画します。アプリケーションは、 枠内スタイルを使って、 ジオメトリック ペンの幅にかかわらず、 オブジェクトが指定した寸法内に収まるようにできます。

Windowsが定義している7つのスタイルのほかに、 アプリケーションが定義する8番目のスタイルがあります。アプリケーション定義スタイルによって、 点線や破線を自由に組み合わせた線を生成できます。

Windows定義のスタイルを持つペンを作成するには、 CreatePen関数、 CreatePenIndirect関数、 ExtCreatePen関数を使います。アプリケーション定義スタイルを持つペンを作成するには、 ExtCreatePen関数を使います。

 

色属性は、 ペンの色を示します。特定の色のコスメティック ペンを作成するには、 必要な色の赤、 緑、 青 (RGB) の値の組み合わせをCOLORREF構造体に設定して、 その構造体のアドレスをCreatePen関数、 CreatePenIndirect関数、 ExtCreatePen関数に渡します (ストック ペンは、 黒、 白、 不可視にしかできません) RGB値の組み合わせと色について、 詳しくは色の概要を参照してください。

 

パターン

パターン属性は、 ジオメトリック ペンのパターンを示します。

次の図は、 さまざまなジオメトリック ペンで描画した線を示しています。各ペンは、 それぞれ異なるパターン属性で作成されています。

上の図の最初の線は、 6種類の利用可能なハッチ パターンの1つを使って描画されています。ハッチ パターンについて、 詳しくは「ハッチ」を参照してください。2番目の線は、 中空パターン (NULLパターンと同じ) で描画されています。3番目の線は、 8x8ピクセルのビットマップから作成したカスタム パターンで描画されています。(ビットマップとその作成方法について、 詳しくはビットマップの概要を参照してください) 4番目の線は、 ソリッド パターンで描画されています。ブラシを作成してそのハンドルをExtCreatePen関数に渡すと、 パターンが作成されます。

 

ハッチ

ハッチ属性は、 ハッチ パターン属性を持つジオメトリック ペンのハッチの種類を示します。6つのパターンが利用可能です。次の図は、 さまざまなハッチ パターンで描画した線を示しています。

 

端点キャップ

「端点キャップ」属性は、 ジオメトリック ペンの形状 (丸、 角、 フラット) を示します。次の図は、 各形状の端点キャップで描画した平行線を示しています。

丸端点キャップと角端点キャップは、 ジオメトリック ペンで描画した線の両端からはみ出します。フラット端点キャップははみ出しません。

 

接合

「接合」属性は、 2つのジオメトリック線の端点の接合方法 (ベベル、 マイター、 丸) を示します。次の図は、 各接合方法で描画した接合線のペアを示しています。

 

 

ペンの使用

ここでのコード例は、 簡単なペン選択ダイアログ ボックスを作成して使う方法を示しています。ダイアログ ボックスには、 [色の設定]コモン ダイアログ ボックスを修正して、 ユーザーがペンの色、 幅、 スタイル、 接合を選択できるようにしたものを使います。[色の設定]コモン ダイアログ ボックスについて、 詳しくはコモン ダイアログ ボックス ライブラリの概要を参照してください。

 

 

 

ダイアログ ボックス テンプレートの修正

[色の設定]コモン ダイアログ ボックスを修正するには、 COLOR.DLGに格納されているダイアログ ボックス テンプレートを修正しなければなりません。カスタム カラー ボックスやカスタム カラー ボタンがダイアログ ボックス外に描画されるように変更して不可視にし、 新しいコントロールを3つ追加します。新しい3つのコントロールのうち、 2つは、 ユーザーがスタイルと接合を選択するためのリスト ボックスです。もう1つのコントロールは、 ユーザーがペン幅 (1から99まで) を指定するための編集ボックスです。次に示すアプリケーションのリソース ファイルからの抜粋は、 修正したダイアログ ボックス テンプレートを示しています。

 

DLGINCLUDE RCDATA DISCARDABLE
BEGIN
"colordlg.h\0"
END

CHOOSECOLOR DIALOG 2, 0, 298, 184
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Standard Pen"
FONT 8, "Helv"
BEGIN
LTEXT "Pen Color:", -1, 4, 4, 140, 9
CONTROL "", COLOR_BOX1, "Static", SS_SIMPLE | WS_GROUP |
WS_TABSTOP, 4, 14, 140, 86
LTEXT "&Custom Colors:", -1, 4, 806, 140, 9
CONTROL "", COLOR_CUSTOM1, "Static", SS_SIMPLE | WS_GROUP |
WS_TABSTOP, 4, 816, 140, 28
PUSHBUTTON "&Define Custom Colors...", COLOR_MIX, 4, 850, 140, 14,
WS_GROUP
DEFPUSHBUTTON "OK", IDOK, 4, 166, 44, 14, WS_GROUP
PUSHBUTTON "Cancel", IDCANCEL, 52, 166, 44, 14, WS_GROUP
PUSHBUTTON "&Help", 1038, 100, 166, 44, 14, WS_GROUP
CONTROL "", COLOR_RAINBOW, "Static", SS_BLACKFRAME, 152, 4, 118,
116
CONTROL "", COLOR_LUMSCROLL, "Static", SS_SIMPLE, 280, 4, 8, 116
CONTROL "", COLOR_CURRENT, "Static", SS_BLACKFRAME, 152, 124,
40, 26
RTEXT "Color|", -1, 152, 151, 20, 9
LTEXT "S&olid", -1, 172, 151, 20, 9
PUSHBUTTON "&o", COLOR_SOLID, 300, 200, 4, 14, WS_GROUP
RTEXT "&Hue:", COLOR_HUEACCEL, 194, 126, 20, 9
EDITTEXT COLOR_HUE, 216, 124, 18, 12, WS_GROUP
RTEXT "&Sat:", COLOR_SATACCEL, 194, 140, 20, 9
EDITTEXT COLOR_SAT, 216, 138, 18, 12, WS_GROUP
RTEXT "&Lum:", COLOR_LUMACCEL, 194, 154, 20, 9
EDITTEXT COLOR_LUM, 216, 152, 18, 12, WS_GROUP
RTEXT "&Red:", COLOR_REDACCEL, 243, 126, 24, 9
EDITTEXT COLOR_RED, 269, 124, 18, 12, WS_GROUP
RTEXT "&Green:", COLOR_GREENACCEL, 243, 140, 24, 9
EDITTEXT COLOR_GREEN, 269, 138, 18, 12, WS_GROUP
RTEXT "Bl&ue:", COLOR_BLUEACCEL, 243, 154, 24, 9
EDITTEXT COLOR_BLUE, 269, 152, 18, 12, WS_GROUP
PUSHBUTTON "&Add to Custom Colors", COLOR_ADD, 152, 166, 142, 14,
WS_GROUP
LISTBOX 101, 3, 113, 80, 52, LBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Pen Style", 102, 3, 102, 57, 10
LTEXT "Pen Width", 103, 93, 103, 37, 8
EDITTEXT 104, 94, 113, 32, 12, ES_AUTOHSCROLL
LTEXT "Join Style", 105, 93, 129, 40, 8
LISTBOX 106, 94, 138, 48, 24, LBS_SORT | WS_VSCROLL | WS_TABSTOP
END

 

 

 

ダイアログ ボックス入力の処理

ダイアログ ボックス テンプレートを修正したら、 ダイアログ ボックスの新しいコントロールを初期化してそれに対応する入力を処理するコールバック関数を用意しなければなりません。次に示すアプリケーションのソース ファイルからの抜粋は、 コールバック関数を示しています。

 

DWORD dwPenStyle;
DWORD dwJoinStyle;
DWORD dwWidth;

UINT FAR PASCAL SetPenAttr(HWND hwndDlg, UINT uMsg, UINT wParam,
LONG lParam)
{
static HWND hwndLineStyles;
static HWND hwndJoinStyles;
static HWND hwndWidth;
DWORD adwPenStyle[] = {
PS_DASH,
PS_DASHDOT,
PS_DOT,
PS_INSIDEFRAME,
PS_NULL,
PS_SOLID
};
DWORD adwJoinStyle[] = {
PS_JOIN_BEVEL,
PS_JOIN_MITER,
PS_JOIN_ROUND
};
CHAR chWidth[3];
int iCount;
int index;

switch(uMsg){

case WM_INITDIALOG:

/* Initialize each custom control with the required data. */

hwndLineStyles = GetDlgItem(hwndDlg, IDD_PEN_STYLE);

/* Use the PenStyle constants as indices. */

SendMessage(hwndLineStyles, LB_ADDSTRING, 0,
(LONG) "DASH");
SendMessage(hwndLineStyles, LB_ADDSTRING, 0,
(LONG) "DASHDOT");
SendMessage(hwndLineStyles, LB_ADDSTRING, 0,
(LONG) "DOT");
SendMessage(hwndLineStyles, LB_ADDSTRING, 0,
(LONG) "INSIDEFRAME");
SendMessage(hwndLineStyles, LB_ADDSTRING, 0,
(LONG) "NULL");
SendMessage(hwndLineStyles, LB_ADDSTRING, 0,
(LONG) "SOLID");

hwndJoinStyles = GetDlgItem(hwndDlg, IDD_JOIN_STYLE);

/* Use the JoinStyle constants as indices. */

SendMessage(hwndJoinStyles, LB_ADDSTRING, PS_JOIN_BEVEL,
(LONG) "BEVEL");
SendMessage(hwndJoinStyles, LB_ADDSTRING, PS_JOIN_MITER,
(LONG) "MITER");
SendMessage(hwndJoinStyles, LB_ADDSTRING, PS_JOIN_ROUND,
(LONG) "ROUND");

hwndWidth = GetDlgItem(hwndDlg, IDD_PEN_WIDTH);
SetWindowText(hwndWidth, (LPTSTR)"1");

return TRUE;

case WM_COMMAND:

/* Retrieve the requested pen style. */

index = SendMessage(hwndLineStyles, LB_GETCURSEL, 0, 0L);
dwPenStyle = adwPenStyle[index];

/* Retrieve the requested join style. */

index = SendMessage(hwndJoinStyles, LB_GETCURSEL, 0, 0L);
dwJoinStyle = adwJoinStyle[index];

/* Retrieve the requested width. */

GetDlgItemText(hwndDlg, IDD_PEN_WIDTH, chWidth, 3);
dwWidth = RetrieveWidth(chWidth, GetStrLngth(chWidth));

return FALSE;
}
return FALSE;

UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(iCount);
}

アプリケーションは、 CHOOSECOLOR構造体の適切なメンバを設定してChooseColor関数に渡すことによって、 コールバック関数をコモン ダイアログ ボックス プロシージャに登録しなければなりません。次に示すアプリケーションのソース ファイルからの抜粋は、 この登録の方法を示しています。

 

static CHOOSECOLOR cc; /* structure required 
				for Color dialog box */
static COLORREF clr;
static COLORREF aclrCust[256];

/*
* Initialize the necessary CHOOSECOLOR
* members.
*/

cc.lStructSize = sizeof(CHOOSECOLOR);
cc.hwndOwner = hwnd;
cc.hInstance = (HWND)hInst;
cc.rgbResult = clr;
cc.lpCustColors = aclrCust;
cc.Flags = CC_ENABLEHOOK | CC_ENABLETEMPLATE;
cc.lpfnHook = (LPCCHOOKPROC)SetPenAttr;
cc.lpTemplateName = "CHOOSECOLOR";

ChooseColor関数を実行すると、 CHOOSECOLOR構造体のrgbResultメンバにはユーザーが要求した色が設定され、 dwPenStyleパラメータ、 dwJoinStyleパラメータ、 dwWidthパラメータは、 それぞれ、 要求されたペンのスタイル、 接合、 幅を示します。これらの値は、 ExtCreatePen関数に渡してジオメトリック ペンを作成するのに使われます。このジオメトリック ペンをデバイス コンテキストで選択して、 さまざまな線描画操作に使います。

 

if (ChooseColor(&cc)){

hdc = GetDC(hwnd);

/* Initialize the pen's "brush." */

logbrush.lbStyle = BS_SOLID;
logbrush.lbColor = cc.rgbResult;
logbrush.lbHatch = 0;

/* Create a pen and select it into the DC. */

hpenOld = SelectObject(hdc,
ExtCreatePen(PS_GEOMETRIC | dwPenStyle
| dwJoinStyle, dwWidth,
&logbrush, (DWORD) NULL,
(LPDWORD) NULL));

/* Perform drawing operations. */

MoveToEx(hdc, 100, 100, NULL);
LineTo(hdc, 100, 200);
LineTo(hdc, 200, 200);
LineTo(hdc, 200, 100);
LineTo(hdc, 100, 100);

ReleaseDC(hwnd, hdc);
}

コモン ダイアログ ボックスのカスタマイズ方法について、 詳しくはコモン ダイアログ ボックス ライブラリの概要を参照してください。

 

 

ペン関数

ペン インターフェイスをサポートする関数を次に示します。

CreatePen

CreatePenIndirect

ExtCreatePen

 

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします