• ベストアンサー

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

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

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

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

私が書くとこんな感じでしょうか。(行数稼ぐ為に括弧とかの対応が少し見辛いかもしれませんが。。) 全角スペースでインデントつけてます。 #include <windows.h> #define WS_WINDOWMODE (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX) const char * ApplicationClassName = "WindowsApplication"; const char * WindowTitleName = "WindowTitle"; BOOL bActive = FALSE; BOOL OnIdle( VOID ); LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {  switch( message ) {  case WM_CREATE:   bActive = TRUE;   break;  case WM_CLOSE:   DestroyWindow( hWnd );   break;  case WM_DESTROY:   PostQuitMessage( 0 );   break;  case WM_ACTIVATE:   if ( LOWORD( wParam ) == WA_INACTIVE ){    bActive = FALSE;   } else {    bActive = TRUE;   }   break;   default:   return DefWindowProc( hWnd, message, wParam, lParam );  }  return 0L; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {  HWND hWnd;  WNDCLASS wc;  ZeroMemory(&wc, sizeof(WNDCLASS));  wc.style = CS_HREDRAW | CS_VREDRAW;  wc.lpfnWndProc = (WndProc);  wc.cbClsExtra = 0;  wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.hIcon = NULL;  wc.hCursor = LoadCursor( hInstance, MAKEINTRESOURCE(IDC_ARROW));  wc.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTIONTEXT);  wc.lpszMenuName = NULL;  wc.lpszClassName = ApplicationClassName;  if(!RegisterClass(&wc)){   MessageBox(NULL,"ウィンドウクラスの登録に失敗しました。",NULL,MB_OK);   return 0;  }  hWnd = CreateWindowEx( NULL, wc.lpszClassName, WindowTitleName, WS_WINDOWMODE,   0, 0, 320, 240, NULL, NULL, wc.hInstance, NULL );  if ( hWnd == NULL )  {   MessageBox(NULL,"ウィンドウの作成に失敗しました。",NULL,MB_OK);   return 1;  }  ShowWindow( hWnd, SW_SHOW );  MSG Msg;  do{   if( PeekMessage( &Msg, NULL, 0, 0, PM_REMOVE)){    TranslateMessage(&Msg);    DispatchMessage(&Msg);   }else if ( bActive != FALSE ){    if (!OnIdle()){ break; }   }else{    WaitMessage();   }  }while( Msg.message != WM_QUIT );  return Msg.wParam; } BOOL OnIdle( VOID ) {  if(GetAsyncKeyState( VK_ESCAPE ) & 0x0001){   return FALSE;  }  return TRUE; } 殆どのメッセージは戻り値が0なので、戻り値0のものは breakさせていますが、メッセージに応じて必要な戻り値が ある場合はそのメッセージの処理後にreturnを入れる感じです。 後は、処理をプロシージャなどに書かず、OnCreateとか適当に 造って処理を分離すると見やすくなると思います

noname#142813
質問者

補足

回答どうもありがとうございます。 これは何のプログラムなのでしょうか? 実行してみましたが、黒いウィンドウが現れるだけでしたが。。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

>これは何のプログラムなのでしょうか? WinMain雛型、スケルトンプログラムと呼ばれるものです。 (ウィンドウを表示するだけのものです) 質問者さんのコードはかなりごちゃごちゃに成りつつあります。 一度、不要な変数、おかしいインデント、不要な関数呼び出し、 などの整理をした上でトレースしていかなければ、バグを特定出来ません。 プロシージャなどの戻り値や、関数の構造はある程度参考に出来ると 思います。また、各メッセージの処理をWndProcの中で書かずに、 関数にしてから、そのメッセージが来たらWndProcから 呼び出すことで、WndProcの肥大化をある程度なくせると思います。 とりあえず、先にバグをつぶすより、コードをクリーンにしてください。そうすれば自ずとおかしい所が、見えてくる場合もあります。

noname#142813
質問者

補足

そうですね、不要箇所をまず消してみます。 アドバイスどうもありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • iyomante
  • ベストアンサー率60% (14/23)
回答No.3

そうですね。NO.2さんのおっしゃる通りです。 case WM_LBUTTONDOWNとcase WM_PAINTが直通していたので、 とりあえずそれを直したく説明していました。 1.最初に描画リソース処理の手直し 2.他のメッセージ処理や、WndProc内の変数定義。(ループ内で使いまわすフォントハンドル等はstaicで定義) 3.更新タイミングの調整。現状はLBUTTONDOWN内で背景描画なしのInalidateRectで、ループを抜けた後の更新になります。 の順で話の確認するつもりでした。 自分で手を入れた流れを勢いで書いたので勘違いしてますね。 ×・WM_LBUTTON~の1167行付近の return;もbreak; に変える。(WM_CREATE以外は最後にDefWindowProc()を通すようにする) ○・WM_LBUTTON~の1167行付近の return;もbreak; に変える。(switchの最後にdefault: return(DefWindowProc());を書いて、最終行はreturn 0;にする) サブクラス化等で用意した処理があるわけではないですし、今のDefWndProcが最後に書かれており、 switchにdefaultがないので、全てreturn 0;で問題ないですね。(戻り値はキー処理等ないので0でいいと思います。) よろしければWin32SDKのWinMain雛型を貼って指摘して頂けるとありがたいです。

全文を見る
すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

1点気になったことを。 No1さんが >WM_CREATE以外は最後にDefWindowProc()を通すようにする と書かれていますが、デフォルトのプロシージャに委託するのは、 メッセージを処理しなかった場合のみです。 通常、メッセージを処理した場合、ウィンドウプロシージャは 処理したメッセージに応じて戻り値を返さなければなりません。

全文を見る
すると、全ての回答が全文表示されます。
  • iyomante
  • ベストアンサー率60% (14/23)
回答No.1

mux2.vについては前の質問の http://onegaisimasune.web.fc2.com/verilog/mux2.txt を 使用しました。 main6.cについて、こちらでも20回ほどクリックしたらで同様の症状が再現しました。 とりあえずざっと見た部分 ・case WM_XX~ は最後 break; で終える。今WM_LBUTTON~とWM_PAINT はそのまま繋がって実行されています。 ・WM_PAINT もbreak;で終える ・WM_LBUTTON~の1167行付近の return;もbreak; に変える。(WM_CREATE以外は最後にDefWindowProc()を通すようにする) ・hdc と hDCが2種類混在使用してありhDCは値が取得されてない(多分NULL) *描画ロジックの基本的な組み方 -------------------------------------------------------- // 1.描画オブジェクトの生成 hpen = CreatePen(PS_SOLID , 0 , RGB(100 , 0 , 50)); // 2.描画オブジェクトの選択(このとき従前のオブジェクトを保管する) hOldbr = (HBRUSH)SelectObject(hdc , CreateHatchBrush(HS_DIAGCROSS , 0xFF)); hOldpen = (HPEN)SelectObject( hdc, hPen ); // 3.出力処理 TextOut(hdc , 30, 300, "hello", sizeof("hello")); // なんらかの出力処理 // 4.描画オブジェクトを戻す(保管してあったもの) SelectObject( hdc, hOldpen ); SelectObject( hdc, hOldbr ); // 5.Createした描画オブジェクトは消去 DeleteObject(hpen); ※1と5についてはロジックの一番外側でのみ行いキープしていてもよい -------------------------------------------------------------------------------------- 描画が不安定になるのは、描画オブジェクトの生成消去等うまく処理されてないからと思われます。 リソースが不安定になってます。 WM_PAINT内の繰り返し存在する描画部分は、上記のルールに合わせるようにして下さい。

noname#142813
質問者

補足

申し訳ございません、 http://onegaisimasune.web.fc2.com/verilog/mux2.txt で合っています。 質問文のURLは間違いです。 回答ありがとうございます。 ご指摘の点を修正してまた改めて補足させていただきます。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

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

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

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

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

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

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

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

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

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

  • C言語でWin32API

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

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

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

  • 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ページがいいです。)

  • 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に関してかというと、単純に上記のサイトで言語編の一番上から順に見ていったからです。 初心者すぎて質問が的外れかもしれませんがよろしくお願いします。

このQ&Aのポイント
  • 中山記念の予想をする。注目馬はパンサラッサで、開幕週の中山芝1800mで買わない理由はない。昨年3着のウインイクシードや芝1800での差し脚が魅力のカラテも注目。藤沢厩舎からは3頭出走し、ゴーフォとレッドが注目の一戦となる。
  • 中山メインの中山記念は良好な芝馬場で行われる。前残りもあり、差しも決まる馬場となっている。今回のレースは阪急杯以上に本番となる馬が多く出走しており、競馬ファンにとって注目の一戦となっている。
  • ハッシュタグ: #中山記念予想 #パンサラッサ #ウインイクシード #カラテ #競馬 #藤沢厩舎
回答を見る

専門家に質問してみよう