プリンタの情報


DC を更新する

ディスプレイに描画する時は、普通、90度傾かせて表示する必要はありません
そのようなことをするのは、CG 作成アプリケーションなどでしょう
少なくとも、ウィンドウを90度傾かせて表示させることを望むユーザーはいません

しかし、プリンタに印刷する時、用紙に横向きに印刷をすることを望むことはあります
アプリケーションは、ユーザーのこういった要求にもこたえなければいけません

プリンタやプロッタなど、印刷用のデバイスコンテキストの
こういった属性を更新するには ResetDC() 関数を使います

HDC ResetDC(HDC hdc , CONST DEVMODE *lpInitData);

hdc には、デバイスコンテキストのハンドルを
lpInitData は、更新情報を格納している DEVMODE 構造体へのポインタを指定します
関数が成功すれば、元のデバイスコンテキストのハンドル、失敗すれば NULL が返ります

DEVMODE 構造体は、次のように定義されています
typedef struct _devicemode {    // dvmd 
    BCHAR  dmDeviceName[CCHDEVICENAME]; 
    WORD   dmSpecVersion; 
    WORD   dmDriverVersion; 
    WORD   dmSize; 
    WORD   dmDriverExtra; 
    DWORD  dmFields; 
    union {
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
      };
      POINTL dmPosition;
    };
    short  dmScale; 
    short  dmCopies; 
    short  dmDefaultSource; 
    short  dmPrintQuality; 
    short  dmColor; 
    short  dmDuplex; 
    short  dmYResolution; 
    short  dmTTOption; 
    short  dmCollate; 
    BCHAR  dmFormName[CCHFORMNAME]; 
    WORD  dmLogPixels; 
    DWORD  dmBitsPerPel; 
    DWORD  dmPelsWidth; 
    DWORD  dmPelsHeight; 
    DWORD  dmDisplayFlags; 
    DWORD  dmDisplayFrequency; 
#if(WINVER >= 0x0400) 
    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;
#endif
#endif /* WINVER >= 0x0400 */
} DEVMODE;
dmDeviceName には、ドライバがサポートするデバイスの名前を指定します
dmSpecVersion は、この構造体の初期化データ仕様のバージョンを指定します
現在のバージョンは DM_SPECVERSION と定義されています

dmDriverVersion には、プリンタドライバのバージョンを指定します
dmSize は、この構造体のバイトサイズを指定します
dmDriverExtra は、この構造体に続くプライベートドライバデータのバイトサイズを指定します
これは、デバイス固有情報になるため、通常は指定しないことを表す 0 を指定します

dmFields は、プリンタドライバが、この構造体のどのメンバを使うかを表すフラグです
複数のメンバを適応するには OR 演算子 | で組み合わせて指定します
このメンバには、次の定数の組み合わせを指定します

定数メンバ
DM_ORIENTATION dmOrientation
DM_PAPERSIZE dmPaperSize
DM_PAPERLENGTH dmPaperLength
DM_PAPERWIDTH dmPaperWidth
DM_POSITION dmPosition
DM_SCALE dmScale
DM_COPIES dmCopies
DM_DEFAULTSOURCE dmDefaultSource
DM_PRINTQUALITY dmPrintQuality
DM_COLOR dmColor
DM_DUPLEX dmDuplex
DM_YRESOLUTION dmYResolution
DM_TTOPTION dmTTOption
DM_COLLATE dmCollate
DM_FORMNAME dmFormName
DM_LOGPIXELS dmLogPixels
DM_BITSPERPEL dmBitsPerPel
DM_PELSWIDTH dmPelsWidth
DM_PELSHEIGHT dmPelsHeight
DM_DISPLAYFLAGS dmDisplayFlags
DM_DISPLAYFREQUENCY dmDisplayFrequency
DM_ICMMETHOD dmICMMethod
DM_ICMINTENT dmICMIntent
DM_MEDIATYPE dmMediaType
DM_DITHERTYPE dmDitherType
DM_PANNINGWIDTH Windows NT 5.0 and later:
dmPanningWidth
DM_PANNINGHEIGHT Windows NT 5.0 and later:
dmPanningHeight

dmOrientation は、用紙の向きを指定します
縦ならば DMORIENT_PORTRAIT を、横ならば DMORIENT_LANDSCAPE を指定します

dmPaperSize には、用紙のサイズを指定します
このメンバには、次の定数のいずれかを指定します
用紙の幅と高さを dmPaperLength と dmpaperWidth で指定する場合は 0 を指定できます

定数サイズ
DMPAPER_LETTER Letter、8 1/2 × 11 インチ
MPAPER_LEGAL Legal、8 1/2 × 14 インチ
DMPAPER_A4 A4 シート、210 × 297 mm
DMPAPER_CSHEET C シート、17 × 22 インチ
DMPAPER_DSHEET D シート、22 × 34 インチ
DMPAPER_ESHEET E シート、34 × 44 インチ
DMPAPER_LETTERSMALL Letter Small、8 1/2 × 11 インチ
DMPAPER_TABLOID Tabloid、11 × 17 インチ
DMPAPER_LEDGER Ledger、17 × 11 インチ
DMPAPER_STATEMENT Statement、5 1/2 × 8 1/2 インチ
DMPAPER_EXECUTIVE Executive、7 1/4 × 10 1/2 インチ
DMPAPER_A3 A3 シート、297 × 420 mm
DMPAPER_A4SMALL A4 small シート、210 × 297 mm
DMPAPER_A5 A5 シート、148 × 210 mm
DMPAPER_B4 B4 シート、250 × 354 mm
DMPAPER_B5 B5 シート、182 × 257 mm
DMPAPER_FOLIO Folio、8 1/2 × 13 インチ
DMPAPER_QUARTO Quarto、215 × 275 mm
DMPAPER_10X14 10 × 14 インチ シート
DMPAPER_11X17 11 × 17 インチ シート
DMPAPER_NOTE Note、 8 1/2 × 11 インチ
DMPAPER_ENV_9 #9 Envelope、3 7/8 × 8 7/8 インチ
DMPAPER_ENV_10 #10 Envelope、4 1/8 × 9 1/2 インチ
DMPAPER_ENV_11 #11 Envelope、4 1/2 × 10 3/8 インチ
DMPAPER_ENV_12 #12 Envelope、4 3/4 × 11 インチ
DMPAPER_ENV_14 #14 Envelope、5 × 11 1/2 インチ
DMPAPER_ENV_DL DL Envelope、110 × 220 mm
DMPAPER_ENV_C5 C5 Envelope、162 × 229 mm
DMPAPER_ENV_C3 C3 Envelope、324 × 458 mm
DMPAPER_ENV_C4 C4 Envelope、229 × 324 mm
DMPAPER_ENV_C6 C6 Envelope、114 × 162 mm
DMPAPER_ENV_C65 C65 Envelope、114 × 229 mm
DMPAPER_ENV_B4 B4 Envelope、250 × 353 mm
DMPAPER_ENV_B5 B5 Envelope、176 × 250 mm
DMPAPER_ENV_B6 B6 Envelope、176 × 125 mm
DMPAPER_ENV_ITALY Italy Envelope、110 × 230 mm
DMPAPER_ENV_MONARCH Monarch Envelope、3 7/8 × 7 1/2 インチ
DMPAPER_ENV_PERSONAL 6 3/4 Envelope、3 5/8 × 6 1/2 インチ
DMPAPER_FANFOLD_US US Std Fanfold、14 7/8 × 11 インチ
DMPAPER_FANFOLD_STD_GERMAN German Std Fanfold、8 1/2 × 12 インチ
DMPA PER_FANFOLD_LGL_GERMAN German Legal Fanfold、8 1/2 × 13 インチ

dmPaperLength には、縦向きモードでの用紙の長さを
dmPaperWidth には、縦向きモードでの養子の幅を、それぞれ 0.1 ミリ単位で指定します

dmScale には、印刷出力をスケーリングするときの、スケーリング係数を指定します
見かけのページ サイズは、物理ページ サイズに dmScale/100 を掛けてスケーリングされます
例えば、50 を指定すれば 0.5 * ページサイズ となるので
物理ページサイズの半分で、グラフィックスがスケーリングされます

dmCopies には、印刷部数を指定します
dmDefaultSource は、デフォルト用紙トレイを指定します
このメンバには、以下の定数のいずれかを、
または DMBIN_USER 以上の、ドライバ定義値を指定します

定数解説
DMBIN_ONLYONE 単一用紙ソース
DMBIN_LOWER 下用紙トレイ
DMBIN_MIDDLE 中用紙トレイ
DMBIN_MANUAL 手差し用紙フィーダ
DMBIN_ENVELOPE 封筒フィーダ
DMBIN_ENVMANUAL 手差し封筒フィーダ
DMBIN_AUTO 自動用紙トレイ選択
DMBIN_TRACTOR トラクタフィーダ
DMBIN_SMALLFMT 小型用紙ソース
DMBIN_LARGEFMT 大型用紙ソース
DMBIN_LARGECAPACITY 大容量用紙トレイ
DMBIN_CASSETTE 用紙カセット

dmPrintQuality には、プリンタ解像度を指定します
正の値であれば、1インチあたりのドット数 DPI を示します
このメンバには、デバイスに依存しない次のいずれかの定数を指定できます

定数解説
DMRES_HIGH 高解像度
DMRES_MEDIUM 中解像度
DMRES_LOW 低解像度
DMRES_DRAFT ドラフト印刷解像度

dmColor は、カラープリンタで、カラーとモノクロのどちらを使用するかを指定します
このメンバは、カラーを表す DMCOLOR_CIKIR か
モノクロを表す DMCOLOR_MONOCHROME のいずれかを指定できます

dmDules は、両面印刷ができるプリンタで、両面印刷するかどうかを選択します
このメンバには、次の定数のいずれかを指定できます

定数解説
DMDUP_SIMPLEX 画面印刷しない
DMDUP_HORIZONTAL 横(長辺)
DMDUP_VERTICAL 縦(短辺)

dmYResolution には、プリンタの垂直方向の解像度 DPI を指定します
プリンタ ドライバがこのメンバを初期化すると
dmPrintQuality メンバはプリンタの x 方向の解像度をインチ当たりのドット数で指定します

dmTTOption には、TrueType フォントの印刷方法を指定します
このメンバには、次の定数のいずれかを指定できます

定数解説
DMTT_BITMAP TrueType フォントをグラフィックとして印刷します
ドットマトリックス プリンタのデフォルトの動作です
DMTT_DOWNLOAD TrueType フォントをソフト フォントとしてダウンロードします
Printer Control Language (PCL) を使う
Hewlett-Packard のプリンタのデフォルトの動作です
DMTT_SUBDEV TrueType フォントをデバイス フォントで置き換えます
PostScriptR プリンタのデフォルトの動作です
DMTT_DOWNLOAD_OUTLINETrueType フォントをアウトラインソフトフォントとしてダウンロードします

dmCollate は、複数の部数を印刷するときに、部単位で印刷するかどうかを指定します
部単位で印刷するならば DMCOLLATE_TRUE に
そうでなければ DMCOLLATE_FALSE を指定します
DMCOLLATE_FALSE を指定すれば、プリンタへのデータ送信が1度ですみます

dmFormName は、使用する用紙の名前を指定します
dmLogPixels は、論理インチあたりのピクセル数を指定します

dmBitsPerPel は、ディスプレイデバイスのカラービット数を指定します
dmPelsWidth は、可視デバイスの表面の幅を
dmPelsHeight は、可視デバイスの表面の高さを、それぞれピクセル単位で指定します

dmDisplayFlags は、デバイスのディスプレイモードを指定します
次の定数のいずれかを指定することができます

定数解説
DM_GRAYSCALE ディスプレイが非カラーのデバイスであることを指定します
このフラグが設定されていないと、カラー デバイスとみなします
DM_INTERLACED ディスプレイモードがインターレースであることを指定します
このフラグが設定されていないと、ノンインターレースであるとみなします

dmDisplayFrequency には、特定のモードにおける、ディスプレイデバイスの周波数を
ヘルツ単位 (1 秒あたりのサイクル数)で指定します

dmICMMethod は、非ICMアプリケーションの場合に、ICM が使用可能かどうかを指定します
ICM アプリケーションであれば、WIndows がこのメンバを調べ
ICM サポートをどのように処理するかを決定します
以下の定数のいずれか、または DMICMMETHOD_USER よりも大きな値を指定できます

定数解説
DMICMMETHOD_NONE ICM は使用不可です
DMICMMETHOD_SYSTEM ICM は Windows によって処理されます
DMICMMETHOD_DRIVER ICM はデバイスドライバによって処理されます
DMICMMETHOD_DEVICE ICM はデバイスによって処理されます

dmICMIntent は、カラーマッチング方法のデフォルトを指定します
このメンバは非 ICM アプリケーション専用です
以下の定数のいずれか、または DMICM_USER 以上のドライバ定義値を指定します

定数解説
DMICM_SATURATE カラーマッチングで、色の鮮やかさを優先します
ディザリングが望まれない、ビジネス用のグラフに最適です
DMICM_CONTRAST カラーマッチングで、カラーコントラストを優先します
ディザリングが望まれる、写真等の画像に最適です
DMICM_COLORMETRIC カラーマッチングで、要求どおりの色に合わせます
正確な色合わせが要求されるときに最適です

dmMediaType には、印刷メディアのタイプを指定します
以下の定数のいずれか、または DMMEDIA_USER 以上のドライバ定義値を指定できます

定数解説
DMMEDIA_STANDARD 普通紙
DMMEDIA_GLOSSY 光沢紙
DMMEDIA_TRANSPARENCY 透明フィルム

dmDitherType は、ディザリング方法を指定します
以下の定数、または DMDITHER_USER 以上のドライバ定義値を指定します

定数解説
DMDITHER_NONE ディザリングしません
DMDITHER_COARSE 粗いブラシによるディザリング
DMDITHER_FINE 細かいブラシによるディザリング
DMDITHER_LINEART ラインアートディザリング
DMDITHER_GRAYSCALE デバイスは、グレースケールを使う

dmReserved1 と dmReserved2 は予約済みで、常に 0 を指定します
dmPanningWidth と dmPanningHeight は NT 系では 0 を指定します
9x 系はサポートされていません

さて、ずいぶんと長い構造体でしたが、全てのメンバを同時に指定することはありません
設定したいメンバだけを指定し、dmFields で有効なメンバを指定すれば良いのです
ここで紹介した DEVMODE 構造体は、OS がバージョンアップすると更新されることが多いので
新しいバージョンの Windows がリリースされるごとに、最新の定義を見ると良いでしょう
#include <windows.h>

#define TITLE TEXT("Kitty on your lap")

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	DOCINFO diInfo = {0};
	DEVMODE dmMode = {0};
	HDC hdc;

	diInfo.cbSize 		= sizeof (DOCINFO);
	diInfo.lpszDocName 	= TITLE;

	dmMode.dmSpecVersion 	= DM_SPECVERSION;
	dmMode.dmSize 		= sizeof (DEVMODE);
	dmMode.dmFields		= DM_ORIENTATION;
	dmMode.dmOrientation	= DMORIENT_LANDSCAPE;

	if (!(hdc = CreateDC(NULL , lpCmdLine , NULL , NULL))) {
		MessageBox(NULL , 
			TEXT("DCが得られません") , lpCmdLine , MB_OK);
		return -1;
	}
			
	if (StartDoc(hdc , &diInfo) > 0) {
		hdc = ResetDC(hdc , &dmMode);

		StartPage(hdc);
		SetMapMode(hdc , MM_LOMETRIC);
		Ellipse(hdc , 0 , 0 , 500 , -500);
		TextOut(hdc , 0 , 0 , TITLE , lstrlen(TITLE));

		EndPage(hdc);
		EndDoc(hdc);
	}
	DeleteDC(hdc);
	return 0;
}
このプログラムは、コマンドライン引数から印刷するプリンタを選択すると
そのプリンタの用紙に、横向きで円弧と文字を印刷します
StartPage() を呼び出す前に ResetDC() でデバイスコンテキストを更新し
横向きで印刷するように設定しているためです


ResetDC()

HDC ResetDC(HDC hdc , CONST DEVMODE *lpInitData);

プリンタやプロッタのデバイスコンテキストを
設定された情報に基いて更新します

hdc - デバイスコンテキストのハンドルを指定します
lpInitData - 更新情報を格納している DEVMODE 構造体へのポインタを指定します

戻り値 - 元のデバイスコンテキストのハンドル、失敗すれば NULL



前のページへ戻る次のページへ