質問するログイン新規登録

回答編集履歴

2

コメントの誤字修正

2025/09/17 13:41

投稿

kousatu
kousatu

スコア225

answer CHANGED
@@ -1,105 +1,105 @@
1
- もう少し詳しく質問文書かないと、ちゃんと答えてくれる人いないと思いますよ。
2
- (トップ層の回答者は一日に何問も答えてるので、質問文が曖昧だと答えてもらえません…)
3
-
4
- 私は暇なのでサンプル書いてみました。
5
-
6
- C言語は標準ではGUIは対応してないので、環境に対応したAPIやライブラリを使う必要があります。
7
- Windows環境ならWindowsAPIが使えるので、それで書いてみました。
8
- (c++でしか確認してないけど、Cでも動くはず…。)
9
-
10
- ```C++
11
- #include <windows.h>
12
-
13
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
14
-
15
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow)
16
- {
17
- //各種変数・構造体宣言
18
- HWND hWnd;
19
- MSG msg;
20
- WNDCLASS WndClass;
21
-
22
- //WNDCLASS構造体を初期化
23
- WndClass.style = CS_HREDRAW | CS_VREDRAW; //スタイル
24
- WndClass.lpfnWndProc = WndProc; //プロシージャ
25
- WndClass.cbClsExtra = 0; //特別領域設定(通常は0で)
26
- WndClass.cbWndExtra = 0; //特別領域設定(通常は0で)
27
- WndClass.hInstance = hInstance; //インスタンス
28
- WndClass.hIcon = NULL; //アイコン
29
- WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソル
30
- WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE +1); //背景色
31
- WndClass.lpszMenuName = NULL; //メニュー
32
- WndClass.lpszClassName = "ButtonWindow"; //クラス名
33
-
34
- //WNDCLASSを登録(エラーなら終了)
35
- if (!RegisterClass(&WndClass))return FALSE;
36
-
37
- //ウインドウを作成
38
- hWnd = CreateWindow(
39
- "ButtonWindow", //クラス名
40
- "ウインドウをボタンにする", //ウインドウタイトル
41
- WS_POPUP, //ウインドウスタイル
42
- CW_USEDEFAULT, CW_USEDEFAULT, //位置
43
- 200,200, //大きさ
44
- NULL, NULL, hInstance, NULL);
45
-
46
- //ウインドウ作成に失敗したら終了
47
- if (hWnd == NULL)return FALSE;
48
-
49
- //ウインドウを表示
50
- ShowWindow(hWnd, nCmdShow);
51
- UpdateWindow(hWnd);
52
-
53
- //メインループ(ウインドウメッセージ処理)
54
- while (GetMessage(&msg, NULL, 0, 0)) {
55
- DispatchMessage(&msg);
56
- }
57
-
58
- //終了
59
- return (msg.wParam);
60
- }
61
-
62
- //ウインドウプロージャ
63
- LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
64
- {
65
- HDC hdc;
66
- PAINTSTRUCT ps;
67
- static LPTSTR lptStr = (LPTSTR)"ボタンです。";
68
-
69
- switch (msg) {
70
- case WM_CREATE://ウインドウが作成されたらここに来る(実は一番最初に来るわけではない…)
71
- //ウインドウを円形にする
72
- SetWindowRgn(hWnd, CreateEllipticRgn(0, 0, 200, 200), TRUE);
73
- //ウインドウを画面の中心に設置(マルチディスプレイだと多分不具合が出る…)
74
- SetWindowPos(hWnd, HWND_TOPMOST,
75
- GetSystemMetrics(SM_CXSCREEN) / 2 - 100,
76
- GetSystemMetrics(SM_CYSCREEN) / 2 - 100,
77
- 200,200, SWP_NOACTIVATE);
78
- break;
79
- case WM_LBUTTONUP://ボタン(ウインドウ)を押したらここに来る(大抵のソフトは押した瞬間じゃなくて、離した瞬間に処理してるのでUPの方で…)
80
- if (MessageBox(hWnd, "ボタンが押されました。\n終了しますか?", "確認", MB_YESNO | MB_ICONWARNING) == IDYES) {//ダイアログ表示
81
- DestroyWindow(hWnd);//はいを押したらウインドウを破棄
82
- };
83
- break;
84
- case WM_PAINT://描画が更新される際にここに来る
85
- hdc = BeginPaint(hWnd, &ps); //描画の準備
86
- SetBkMode(hdc, TRANSPARENT); //背景を塗りつぶさない設定
87
- TextOut(hdc, 40, 90, lptStr, lstrlen(lptStr)); //文字列を描画
88
- EndPaint(hWnd, &ps); //描画の終了
89
- break;
90
- case WM_DESTROY://ウインドウが破棄されたらここに来る
91
- PostQuitMessage(0);//終了メッセージをポスト(メインループで終了処理される)
92
- break;
93
- default://それ以外はデフォルトのプロージャに丸投げする
94
- return(DefWindowProc(hWnd, msg, wParam, lParam));
95
- }
96
- return 0;
97
- }
98
- ```
99
-
100
- ただ結構古い知識ですので、今はもっと楽に出来るライブラリがあると思います。
101
- (マイクロソフトはなんだかんだ言って過去OSとの互換性残してくれるんで、古いWinAPIの書式でも動きますが…)
102
-
103
- 今みたいな曖昧な質問文なら、「C言語で使えるお勧めのGUIライブラリは何ですか?」みたいな感じで聞いた方が、まだいい答えがもらえるかもしれません…。
104
-
1
+ もう少し詳しく質問文書かないと、ちゃんと答えてくれる人いないと思いますよ。
2
+ (トップ層の回答者は一日に何問も答えてるので、質問文が曖昧だと答えてもらえません…)
3
+
4
+ 私は暇なのでサンプル書いてみました。
5
+
6
+ C言語は標準ではGUIは対応してないので、環境に対応したAPIやライブラリを使う必要があります。
7
+ Windows環境ならWindowsAPIが使えるので、それで書いてみました。
8
+ (c++でしか確認してないけど、Cでも動くはず…。)
9
+
10
+ ```C++
11
+ #include <windows.h>
12
+
13
+ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
14
+
15
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow)
16
+ {
17
+ //各種変数・構造体宣言
18
+ HWND hWnd;
19
+ MSG msg;
20
+ WNDCLASS WndClass;
21
+
22
+ //WNDCLASS構造体を初期化
23
+ WndClass.style = CS_HREDRAW | CS_VREDRAW; //スタイル
24
+ WndClass.lpfnWndProc = WndProc; //プロシージャ
25
+ WndClass.cbClsExtra = 0; //特別領域設定(通常は0で)
26
+ WndClass.cbWndExtra = 0; //特別領域設定(通常は0で)
27
+ WndClass.hInstance = hInstance; //インスタンス
28
+ WndClass.hIcon = NULL; //アイコン
29
+ WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソル
30
+ WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE +1); //背景色
31
+ WndClass.lpszMenuName = NULL; //メニュー
32
+ WndClass.lpszClassName = "ButtonWindow"; //クラス名
33
+
34
+ //WNDCLASSを登録(エラーなら終了)
35
+ if (!RegisterClass(&WndClass))return FALSE;
36
+
37
+ //ウインドウを作成
38
+ hWnd = CreateWindow(
39
+ "ButtonWindow", //クラス名
40
+ "ウインドウをボタンにする", //ウインドウタイトル
41
+ WS_POPUP, //ウインドウスタイル
42
+ CW_USEDEFAULT, CW_USEDEFAULT, //位置
43
+ 200,200, //大きさ
44
+ NULL, NULL, hInstance, NULL);
45
+
46
+ //ウインドウ作成に失敗したら終了
47
+ if (hWnd == NULL)return FALSE;
48
+
49
+ //ウインドウを表示
50
+ ShowWindow(hWnd, nCmdShow);
51
+ UpdateWindow(hWnd);
52
+
53
+ //メインループ(ウインドウメッセージ処理)
54
+ while (GetMessage(&msg, NULL, 0, 0)) {
55
+ DispatchMessage(&msg);
56
+ }
57
+
58
+ //終了
59
+ return (msg.wParam);
60
+ }
61
+
62
+ //ウインドウプロージャ
63
+ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
64
+ {
65
+ HDC hdc;
66
+ PAINTSTRUCT ps;
67
+ static LPTSTR lptStr = (LPTSTR)"ボタンです。";
68
+
69
+ switch (msg) {
70
+ case WM_CREATE://ウインドウが作成されたらここに来る(実は一番最初に来るわけではない…)
71
+ //ウインドウを円形にする
72
+ SetWindowRgn(hWnd, CreateEllipticRgn(0, 0, 200, 200), TRUE);
73
+ //ウインドウを画面の中心に設置(マルチディスプレイだと多分不具合が出る…)
74
+ SetWindowPos(hWnd, HWND_TOPMOST,
75
+ GetSystemMetrics(SM_CXSCREEN) / 2 - 100,
76
+ GetSystemMetrics(SM_CYSCREEN) / 2 - 100,
77
+ 200,200, SWP_NOACTIVATE);
78
+ break;
79
+ case WM_LBUTTONUP://ボタン(ウインドウ)を押したらここに来る(大抵のソフトは押した瞬間じゃなくて、離した瞬間に処理してるのでUPの方で…)
80
+ if (MessageBox(hWnd, "ボタンが押されました。\n終了しますか?", "確認", MB_YESNO | MB_ICONWARNING) == IDYES) {//ダイアログ表示
81
+ DestroyWindow(hWnd);//はいを押したらウインドウを破棄
82
+ };
83
+ break;
84
+ case WM_PAINT://描画が更新される際にここに来る
85
+ hdc = BeginPaint(hWnd, &ps); //描画の準備
86
+ SetBkMode(hdc, TRANSPARENT); //背景を塗りつぶさない設定
87
+ TextOut(hdc, 40, 90, lptStr, lstrlen(lptStr)); //文字列を描画
88
+ EndPaint(hWnd, &ps); //描画の終了
89
+ break;
90
+ case WM_DESTROY://ウインドウが破棄されたらここに来る
91
+ PostQuitMessage(0);//終了メッセージをポスト(メインループで終了処理される)
92
+ break;
93
+ default://それ以外はデフォルトのプロージャに丸投げする
94
+ return(DefWindowProc(hWnd, msg, wParam, lParam));
95
+ }
96
+ return 0;
97
+ }
98
+ ```
99
+
100
+ ただ結構古い知識ですので、今はもっと楽に出来るライブラリがあると思います。
101
+ (マイクロソフトはなんだかんだ言って過去OSとの互換性残してくれるんで、古いWinAPIの書式でも動きますが…)
102
+
103
+ 今みたいな曖昧な質問文なら、「C言語で使えるお勧めのGUIライブラリは何ですか?」みたいな感じで聞いた方が、まだいい答えがもらえるかもしれません…。
104
+
105
105
  WindowsAPIでいいなら「[標準 Windows API](http://wisdom.sakura.ne.jp/system/winapi/win32/index.html)」のページが解り易くておすすめです。

1

コード修正

2021/05/01 06:57

投稿

kousatu
kousatu

スコア225

answer CHANGED
@@ -52,7 +52,6 @@
52
52
 
53
53
  //メインループ(ウインドウメッセージ処理)
54
54
  while (GetMessage(&msg, NULL, 0, 0)) {
55
- TranslateMessage(&msg);
56
55
  DispatchMessage(&msg);
57
56
  }
58
57