0から始めるVisualStudio2022:ソフト開発塾

絵を動かすその前に、絵はいろいろと面倒なので
TextOutAを使って、左から右に文字を表示してみる。
『プロジェクト』『新しい項目の追加』で、
winmain.cppを作成します。
内容は、こんな感じでが、ひな型で後で修正
#include 
//
static  const LPCSTR szWindowClass = "sample\0";	// sample 
static  const LPCSTR szTitle = "SAMPLE\0";	// SAMPLE 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//
int WINAPI WinMain(
	_In_ 		HINSTANCE hInstance,
	_In_opt_ 	HINSTANCE hPrevInstance,
	_In_ 		LPSTR     lpCmdLine,
	_In_ 		int       nCmdShow) {
	WNDCLASSEXA	wcex;

	wcex.cbSize = sizeof(WNDCLASSEXA);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);

	if (!RegisterClassExA(&wcex)) {
		return 1;
	}

	HWND hWnd = CreateWindowExA(
		WS_EX_OVERLAPPEDWINDOW,
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,   // ここに追加
		CW_USEDEFAULT, CW_USEDEFAULT,
		500, 300,
		NULL,
		NULL,
		hInstance,
		NULL
	);

	if (!hWnd) {
		return 1;
	}
	ShowWindow(hWnd, nCmdShow);

	// Main message loop:
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int)msg.wParam;
}
次に
『プロジェクト』『新しい項目の追加』で、
winproc.cppを作成します。
内容は、こんな感じでが、ひな型で後で修正
#include <windows.h>
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

    switch (message) {
    case WM_CREATE:
        return 0;
    case WM_SIZE:
        return 0;
    case WM_HSCROLL:	// 水平スクロール バー
        return 0;
    case WM_VSCROLL:	// 垂直スクロール バー
        return 0;
        break;
    case WM_PAINT:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
dialog.cppにWinMainがあるので、dialog.cppを除外するか
dialog.cppのWinMainをWinMain_Xなど名前を変更する。
とりあえず、ビルドして実行してみる。
で、文字の表示を、WndProcのWM_PAINTではないところで行ってみることに。
それは、Main message loop 
	// Main message loop:
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
を、変更する
/*	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	*/
	int  mm_tx = 0, mm_ty = 0;
	HDC  mm_hdc;
	mm_hdc = GetDC(hWnd);
	BOOL fDone;
	fDone = FALSE;
	while (!fDone) {
		TextOutA(mm_hdc, mm_tx, mm_ty, " ", 1);
		mm_tx++;
		if (mm_tx > 1024) {
			mm_tx = 0;
			mm_ty += 8;
			if (mm_ty > 32) mm_ty = 0;
		}
		TextOutA(mm_hdc, mm_tx, mm_ty, "x", 1);
		while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
			if (msg.message == WM_QUIT) {
				fDone = TRUE;
				break;
			}
			if (GetMessage(&msg, NULL, 0, 0)) {
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else {
				fDone = TRUE;
				break;
			}
		}
	}
どうでしょう?、高速で表示しているため、チカチカしているようにしか見えませんが。。。
この方法を使用すれば、表示できるのです。







Top