• ベストアンサー

四角形と線との関係(C言語・API)

C言語にてWINDOWS APIのプログラミングをしています。 そこでちょっとわからないのですが、 このソースをご覧いただけますか。 http://onegaisimasune.web.fc2.com/main7.txt このソースは、ウィンドウ上に四角形があり、 また、クリックで線も引けるというものですが、 四角形の上から線を引くと、線が四角形の下に かぶさってしまいます。 何とか四角形の上に持ってくる方法はありませんでしょうか。 宜しくお願い致します。

noname#142813
noname#142813

質問者が選んだベストアンサー

  • ベストアンサー
noname#50176
noname#50176
回答No.1

以下に変更してみてはどうですか? #include <windows.h> #include <tchar.h> // 定数 int push = 0; // 左ボタンが押されているか #define WINDOW_WIDTH (400) // ウィンドウの幅 #define WINDOW_HEIGHT (300) // ウィンドウの高さ #define WINDOW_X ((GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH ) / 2) #define WINDOW_Y ((GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT ) / 2) #define MAX 100 // プロトタイプ宣言 HWND Create(HINSTANCE hInst); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); // 開始位置 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { HWND hWnd; MSG msg; // ウィンドウを作成する hWnd = Create( hInst ); if( hWnd == NULL ) { MessageBox( NULL, _T("ウィンドウの作成に失敗しました"), _T("エラー"), MB_OK ); return 1; } // ウィンドウを表示する ShowWindow( hWnd, SW_SHOW ); UpdateWindow( hWnd ); // メッセージループ while( 1 ) { BOOL ret = GetMessage( &msg, NULL, 0, 0 ); // メッセージを取得する if( ret == 0 || ret == -1 ) { // アプリケーションを終了させるメッセージが来ていたら、 // あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける break; } else { // メッセージを処理する TranslateMessage( &msg ); DispatchMessage( &msg ); } } return msg.wParam; } // ウィンドウを作成する HWND Create(HINSTANCE hInst) { WNDCLASSEX wc; // ウィンドウクラスの情報を設定 wc.cbSize = sizeof(wc); // 構造体サイズ wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; // スタイル wc.lpfnWndProc = WndProc; // ウィンドウプロシージャ wc.cbClsExtra = 0; // 拡張情報1 wc.cbWndExtra = 0; // 拡張情報2 wc.hInstance = hInst; // インスタンスハンドル wc.hIcon = (HICON)LoadImage( // アイコン NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED ); wc.hIconSm = wc.hIcon; // 子アイコン wc.hCursor = (HCURSOR)LoadImage( // マウスカーソル NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED ); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景 wc.lpszMenuName = NULL; // メニュー名 wc.lpszClassName = _T("Default Class Name");// ウィンドウクラス名 // ウィンドウクラスを登録する if( RegisterClassEx( &wc ) == 0 ){ return NULL; } // ウィンドウを作成する return CreateWindow( wc.lpszClassName, // ウィンドウクラス名 _T("Sample Program"), // タイトルバーに表示する文字列 WS_OVERLAPPEDWINDOW, // ウィンドウの種類 WINDOW_X, // ウィンドウを表示する位置(X座標) WINDOW_Y, // ウィンドウを表示する位置(Y座標) WINDOW_WIDTH, // ウィンドウの幅 WINDOW_HEIGHT, // ウィンドウの高さ NULL, // 親ウィンドウのウィンドウハンドル NULL, // メニューハンドル hInst, // インスタンスハンドル NULL // その他の作成データ ); } // ウィンドウプロシージャ // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static POINT start[MAX]; // 四角形の始点 static POINT end[MAX]; // 四角形の終点 static int num=0; HDC hDC,hdc; HPEN hPen; PAINTSTRUCT ps; int i; switch( msg ) { case WM_LBUTTONDOWN: if (num<MAX) push=1; return 0; case WM_MOUSEMOVE: if (push==1) { start[num].x = LOWORD( lp ); start[num].y = HIWORD( lp ); push=2; } else if (push==2) { end[num].x = LOWORD( lp ); end[num].y = HIWORD( lp ); InvalidateRect( hWnd, NULL, TRUE ); } return 0; case WM_LBUTTONUP: push=0,num++; break; case WM_PAINT: // 無効領域があるとき // 四角形を描く hDC = BeginPaint( hWnd, &ps ); if (num) for (i=0;i<=num;i++) { hPen = CreatePen( PS_SOLID, 1, RGB(0, 0, 0) ); // 黒い点線のペンを作成 SelectObject( hDC, hPen ); // 作成したペンを使用するように設定 MoveToEx(hDC , start[i].x , start[i].y , NULL); LineTo(hDC , end[i].x , end[i].y);// 四角形を描画 } if( push==2 ){ // ドラッグ中の描画処理 MoveToEx(hDC , start[num].x , start[num].y , NULL); LineTo(hDC , end[num].x , end[num].y);// 四角形を描画 }// 作成したペンを削除 DeleteObject( hPen ); EndPaint( hWnd, &ps ); return 0; case WM_DESTROY: // ウィンドウが破棄されるとき PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wp, lp ); }

noname#142813
質問者

補足

わざわざすいません(^^; ありがとうございます!

関連するQ&A

  • うまく表示されない。(API・C言語)

    C言語でAPIのプログラミングを行っている者です。 ソースはこちらとなります。 http://onegaisimasune.web.fc2.com/main6.txt mux2.vはこちらです。 http://onegaisimasune.web.fc2.com/main5.txt そこで、二つ程今のとこバグがあり、 1つ目は何度かウィンドウ上で左クリックしていると、 23回目くらいの所でウィンドウ上の文字が消えてしまう、 と言う問題と、 2つめはウィンドウを画面の外に追い出すと ウィンドウ上の文字が消えてしまうというものです。 どこが問題なのか、ご指摘願います。 どうか宜しくお願い致します。

  • 不具合が発生(API・C言語)

    WINDOWS APIをc言語でプログラムしているものです。 こちらのプログラムを書いたのですが、 http://onegaisimasune.web.fc2.com/main8.txt 左クリックで線を引くのですが、 線を引いていると普通の文字は消えないのですが、 ある操作をした整数を表示させるようにすると、 その整数が変わってしまいます。 どうしたら直るのでしょうか。 宜しくお願い致します。

  • ウィンドウを動かして端に追いやると文字が消える(API・C言語)

    C言語でWindows APIのプログラミングをしているものです。 プログラムができたのですが、ウィンドウを動かし、 端に追いやるとウィンドウ上の文字や図形が消えてしまいます。 なぜでしょうか・・・。 結構チェックはしたもののわからずじまいです。 アドバイスお願い致します。 こちらです。 http://onegaisimasune.web.fc2.com/main5.txt

  • ファイルパスの二回目の読み込み(API・C言語)

    ウィンドウから右クリックでファイルダイアログを開き、 ファイルパスを取得、ある操作をさせて ウィンドウ上に表示させると言うプログラムを、 C言語、コンパイラはBorland C++、Windows APIにて 作成しております。 そこで、一回目、右クリックしてパスを読み込み、 表示させる事には成功したのですが、 二回目、同じようにウィンドウ上で右クリックして、 パスを読み込むと、おかしな表示となってしまいます。 二回目も一回目と同じような表示にさせるにはどうしたら いいでしょうか。 アドバイス宜しくお願い致します。 ソースはこちらです。 http://onegaisimasune.web.fc2.com/main3.txt

  • 二回目の右クリックで正しく表示(C言語・API)

    C言語にて、Windows APIのプログラミングをしております。 現在ウィンドウを作成して、右クリックでファイルパスを 読み込み、そのテキストファイルからある文字の数を数えて その数だけ長方形にして表示させるプログラムを作成しております。 そこで、一回目の右クリックでファイルパスの読み込みは成功 したのですが、二回目以降、うまく行きません。 ファイルパスの表示は、何回もファイルパスを呼び出しても、 うまく表示されます。 長方形がうまく表示されないのですが、なぜでしょうか。 ソースはこちらになります。コンパイラはBorland C++ のフリーのものを使用しております。 http://onegaisimasune.web.fc2.com/main4.txt

  • C言語でWin32API

    C言語を使ってWin32APIを呼び出すような、Windowsプログラミングを始めたいんですが、何かよい本やサイトはご存知ないでしょうか。 Visual C++6.0はあるんで、それを使えばいいと思うんです。 C言語はわかるんですが、Windowsプログラミングに関する知識はほとんどないので、ごく基本的なことから知りたいんです。 WinMain関数というのを書くようなんですが、その書き方すら知りません。  スケルトン(出来れば、それよりもっと基本的なこと)から書いてあるようなものです。

  • APIはプログラミング言語?

    基本的な事がわからないので教えていただきたいのですが APIと言うのは、Parlやjavaのような 「プログラミング言語」なのでしょうか? そして、APIを理解することで windowsプログラミングと言うのができるのでしょうか?

  • C++ API 全般 APIの概要は

    独学にてプログラミングを勉強しているのですが、いきづまってしまったので質問お願いします。 ※Visual Studio 2008 Express Editionsを使用しています。 まだプログラミングに関しての勉強を始めて1ヶ月程度で、最初はVB.NETから始めて、最近C++に乗り換えました。 趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。) まったく1からのスタートで、現在win32コンソールアプリケーションにてコードの勉強をしているところです。 勉強に使っている参考文献は ・VisualC++.NET逆引き大全500の極意 ・ゲームプログラマになる前に覚えて起きたい技術(これを買うには早すぎたようです…。第一章も半分くらいしか理解できません…。) サイトは ・主に「0からのゲームプログラミング」というサイトです。 http://www.plustarnet.com/aspil/Programming/ 本題の質問ですが、APIというものがいまいち理解できません。 (1)上記のような目的で使用するAPIは、標準 Windows APIというものでいいのでしょうか? (2)win32コンソールアプリケーションでは実行できるのに、win32プロジェクトでは実行できないのはなぜでしょうか? #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , TEXT("Hello Wold!") , TEXT("メッセージボックス") , MB_OK); return 0; } (3)http://www.plustarnet.com/aspil/Programming/CConsole.htm このURLのコンソールAPIというのは、一般的に使われているものでしょうか?それともこのサイトのオリジナルのものでしょうか?win32コンソールアプリケーションでAPIを使うには、このURLのCConsoleクラスとうものをインクルードしないといけないのでしょうか?#include<windows.h>と宣言することによって気軽に使いたいものを使うことはできないのでしょうか? (4)#include<windows.h> とした場合、作るものが「win32コンソールアプリケーション」だったり「win32プロジェクト」だったり「windowsフォームアプリケーション」だったりで、使用方法などがまったく別になってしまうのでしょうか? (5)そもそも、上記の目的の場合APIを勉強する必要はあるでしょうか? (6)勉強をしたほうが後々に役立つ場合、どのAPIを勉強するのがいいのでしょうか?(APIといっても様々なものがあるんだなと思い質問しました。もし勘違いでAPIというものは一つしかないとしたらすみません。) なぜAPIに関してかというと、単純に上記のサイトで言語編の一番上から順に見ていったからです。 初心者すぎて質問が的外れかもしれませんがよろしくお願いします。

  • JAVA API を他の言語からの利用するには?

    データマイニングツール WekaのAPIでの利用について、 http://www.cs.waikato.ac.nz/~ml/index.html を見るとJavaから操作できる様ですが 他の言語から操作する事もできるのでしょうか APIの使い方ついては、知識はありませんがこれから 勉強して「日本語プログラミング言語なでしこ」 http://nadesi.com/ と言う言語から利用したいのですが、 他のの言語からAPI利用するにはどのように すれば良いでしょうか? Javaを使われている方でしたらお解かりになられるかと 思いこちらに投稿させていただきました。 投稿カテゴリが不適切でしたら申し訳ありません。

    • ベストアンサー
    • Java
  • c言語ネットワークプログラミングのAPIを乗せているwebページないですか?

    現在私はC言語でソケット通信を使って サーバとクライアントでメッセージのやり取りをおこなってみたいと思っているのですが どのライブラリのどの関数を使って通信できるのか全くわかりません。 (例えば、readの返り値ってなにを返すんだろう?とか) できればunix上(SunOS)でのc言語ネットワークプログラミングに関する APIが乗っているURLを教えていただけないでしょうか?(できれば日本語のwebページがいいです。)

専門家に質問してみよう