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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1644閲覧

SetTimer関数で図形が大きくなったり小さくなったりするプログラムを作りたい

TRON1216.

総合スコア37

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/17 06:53

編集2017/05/17 09:11

###前提・実現したいこと
ウィンドウに描画した円(Ellipse関数を用いた。円の直径をSとして)がある時間間隔で(SetTimer関数を用いた。)大きくなったり小さくなったりするプログラムを作りたいです。
###発生している問題・エラーメッセージ
ビルドは成功するが実行しても大きくなったり小さくなったりしません。Sの初期値がウィンドウに描画されるだけです。

エラーメッセージ

###該当のソースコード
ウィンドウプロシージャのソースコードを記述しておきます。使用言語は、C++で、環境はVisual Studioです。

#include "kobayashi.h" #include "time.h" #define ID_MYTIMER 100 LRESULT CALLBACK WndProc2( HWND hWnd2, UINT msg, WPARAM wp, LPARAM lp ) { PAINTSTRUCT ps; HDC hdc; HPEN hPen,h01dPen; HBRUSH hBrush, h01dBrush; RECT rect; S = 0.00000147; speed = 0.000001; switch (msg) { case WM_CREATE: //ウインドウが生成されたときに1度だけ通過 //時間割り込みの発生タイミングを設定 SetTimer(hWnd2, ID_MYTIMER, 2000, NULL); break; case WM_TIMER: if (wp != ID_MYTIMER) return (DefWindowProc(hWnd2, msg, wp, lp)); // タイマー割り込み処理 S += speed; if((S > 0.000004) || (S < 0.000001)) speed = -speed; InvalidateRect(hWnd2, NULL, TRUE); UpdateWindow(hWnd2); break; case WM_PAINT: hdc = BeginPaint(hWnd2, &ps); Ellipse(hdc, 292.5-(S*1000000/4*226.5+0.5), 181-(S*1000000/4*226.5+0.5), 292.5+(S*1000000/4*226.5+0.5), 181+(S*1000000/4*226.5+0.5)); hPen = CreatePen(PS_DOT, 0, RGB(255, 0, 0)); h01dPen = (HPEN)SelectObject(hdc, hPen); hBrush = (HBRUSH)GetStockObject(NULL_BRUSH); h01dBrush = (HBRUSH)SelectObject(hdc, hBrush); DeleteObject(hPen); SelectObject(hdc, h01dPen); SelectObject(hdc, h01dBrush); EndPaint(hWnd2, &ps); break; case WM_DESTROY: KillTimer(hWnd2, ID_MYTIMER); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd2, msg, wp, lp)); } return 0; }

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

epistemeさんの指摘に加え、座標値は意図したものになっていますか?

https://ideone.com/zJAbHH

C

1#include <stdio.h> 2int main(void) { 3 double S = 0.00000147; 4 double speed = 0.000001; 5 6 for( int i = 0; i < 10; i++){ 7 S += speed; 8 if((S > 0.000004) || (S < 0.000001)) 9 speed = -speed; 10 11 int l = 292.5-(S*1000000/4*226.5+0.5); 12 int t = 181 -(S*1000000/4*226.5+0.5); 13 int r = 292.5+(S*1000000/4*226.5+0.5); 14 int b = 181 +(S*1000000/4*226.5+0.5); 15 16 printf( "S=%f, Ellipse(%3d,%3d,%3d,%3d)\n", S, l, t, r, b); 17 } 18 return 0; 19}
S=0.000002, Ellipse(152, 40,432,321) S=0.000003, Ellipse( 95,-15,489,377) S=0.000004, Ellipse( 38,-72,546,434) S=0.000003, Ellipse( 95,-15,489,377) S=0.000002, Ellipse(152, 40,432,321) S=0.000001, Ellipse(208, 97,376,264) S=0.000000, Ellipse(265,153,319,208) S=0.000001, Ellipse(208, 97,376,264) S=0.000002, Ellipse(152, 40,432,321) S=0.000003, Ellipse( 95,-15,489,377)

また、普通はCreatePenSelectObjectの後にEllipse実行しますが、意図したものですか?

というか、以下だとWndProc2呼出のたびにSが初期化されてしまいます(値が変わらない)

C

1LRESULT CALLBACK WndProc2( HWND hWnd2, UINT msg, WPARAM wp, LPARAM lp ) 2{ 3 // 略 4 S = 0.00000147; 5 speed = 0.000001;

WndProc2の外で初期化すれば意図した動作になると思います。

C

1S = 0.00000147; 2speed = 0.000001; 3 4LRESULT CALLBACK WndProc2( HWND hWnd2, UINT msg, WPARAM wp, LPARAM lp ) 5{ 6 // 略

投稿2017/05/17 07:15

編集2017/05/17 09:34
can110

総合スコア38233

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

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

TRON1216.

2017/05/17 09:05

はい、合っています、、、。
can110

2017/05/17 09:13

case WM_TIMERとcase WM_PAINT に OutputDebugStringなりを追記しデバッグ実行し、意図したタイミング、値が出力されるかを確認してみてはいかがでしょうか?
TRON1216.

2017/05/17 09:15

また、EllipseをSelectObjectの後に記述しましたが結果は同じでした。
TRON1216.

2017/05/17 09:22

WM_TIMER内で、 sprintf_s(szBuf, 256, "%12.2e", S); MessageBox(NULL, szBuf, "Sの値", MB_OK); を書き込んだところ、実行結果は、2.47e-6でウィンドウは2秒ごとに更新されていきますが、ずっと値が変化していませんでした。原因がわからないです、、、
can110

2017/05/17 09:23

念のための確認ですが「S」や「speed」の変数の型は何ですか?
TRON1216.

2017/05/17 09:25

どちらもfloatです。
can110

2017/05/17 09:30 編集

あ、単純に WndProc2呼出で毎回Sとspeed初期化してますよ。関数の外に出しましょう。
TRON1216.

2017/05/17 09:31

すいません、プログラミング初心者でよくわからないです汗 初期値はどこに書くべきなのでしょうか?
can110

2017/05/17 09:34

回答に追記しました。
TRON1216.

2017/05/17 09:35

関数の外とは、どの関数のことでしょうか? 理解が低くて申し訳ありません。
TRON1216.

2017/05/17 09:38 編集

WindowProc2の外ということでしょうか?
can110

2017/05/17 09:38

そうです。
TRON1216.

2017/05/17 09:43

ありがとうございます。外に記述したところ、無事成功しました! 感謝です。
can110

2017/05/17 09:57

よかったです。(完全に見落としていた…)
guest

0

50秒毎にタイマー・イベントが発生します。あんまり遅くて再描画に気づいてなくね?

投稿2017/05/17 07:04

episteme

総合スコア16614

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

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

TRON1216.

2017/05/17 09:04

2000になおして、2秒毎に発生するようにしたのですが、実行結果は変わらずでした、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問