最大化

…ってやっぱり、DirectDraw7でも使って画面を占有して、GetDCでDC取ってそれに描くしか無いのでしょうか?(8はGetDCが無い、9はインストールしたくないので却下)

SDL

DirectDraw7を今更思い出すのは面倒ですので、とりあえずSDLで試してみました。Win版のSDLってDirectDraw使ってる…のですよね?

program opengl_sdl;

uses
	Windows, OpenGL, SDL;

const
	Width = 640;
	Height = 480;
var
	VideoInfo: PSDL_VideoInfo;
	Bits: Integer;
	Font, OldFont: HWND;
	DC: HDC;
begin
	SDL_Init(SDL_INIT_VIDEO);
	VideoInfo := SDL_GetVideoInfo;
	Bits := VideoInfo^.vfmt^.BitsPerPixel;
	SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
	SDL_SetVideoMode(Width, Height, Bits, SDL_OPENGL or SDL_FULLSCREEN);

	glViewport(0, 0, Width, Height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity;
	glOrtho(0, Width, Height, 0, -1, 1);
	glMatrixMode(GL_MODELVIEW);

	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
		glColor(1.0, 0.0, 0.0); glVertex(50, 50, 0);
		glColor(0.0, 1.0, 0.0); glVertex(100, 50, 0);
		glColor(0.0, 0.0, 1.0); glVertex(50, 100, 0);
	glEnd;

	{SDLでフォントを描くにはいちいちテクスチャにしないといけないらしい
	 本来直接描けるものをやってられっかって事で移植性無視}

	DC := wglGetCurrentDC;
	Font := Windows.CreateFont(50, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0,
		DEFAULT_QUALITY, DEFAULT_PITCH, 'さざなみ明朝');
	OldFont := Windows.SelectObject(DC, Font);

	glPushMatrix;
	glColor(1.0, 1.0, 1.0);
	wglUseFontOutlinesW(DC, Ord(WideString('漢')[1]), 1, 1000,
		0, 0, WGL_FONT_POLYGONS, nil);
	glLoadIdentity();
	glTranslate(150, 200, 0);
	glScale(50, -50, 1);
	glRotate(30, 0, 0, 1);
	glCallList(1000);
	glPopMatrix;

	glColor(1.0, 1.0, 1.0);
	wglUseFontBitmapsW(DC, Ord(WideString('字')[1]), 1, 1001);
	glRasterPos(200, 200);
	glCallList(1001);

	glFlush;
	SDL_GL_SwapBuffers;

	Windows.Sleep(5000); {入力を取る方法がわからんので}

	SelectObject(DC, OldFont);
	DeleteObject(Font);

	SDL_Quit;
end.

いけますな。
というわけで最大化の手段はDirectDraw7に決定。
SDLをそのまま使ってもいいのですけど…ソース中のコメントのようにどうせ移植性無視になるのは目に見えてますし…。

DirectDraw

プライマリサーフェースからGetDCしてきたデバイスコンテキストに対して、SetPixelFormatが動いてくれませんね…
当たり前か…
ちょっくらSDLのソース読んで来ます。

 … code reading …

やられた…。
馬鹿みたいです。
単に、普通の、GDIの、GetDCで全画面ウィンドウのDCを、DirectDrawとは全く無関係に、取得して使ってありました。
…はあ(脱力)。
ええ、動きました。はい。これで最大化もクリアです。
ということは、DirectDraw側では、Flipも何も一切しないって事ですね…。

重要な追記

最大化占有ウィンドウのDCに対して、SetPixelFormatを行いますと、DirectDrawのRestoreDisplayModeで画面サイズの復帰ができなくなります。

じゃあSDLはどーやってるんだと思ってもう一度SDLのソースを…

if ( flags & SDL_OPENGL ) {

…嫌なものを見つけてしまった。

if ( ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL ) {

…ほらぁー!

ChangeDisplaySettingsW(TDeviceModeW(nil^), 0);って入れたら戻るようになったしぃ…しかも最大化時画面真っ黒で何も表示されてないしぃ…眠いし…。