C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: クリックした点を直線で結びたい


(過去ログ 82 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■48418 / inTopicNo.1)  クリックした点を直線で結びたい
  
□投稿者/ 通りすがり (60回)-(2010/04/05(Mon) 22:52:33)

分類:[C/C++] 

2010/04/05(Mon) 23:42:30 編集(投稿者)
C++、Win32APIでクリックした点を順番に直線で結ぶプログラムを組みたいのですがうまくいきません
何がおかしいんでしょうか?
どなたか助けてください

#include<windows.h>

#define AN TEXT("SampleWindow")

int pc=0;

LRESULT CALLBACK WindowProc(
							HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam
							){
								HDC hdc;
								PAINTSTRUCT ps;
								POINT pt[255]={};
								TCHAR str[255];


								switch(uMsg){
									case WM_DESTROY:
										PostQuitMessage(0);
										return 0;
									case WM_PAINT:
										//if(pc<=0)return 0;
										hdc = BeginPaint(hWnd,&ps);
										//if(pc>=1){
											MoveToEx(hdc,pt[0].x,pt[0].y,NULL);
											for(int i=1;i<pc;i++){
												LineTo(hdc,pt[i].x,pt[i].y);
											}
										//}
										EndPaint(hWnd,&ps);
										return 0;
									case WM_LBUTTONDOWN:
										pt[pc].x=LOWORD(lParam);
										pt[pc].y=HIWORD(lParam);
										hdc = GetDC(hWnd);
										wsprintf(str,"pt[%d]=(%d,%d)",pc,pt[pc].x,pt[pc].y);
										TextOut(hdc,15,15,str,lstrlen(str));
										ReleaseDC(hWnd,hdc);
										pc+=1;
										return 0;
								}
								return DefWindowProc(hWnd,uMsg,wParam,lParam);
							}

int WINAPI WinMain(
				   HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   PSTR lpCmdLine,
				   int nCmdShow
				   ){
					   WNDCLASS wc;
					   MSG msg;

					   wc.cbClsExtra=0;
					   wc.cbWndExtra=0;
					   wc.hbrBackground=(HBRUSH)COLOR_BACKGROUND + 1;
					   wc.hCursor=LoadCursor(NULL,IDC_ARROW);
					   wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
					   wc.hInstance=hInstance;
					   wc.lpfnWndProc=WindowProc;
					   wc.lpszClassName=AN;
					   wc.lpszMenuName=NULL;
					   wc.style=CS_HREDRAW|CS_VREDRAW;

					   if(!RegisterClass(&wc))return 0;

					   if(CreateWindow(
						   AN,TEXT(__FILE__),
						   WS_OVERLAPPEDWINDOW|WS_VISIBLE,
						   CW_USEDEFAULT,CW_USEDEFAULT,
						   CW_USEDEFAULT,CW_USEDEFAULT,
						   NULL,NULL,hInstance,NULL)==NULL)return 0;
					   while(GetMessage(&msg,NULL,0,0)>0){
						   DispatchMessage(&msg);
					   }
					   return msg.wParam;
				   }

引用返信 編集キー/
■48419 / inTopicNo.2)  Re[1]: うまくいきません
□投稿者/ Azulean (539回)-(2010/04/05(Mon) 23:23:05)
まず、タイトルは内容を簡潔に表したものにしましょう。
「うまくいきません」は一つの事実かも知れませんが、どのような質問なのか全くわかりません。

No48418 (通りすがり さん) に返信
> int pc=0;
これは WindowProc の外にありますが、どういった意図だったか思い出してください。
そうした後、WindowProc の中にある変数はその位置であるべきかどうか、一つずつ考えてみてください。

> HDC hdc;
> PAINTSTRUCT ps;
> POINT pt[255]={};
> TCHAR str[255];


とりあえず、ピンポイントだけ。
ほかにも問題がありそうな気もしますが、読み切っていません。
引用返信 編集キー/
■48438 / inTopicNo.3)  Re[1]: クリックした点を直線で結びたい
□投稿者/ .SHO (1250回)-(2010/04/06(Tue) 11:20:05)
No48418 (通りすがり さん) に返信

>case WM_PAINT:
> //if(pc<=0)return 0;
> hdc = BeginPaint(hWnd,&ps);
> //if(pc>=1){
> MoveToEx(hdc,pt[0].x,pt[0].y,NULL);
> for(int i=1;i<pc;i++){
> LineTo(hdc,pt[i].x,pt[i].y);
> }
> //}
> EndPaint(hWnd,&ps);
> return 0;

if(pc>=1){ がコメントアウトされてますが、これがないと
pt[0] にデータがない時に、WM_PAINTがよばれるとコケます。

そもそも pt の内容が保持されてません。
pc は保持してるのにねぇ〜。
引用返信 編集キー/
■48451 / inTopicNo.4)  Re[2]: クリックした点を直線で結びたい
□投稿者/ 通りすがり (61回)-(2010/04/06(Tue) 20:18:54)
2010/04/06(Tue) 20:20:08 編集(投稿者)

No48438 (.SHO さん) に返信
> ■No48418 (通りすがり さん) に返信
>
> >case WM_PAINT:
>> //if(pc<=0)return 0;
>> hdc = BeginPaint(hWnd,&ps);
>> //if(pc>=1){
>> MoveToEx(hdc,pt[0].x,pt[0].y,NULL);
>> for(int i=1;i<pc;i++){
>> LineTo(hdc,pt[i].x,pt[i].y);
>> }
>> //}
>> EndPaint(hWnd,&ps);
>> return 0;
>
> if(pc>=1){ がコメントアウトされてますが、これがないと
> pt[0] にデータがない時に、WM_PAINTがよばれるとコケます。
>
> そもそも pt の内容が保持されてません。
> pc は保持してるのにねぇ〜。

POINT pt[255];
の位置をWindowProcの外に出したらうまくいきました。
アドバイスありがとうございます。
解決済み
引用返信 編集キー/
■48454 / inTopicNo.5)  Re[2]: クリックした点を直線で結びたい
□投稿者/ Azulean (540回)-(2010/04/06(Tue) 23:49:40)
No48438 (.SHO さん) に返信
> if(pc>=1){ がコメントアウトされてますが、これがないと
> pt[0] にデータがない時に、WM_PAINTがよばれるとコケます。

本筋じゃありません。
pt[0] 自体は領域として存在するので、MoveToEx に int の範囲内で落ちるような不具合がなければ、特に実害は出ないんじゃないかな。
for ループ自体は pc をみてますし。

どちらかというと、256 回目のクリックの方が問題になりそうです。
解決済み
引用返信 編集キー/
■48464 / inTopicNo.6)  Re[3]: クリックした点を直線で結びたい
□投稿者/ .SHO (1252回)-(2010/04/07(Wed) 08:58:14)
No48454 (Azulean さん) に返信

> pt[0] 自体は領域として存在するので、MoveToEx に int の範囲内で落ちるような不具合がなければ、特に実害は出ないんじゃないかな。
> for ループ自体は pc をみてますし。

確かに。
そのとおりです。

> どちらかというと、256 回目のクリックの方が問題になりそうです。

ですね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -