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 次