質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3887閲覧

c言語で図形ボタン作成

Mikisi

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/04/29 15:45

編集2021/04/30 13:07

質問内容

ウィンドウを開いたり、デスクトップに戻ってもずっと表示される(タスクバーのように)丸いボタンを作成したいのですが、c言語でどのようなプログラムを書けば良いのかわかりません。
どのようにするれば作れますか。回答よろしくお願いします。

補足情報

OS Windows10
プログラム言語 c++

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2021/04/29 16:45

C言語以外だとご質問の内容を満たすプログラムを書ける、という前提なのか、質問者さんが初学者でC言語で初めてプログラムを組もうとしているのか、などによって、回答の内容が極端に変わります。ご自身のスキルレベル、対象のOSなどもう少し詳しく書いていただいた方が的確な回答が集まりやすいと思います。
neuromancer

2021/04/29 17:00

Windowsですか? C言語ではキツイと思います。 Visual StudioのC++ですか? C言語に近いもので、言語を変えて良いならC#にしましょう。
dodox86

2021/04/30 01:58

まず、どういった環境(OS)での話かをはっきりさせましょう。ウィンドウ、デスクトップと言っても色々あります。Windowsなのか、UN*X上で使われるX Windowシステムなどの話なのか、はたまた極端な例では組み込みのLCDパネルであるとか。全ての環境で使えるC言語(に限らないけど)で書かれた汎用的なプログラムは存在しません。
dodox86

2021/04/30 12:34

[2021/04/30 20:44]の質問編集を読んで: どうもあまりコミュニケーションを取るおつもりが無いように見受けられるのと、もしかしたらteratailを少し誤解されているかもしれないですので、以下を挙げておきます。 [質問するときのヒント] https://teratail.com/help/question-tips あくまでC言語/C++ならば、Win32 APIを使って丸く見えるボタンぽいものを作ることはできます。 しかし「ウィンドウを開いたり、デスクトップに戻ってもずっと」と言う状況が現時点ではこの質問を読んだ多くの人が分からないと思いますので、以上のコメントに留めておきます。
guest

回答2

0

ベストアンサー

もう少し詳しく質問文書かないと、ちゃんと答えてくれる人いないと思いますよ。
(トップ層の回答者は一日に何問も答えてるので、質問文が曖昧だと答えてもらえません…)

私は暇なのでサンプル書いてみました。

C言語は標準ではGUIは対応してないので、環境に対応したAPIやライブラリを使う必要があります。
Windows環境ならWindowsAPIが使えるので、それで書いてみました。
(c++でしか確認してないけど、Cでも動くはず…。)

C++

1#include <windows.h> 2 3LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 4 5int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow) 6{ 7 //各種変数・構造体宣言 8 HWND hWnd; 9 MSG msg; 10 WNDCLASS WndClass; 11 12 //WNDCLASS構造体を初期化 13 WndClass.style = CS_HREDRAW | CS_VREDRAW; //スタイル 14 WndClass.lpfnWndProc = WndProc; //プロシージャ 15 WndClass.cbClsExtra = 0; //特別領域設定(通常は0で) 16 WndClass.cbWndExtra = 0; //特別領域設定(通常は0で) 17 WndClass.hInstance = hInstance; //インスタンス 18 WndClass.hIcon = NULL; //アイコン 19 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソル 20 WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE +1); //背景色 21 WndClass.lpszMenuName = NULL; //メニュー 22 WndClass.lpszClassName = "ButtonWindow"; //クラス名 23 24 //WNDCLASSを登録(エラーなら終了) 25 if (!RegisterClass(&WndClass))return FALSE; 26 27 //ウインドウを作成 28 hWnd = CreateWindow( 29 "ButtonWindow", //クラス名 30 "ウインドウをボタンにする", //ウインドウタイトル 31 WS_POPUP, //ウインドウスタイル 32 CW_USEDEFAULT, CW_USEDEFAULT, //位置 33 200,200, //大きさ 34 NULL, NULL, hInstance, NULL); 35 36 //ウインドウ作成に失敗したら終了 37 if (hWnd == NULL)return FALSE; 38 39 //ウインドウを表示 40 ShowWindow(hWnd, nCmdShow); 41 UpdateWindow(hWnd); 42 43 //メインループ(ウインドウメッセージ処理) 44 while (GetMessage(&msg, NULL, 0, 0)) { 45 DispatchMessage(&msg); 46 } 47 48 //終了 49 return (msg.wParam); 50} 51 52//ウインドウプロージャー 53LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 54{ 55 HDC hdc; 56 PAINTSTRUCT ps; 57 static LPTSTR lptStr = (LPTSTR)"ボタンです。"; 58 59 switch (msg) { 60 case WM_CREATE://ウインドウが作成されたらここに来る(実は一番最初に来るわけではない…) 61 //ウインドウを円形にする 62 SetWindowRgn(hWnd, CreateEllipticRgn(0, 0, 200, 200), TRUE); 63 //ウインドウを画面の中心に設置(マルチディスプレイだと多分不具合が出る…) 64 SetWindowPos(hWnd, HWND_TOPMOST, 65 GetSystemMetrics(SM_CXSCREEN) / 2 - 100, 66 GetSystemMetrics(SM_CYSCREEN) / 2 - 100, 67 200,200, SWP_NOACTIVATE); 68 break; 69 case WM_LBUTTONUP://ボタン(ウインドウ)を押したらここに来る(大抵のソフトは押した瞬間じゃなくて、離した瞬間に処理してるのでUPの方で…) 70 if (MessageBox(hWnd, "ボタンが押されました。\n終了しますか?", "確認", MB_YESNO | MB_ICONWARNING) == IDYES) {//ダイアログ表示 71 DestroyWindow(hWnd);//はいを押したらウインドウを破棄 72 }; 73 break; 74 case WM_PAINT://描画が更新される際にここに来る 75 hdc = BeginPaint(hWnd, &ps); //描画の準備 76 SetBkMode(hdc, TRANSPARENT); //背景を塗りつぶさない設定 77 TextOut(hdc, 40, 90, lptStr, lstrlen(lptStr)); //文字列を描画 78 EndPaint(hWnd, &ps); //描画の終了 79 break; 80 case WM_DESTROY://ウインドウが破棄されたらここに来る 81 PostQuitMessage(0);//終了メッセージをポスト(メインループで終了処理される) 82 break; 83 default://それ以外はデフォルトのプロージャに丸投げする 84 return(DefWindowProc(hWnd, msg, wParam, lParam)); 85 } 86 return 0; 87}

ただ結構古い知識ですので、今はもっと楽に出来るライブラリがあると思います。
(マイクロソフトはなんだかんだ言って過去OSとの互換性残してくれるんで、古いWinAPIの書式でも動きますが…)

今みたいな曖昧な質問文なら、「C言語で使えるお勧めのGUIライブラリは何ですか?」みたいな感じで聞いた方が、まだいい答えがもらえるかもしれません…。

WindowsAPIでいいなら「標準 Windows API」のページが解り易くておすすめです。

投稿2021/05/01 06:10

編集2021/05/01 06:57
kousatu

総合スコア225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/05/01 07:10 編集

> c++でしか確認してないけど、Cでも動くはず…。 試させていただきました。C言語(*.c)でももちろんちゃんと動きました。(Visual Studio 2019/Win.10)動作環境を踏まえ、適切なライブラリを利用してコードを書けば、かくも速く実際に動くプログラムを示せる好例だと思います。高評価させていただきました。
Mikisi

2021/05/03 03:20

ありがとうございます。 思っていた通りにできました。
guest

0

丸い絵を描いた画像をロードして、その画像を表示したウインドウのマウスクリックイベントをキャッチして、イベントハンドラの中でマウスクリックされた座標を判定して、その座標が(四角形の)画像領域内のとき、ボタンクリック時の動作を行う。

厳密に丸いボタンの領域内をクリックされたときだけボタンクリック操作をさせたい場合はsin,cosとか駆使して丸い領域の範囲を計算してやる必要があります。通常、四角形の領域のマウスクリックに反応する仕組みでも誤魔化せるので四角形の領域で問題ありません。

ちなみにC言語にはマウスクリックイベントをキャッチする機能は標準では用意されていないので、マウスのデバイスドライバーを叩いてマウスクリックイベントをキャッチするイベントハンドラをフルスクラッチで実装する必要があります。

本当にC言語で実装しようとすると上記のようなことになります。

投稿2021/04/30 00:48

編集2021/04/30 01:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/30 02:41

質問への追記、修正依頼を書いている人へ この質問者が質問の文面通りに問題を解決しようとしたら数年掛かるって読めばわかるじゃん。細々とした追記の要請なんか只の意地悪だよ。
Zuishin

2021/04/30 02:50

嘘の回答の方がただの意地悪だろう。
episteme

2021/04/30 17:30

> 厳密に丸いボタンの領域内をクリックされたときだけボタンクリック操作をさせたい場合はsin,cosとか駆使して丸い領域の範囲を計算してやる必要があります。 マウスポインタとボタン中心との距離で判定でき、sin/cosは不要。 > ちなみにC言語にはマウスクリックイベントをキャッチする機能は標準では用意されていないので、マウスのデバイスドライバーを叩いてマウスクリックイベントをキャッチするイベントハンドラをフルスクラッチで実装する必要があります。 マウスクリックおよびその位置は Windowsなら 飛んできたメッセージで検出できます。 Windows-API 使えばフルスクラッチ実装の必要はありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問