#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		SetTextAlign(hdc , TA_CENTER | TA_BASELINE);
		GetClientRect(hWnd , &rect);
		TextOut(hdc , rect.right / 2 , rect.bottom / 2 , TITLE , lstrlen(TITLE));
		EndPaint(hWnd , &ps);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc		= WndProc;
	winc.cbClsExtra		= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LONG TabbedTextOut( HDC hDC, int X , int Y , LPCTSTR lpString , int nCount , int nTabPositions , LPINT lpnTabStopPositions , int nTabOrigin );hDC には、デバイスコンテキストのハンドルを
#include <windows.h>
#define TITLE TEXT("\tKitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	TEXTMETRIC tm;
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		GetTextMetrics(hdc , &tm);
		TextOut(hdc , 0 , 0 , TITLE , lstrlen(TITLE));
		TabbedTextOut(hdc , 0 , tm.tmHeight ,
			 TITLE , lstrlen(TITLE) , 0 , NULL , 0);
		EndPaint(hWnd , &ps);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc		= WndProc;
	winc.cbClsExtra		= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

int DrawTextEx( HDC hdc, LPTSTR lpchText , int cchText, LPRECT lprc , UINT dwDTFormat , LPDRAWTEXTPARAMS lpDTParams );hdc には、デバイスコンテキストのハンドルを
typedef struct { 
    UINT cbSize; 
    int  iTabLength; 
    int  iLeftMargin; 
    int  iRightMargin; 
    UINT uiLengthDrawn; 
} DRAWTEXTPARAMS, FAR *LPDRAWTEXTPARAMS;
cbSize には、この構造体のサイズを指定します#include <windows.h>
#define TITLE TEXT("\tKitty on your lap\n\t\tTokyo mew mew")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	static DRAWTEXTPARAMS dtpParam;
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		dtpParam.cbSize = sizeof (DRAWTEXTPARAMS);
		dtpParam.iTabLength = 5;
		dtpParam.iLeftMargin =
		dtpParam.iRightMargin = 0;
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		GetClientRect(hWnd , &rect);
		DrawTextEx(hdc , TITLE , -1 , &rect ,
			DT_EXPANDTABS | DT_TABSTOP , &dtpParam);
		EndPaint(hWnd , &ps);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc		= WndProc;
	winc.cbClsExtra		= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
DrawTextEx() 関数を用いてタブとタブの空白文字数を処理するプログラムの例ですBOOL ExtTextOut( HDC hdc, int X , int Y , UINT fuOptions , CONST RECT *lprc, LPCTSTR lpString , UINT cbCount, CONST INT *lpDx );hdc にはデバイスコンテキストのハンドルを
#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	int count;
	static int *iDis;
	switch (msg) {
	case WM_DESTROY:
		free(iDis);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		iDis = malloc(lstrlen(TITLE) * sizeof ( int ));
		for (count = 0 ; count < lstrlen(TITLE) ; count++)
			iDis[count] = count + 10;
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		GetClientRect(hWnd , &rect);
		ExtTextOut(hdc , 0 , 0 , ETO_CLIPPED , 
			&rect , TITLE , lstrlen(TITLE) , iDis);
		EndPaint(hWnd , &ps);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc		= WndProc;
	winc.cbClsExtra		= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd , &ps);
		SetTextCharacterExtra(hdc , 10);
		TextOut(hdc , 0 , 0 , TITLE , lstrlen(TITLE));
		EndPaint(hWnd , &ps);
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;
	winc.style 		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc		= WndProc;
	winc.cbClsExtra		= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");
	if (!RegisterClass(&winc)) return 1;
	hWnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return 1;
	while (GetMessage(&msg , NULL , 0 , 0 )) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
このプログラムを実行すれば、TextOut() で描画した全ての文字が| 定数 | 解説 | |
|---|---|---|
| TA_BASELINE | 参照点と、テキストのベースラインを揃えます | |
| TA_BOTTOM | 参照点と、境界長方形の下端を揃えます | |
| TA_TOP | 参照点と、境界長方形の上端を揃えます デフォルトです  | |
| TA_CENTER | 参照点と、境界長方形の水平方向の中心を揃えます | |
| TA_LEFT | 参照点と、境界長方形の左端を揃えます デフォルトです  | |
| TA_RIGHT | 参照点と、境界長方形の右端を揃えます | |
| TA_NOUPDATECP | 各テキスト出力関数が呼び出されても、カレントポジションを更新しません デフォルトです  | |
| TA_RTLREADING | Windows 95 : 右から左への読み取り順序で配置します デバイスコンテキストでヘブライ語か アラビア語のフォントを選択しているときにのみ有効です  | |
| TA_UPDATECP | 各テキスト出力関数が呼び出されると、カレントポジションを更新します カレントポジションが、参照点として使用されます  | |
| VTA_BASELINE | 参照点と、テキストのベースラインを揃えます 現在のフォントが、漢字にあるような垂直方向の デフォルトベースラインを持っている場合に TA_BASELINE の代わりに指定します  | |
| VTA_CENTER | 参照点と、境界長方形の垂直方向の中心を揃えます 現在のフォントが、漢字にあるような垂直方向の デフォルトベースラインを持っている場合に TA_CENTER の代わりに指定します  | |
LONG TabbedTextOut( HDC hDC, int X , int Y , LPCTSTR lpString , int nCount , int nTabPositions , LPINT lpnTabStopPositions , int nTabOrigin );タブ文字を含む文字列を描画することができます
int DrawTextEx( HDC hdc, LPTSTR lpchText , int cchText, LPRECT lprc , UINT dwDTFormat , LPDRAWTEXTPARAMS lpDTParams );指定された長方形に、フォーマットしたテキストを表示します
BOOL ExtTextOut( HDC hdc, int X , int Y , UINT fuOptions , CONST RECT *lprc, LPCTSTR lpString , UINT cbCount, CONST INT *lpDx );指定した文字列を描画します
| 定数 | 解説 | |
|---|---|---|
| ETO_CLIPPED | 文字列を矩形にクリップします | |
| ETO_GLYPH_INDEX | lpString パラメータが、GetCharacterPlacement() で渡される配列を指し GDI で直接解析されません グリフのインデックスが適用されるのは TrueType ふぉんとだけですが このフラグは、ビットマップフォントとベクトルフォントで 言語処理をバイパスするために使われます  | |
| ETO_OPAQUE | 矩形を現在の背景色で塗りつぶします | |
| ETO_RTLREADING | 現在のフォントがヘブライ語、またはアラビア語の場合に 右から左へと読みます ETO_GLYPH_INDEX と併用することはできません  | |