「Win32/64アプリ開発 001 基礎」の版間の差分
(ページの作成:「== '''概要''' == Windowを表示するだけのアプリを理解するのが基礎になります。それはどのようなWin32/64アプリ開発について教えてくれるWebsiteでも示されるものです。まずはペロッとプログラムを貼り付けてみます。超簡単なものでも、ものすごく長くなります。仕方ないよね。それがWin32/64アプリ開発。」) |
編集の要約なし |
||
1行目: | 1行目: | ||
== '''概要''' == | == '''概要''' == | ||
Windowを表示するだけのアプリを理解するのが基礎になります。それはどのようなWin32/64アプリ開発について教えてくれるWebsiteでも示されるものです。まずはペロッとプログラムを貼り付けてみます。超簡単なものでも、ものすごく長くなります。仕方ないよね。それがWin32/64アプリ開発。 | Windowを表示するだけのアプリを理解するのが基礎になります。それはどのようなWin32/64アプリ開発について教えてくれるWebsiteでも示されるものです。まずはペロッとプログラムを貼り付けてみます。超簡単なものでも、ものすごく長くなります。仕方ないよね。それがWin32/64アプリ開発。 | ||
Visual Studio 2022 Community の C++ を使うという前提でお話は始まります。 | |||
起動したら、ソリューションの新規作成をするため「新しいプロジェクトの作成」ボタンを押して、「Windowsデスクトップウィザード」を選択します。そして「次へ」ボタンを押します。プロジェクトの名前は「Win32EditBase」としましょうか?好きな名前つけていただいてもよいです。ソリューション名は同じでいいと思います。なので、ラジオボタンの「ソリューションとプロジェクトを同じディレクトリに配置する」にチェックを入れましょう。保存するディレクトリも規定値のままでよいと思います。「C:¥User¥(ユーザ名)¥source¥repos」が規定値だと思います。このディレクトリをマイドキュメントの中のVisual Studio 2022というフォルダの中にショートカットを作成しておくなどしておくと、よく使うので、たどり着きやすくなります。オススメです。そしたら「作成」ボタンを押します。 | |||
次に表示されたダイアログで、アプリケーションの種類を「デスクトップアプリケーション」を選択して、追加のオプションからラジオボタンの「空のプロジェクト」を選択します。 | |||
そしたらVisual Studioのメイン画面が表示されるので、まずはソースファイルを記述するために、ソリューションエクスプローラーから、ソースファイルのフィルタの上で右クリックして表示されるメニューから「追加」-「新しい項目」を選択して「main.cpp」と入力して、以下のようなソースコードを入力します。長いです。コピーしても手打ちしてもよいです。 | |||
この後でリソースというものを追加する作業をする予定で、それをやるまでは、resource.hファイルとIDI_ICON1というキーワードが存在しないという内容のエラーが検出されます。 | |||
main.cpp | |||
<syntaxhighlight lang="cpp" line start="1"> | |||
#include <windows.h> | |||
#include "resource.h" | |||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |||
wchar_t szClassName[] = L"SimpleEditWindow"; | |||
HWND HWNDg_hEdit; | |||
HWND HWNDg_hWnd; | |||
HINSTANCE HINSTANCEg_hInst; | |||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, | |||
LPSTR lpszCmdLine, int nCmdShow) | |||
{ | |||
HWND HWNDhWnd; | |||
MSG MSGmsg; | |||
WNDCLASS WNDCLASSwc; | |||
if (!hPreInst) { | |||
WNDCLASS WNDCLASSwc = { 0 }; | |||
WNDCLASSwc.lpfnWndProc = WndProc; | |||
WNDCLASSwc.hInstance = hInstance; | |||
WNDCLASSwc.lpszClassName = szClassName; | |||
WNDCLASSwc.lpszMenuName = NULL; | |||
WNDCLASSwc.hCursor = LoadCursor(NULL, IDC_ARROW); | |||
WNDCLASSwc.hIcon = (HICON)LoadImage(NULL, | |||
MAKEINTRESOURCE(IDI_APPLICATION), | |||
IDI_ICON1, | |||
0, | |||
0, | |||
LR_DEFAULTSIZE | LR_SHARED); | |||
if (!RegisterClass(&WNDCLASSwc)) | |||
return FALSE; | |||
} | |||
HWNDhWnd = CreateWindowEx( | |||
0, | |||
szClassName, | |||
L"Win32Applicationタイトル", | |||
WS_OVERLAPPEDWINDOW, | |||
CW_USEDEFAULT, | |||
CW_USEDEFAULT, | |||
CW_USEDEFAULT, | |||
CW_USEDEFAULT, | |||
NULL, | |||
NULL, | |||
hInstance, | |||
NULL); | |||
HWNDg_hWnd = HWNDhWnd; | |||
HINSTANCEg_hInst = hInstance; | |||
ShowWindow(HWNDhWnd, nCmdShow); | |||
UpdateWindow(HWNDhWnd); | |||
while (GetMessage(&MSGmsg, NULL, 0, 0)) { | |||
TranslateMessage(&MSGmsg); | |||
DispatchMessage(&MSGmsg); | |||
} | |||
return (MSGmsg.wParam); | |||
} | |||
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |||
{ | |||
switch (msg) { | |||
case WM_CREATE: | |||
// エディットコントロールの作成 | |||
HWNDg_hEdit = CreateWindowEx( | |||
0, | |||
L"EDIT", // エディットコントロールのクラス名 | |||
L"Hello, World!", | |||
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_HSCROLL | WS_VSCROLL, | |||
0, 0, // エディットコントロールの位置(ウィンドウの左上に配置) | |||
0, 0, // エディットコントロールのサイズ(ウィンドウサイズにフィット) | |||
hWnd, NULL, NULL, NULL | |||
); | |||
break; | |||
case WM_SIZE: | |||
{ | |||
// ウィンドウがリサイズされたときにエディットコントロールもリサイズ | |||
int width = LOWORD(lParam); | |||
int height = HIWORD(lParam); | |||
MoveWindow(HWNDg_hEdit, | |||
0, 0, width, height, TRUE); | |||
if (wParam == SIZE_MAXIMIZED) { | |||
// ウィンドウが最大化された時の処理 | |||
//SetWindowText(hEdit, lpszSrc); | |||
} | |||
else { | |||
// ウィンドウが最大化されていない時の処理 | |||
//SetWindowText(hEdit, lpszSrc); | |||
} | |||
InvalidateRect(hWnd, NULL, TRUE); | |||
UpdateWindow(hWnd); | |||
break; | |||
} | |||
case WM_DESTROY: | |||
PostQuitMessage(0); | |||
break; | |||
default: | |||
return(DefWindowProc(hWnd, msg, wParam, lParam)); | |||
} | |||
return (0L); | |||
} | |||
</syntaxhighlight> | |||
そしたら、次にリソースを追加しましょう。ソリューションエクスプローラでリソースファイルというフィルタ部分を右クリックして表示されるメニューから「追加」-「リソース…」を選択します。そして、表示されたダイアログで、「Icon」を選択して、「新規作成」ボタンを押します。これで、プロジェクトにアイコンファイルが自動作成され、Resource.hも自動作成されます。このリソースの中身を見るには2通りの方法があります。グラフィカルなUIを伴うリソースエディタを通して閲覧する方法と、ソリューションエクスプローラの中の「(プロジェクト名).rc」という項目を右クリックして表示されるメニューから「コードを表示」というものを選択して表示する、テキスト形式のリソース定義です。Resource.hをダブルクリックしたときもテキスト形式のリソース定義を見ている扱いになります。どちらかのモードでしか閲覧できないので、切り替えようとするとファイルを閉じるけどいいか?みたいな確認ダイアログが表示されます。 | |||
ここではリソースのことについては、これ以上深くは説明しません。 | |||
ここまでの作業をしたらWindoswアプリケーションを生成する準備ができていて、Visual Studioのメニューから「ビルド」-「ソリューションビルド」をするとプリプロセス・コンパイル・リンク処理が実行され、正常に完了する状態です。その後「ローカルWindowsデバッガー」ボタンを押して実行することをやってみてもよいでしょう。 | |||
一般的なWin32アプリケーションの第1歩とは異なる形式の最初のアプリになっています。Hello, World!と表示されるのはお決まりですが、出力されたテキストが選択・編集できるようにしています。通常はデバイスコンテキストという覚えようとすると長くなる技術についての説明をしないといけないようなことを使って、選択することもできない文字を眺めるだけのアプリを作ることから始まりますが、自分はこっちから入った方がいいんじゃないかと思うので、こちらのサンプルを第1歩として提示しました。 | |||
では、すこしづつ、プログラムの説明をしていきましょう。だいぶ長くなったので、後日、次の記事で、説明ですね。あんまりやる気ないので、いつ続きを書くかもわかりませんけど。続きの記事が出来たら、リンクを記述します。この文章の下に次の記事へのリンクが出来上がる日がくるのを願いましょう。 |
2023年10月17日 (火) 01:10時点における版
概要
Windowを表示するだけのアプリを理解するのが基礎になります。それはどのようなWin32/64アプリ開発について教えてくれるWebsiteでも示されるものです。まずはペロッとプログラムを貼り付けてみます。超簡単なものでも、ものすごく長くなります。仕方ないよね。それがWin32/64アプリ開発。
Visual Studio 2022 Community の C++ を使うという前提でお話は始まります。
起動したら、ソリューションの新規作成をするため「新しいプロジェクトの作成」ボタンを押して、「Windowsデスクトップウィザード」を選択します。そして「次へ」ボタンを押します。プロジェクトの名前は「Win32EditBase」としましょうか?好きな名前つけていただいてもよいです。ソリューション名は同じでいいと思います。なので、ラジオボタンの「ソリューションとプロジェクトを同じディレクトリに配置する」にチェックを入れましょう。保存するディレクトリも規定値のままでよいと思います。「C:¥User¥(ユーザ名)¥source¥repos」が規定値だと思います。このディレクトリをマイドキュメントの中のVisual Studio 2022というフォルダの中にショートカットを作成しておくなどしておくと、よく使うので、たどり着きやすくなります。オススメです。そしたら「作成」ボタンを押します。
次に表示されたダイアログで、アプリケーションの種類を「デスクトップアプリケーション」を選択して、追加のオプションからラジオボタンの「空のプロジェクト」を選択します。
そしたらVisual Studioのメイン画面が表示されるので、まずはソースファイルを記述するために、ソリューションエクスプローラーから、ソースファイルのフィルタの上で右クリックして表示されるメニューから「追加」-「新しい項目」を選択して「main.cpp」と入力して、以下のようなソースコードを入力します。長いです。コピーしても手打ちしてもよいです。
この後でリソースというものを追加する作業をする予定で、それをやるまでは、resource.hファイルとIDI_ICON1というキーワードが存在しないという内容のエラーが検出されます。
main.cpp
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
wchar_t szClassName[] = L"SimpleEditWindow";
HWND HWNDg_hEdit;
HWND HWNDg_hWnd;
HINSTANCE HINSTANCEg_hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND HWNDhWnd;
MSG MSGmsg;
WNDCLASS WNDCLASSwc;
if (!hPreInst) {
WNDCLASS WNDCLASSwc = { 0 };
WNDCLASSwc.lpfnWndProc = WndProc;
WNDCLASSwc.hInstance = hInstance;
WNDCLASSwc.lpszClassName = szClassName;
WNDCLASSwc.lpszMenuName = NULL;
WNDCLASSwc.hCursor = LoadCursor(NULL, IDC_ARROW);
WNDCLASSwc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IDI_ICON1,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
if (!RegisterClass(&WNDCLASSwc))
return FALSE;
}
HWNDhWnd = CreateWindowEx(
0,
szClassName,
L"Win32Applicationタイトル",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
HWNDg_hWnd = HWNDhWnd;
HINSTANCEg_hInst = hInstance;
ShowWindow(HWNDhWnd, nCmdShow);
UpdateWindow(HWNDhWnd);
while (GetMessage(&MSGmsg, NULL, 0, 0)) {
TranslateMessage(&MSGmsg);
DispatchMessage(&MSGmsg);
}
return (MSGmsg.wParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_CREATE:
// エディットコントロールの作成
HWNDg_hEdit = CreateWindowEx(
0,
L"EDIT", // エディットコントロールのクラス名
L"Hello, World!",
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_HSCROLL | WS_VSCROLL,
0, 0, // エディットコントロールの位置(ウィンドウの左上に配置)
0, 0, // エディットコントロールのサイズ(ウィンドウサイズにフィット)
hWnd, NULL, NULL, NULL
);
break;
case WM_SIZE:
{
// ウィンドウがリサイズされたときにエディットコントロールもリサイズ
int width = LOWORD(lParam);
int height = HIWORD(lParam);
MoveWindow(HWNDg_hEdit,
0, 0, width, height, TRUE);
if (wParam == SIZE_MAXIMIZED) {
// ウィンドウが最大化された時の処理
//SetWindowText(hEdit, lpszSrc);
}
else {
// ウィンドウが最大化されていない時の処理
//SetWindowText(hEdit, lpszSrc);
}
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}
そしたら、次にリソースを追加しましょう。ソリューションエクスプローラでリソースファイルというフィルタ部分を右クリックして表示されるメニューから「追加」-「リソース…」を選択します。そして、表示されたダイアログで、「Icon」を選択して、「新規作成」ボタンを押します。これで、プロジェクトにアイコンファイルが自動作成され、Resource.hも自動作成されます。このリソースの中身を見るには2通りの方法があります。グラフィカルなUIを伴うリソースエディタを通して閲覧する方法と、ソリューションエクスプローラの中の「(プロジェクト名).rc」という項目を右クリックして表示されるメニューから「コードを表示」というものを選択して表示する、テキスト形式のリソース定義です。Resource.hをダブルクリックしたときもテキスト形式のリソース定義を見ている扱いになります。どちらかのモードでしか閲覧できないので、切り替えようとするとファイルを閉じるけどいいか?みたいな確認ダイアログが表示されます。
ここではリソースのことについては、これ以上深くは説明しません。
ここまでの作業をしたらWindoswアプリケーションを生成する準備ができていて、Visual Studioのメニューから「ビルド」-「ソリューションビルド」をするとプリプロセス・コンパイル・リンク処理が実行され、正常に完了する状態です。その後「ローカルWindowsデバッガー」ボタンを押して実行することをやってみてもよいでしょう。
一般的なWin32アプリケーションの第1歩とは異なる形式の最初のアプリになっています。Hello, World!と表示されるのはお決まりですが、出力されたテキストが選択・編集できるようにしています。通常はデバイスコンテキストという覚えようとすると長くなる技術についての説明をしないといけないようなことを使って、選択することもできない文字を眺めるだけのアプリを作ることから始まりますが、自分はこっちから入った方がいいんじゃないかと思うので、こちらのサンプルを第1歩として提示しました。
では、すこしづつ、プログラムの説明をしていきましょう。だいぶ長くなったので、後日、次の記事で、説明ですね。あんまりやる気ないので、いつ続きを書くかもわかりませんけど。続きの記事が出来たら、リンクを記述します。この文章の下に次の記事へのリンクが出来上がる日がくるのを願いましょう。