• ベストアンサー

SetWindowTextについて。

C言語でWindowApiのプログラムを行っています。 コンパイラはBorland C++です。 ウィンドウから、右クリックでファイルを開くダイアグラムを開き、 ある文字だけをファイルから読み込み、結果をウィンドウ上に 表示させると言う感じのプログラムを作っています。 そこでですが、 WndProc関数の中の、 GetOpenFileName(&ofn); SetWindowText(hWnd , strFile); と言う部分でファイルダイアログを開き、 ファイル読み込みをしているわけなのですが、 このstrFileを別の関数に渡したいわけです。 そういう時どうすればいいでしょう? また、char型をchar_w型に変換する際に、 WideCharToMultiByte MultiByteToWideChar 関数を用いればいいことがわかりました。 しかし、char_w型は検索しても見つかりません。 この事も何かヒントを教えていただけたらと思います。 宜しくお願い致します。

noname#142813
noname#142813

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.16

ざっと見ただけですが、前に書いたグラフィックを消していないので残っているだけでは? 例えば、文字列"12345”をTextOutで表示して 12345 あとで、同じ場所に文字列"999"をTextOutで表示すると 99945 となっている様に見えます。これは前の文字"45"が残っているためです。これじゃないでしょうか? 方法としては、 (1)文字列の後ろに適当な数の空白を付けてTextOutする。 先ほどの状態の画面で同じ場所に文字列"888  "をTextOutで表示すると 888   となります。 (2)これから文字を書く所を背景色の長方形で塗りつぶしてから文字列をTextOutする。 Rectangleでこれから文字列を書く場所を背景色で塗りつぶしておきます。 私としては(1)より(2)がお勧めです。

noname#142813
質問者

お礼

回答ありがとうございます。 そういう事ではないようです。 修正しましたので、ソース乗せて起きます。 http://onegaisimasune.web.fc2.com/main2.txt

その他の回答 (15)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.15

>一応、ファイルを開いて、ファイルを選択した時は、 >何も表示されず、その後、 >タイトルバーを広げると、思い通りの結果が表示されていました。 それはウィンドが再描画されていないだけだと思います。 InvalidateRect関数で再描画を促してください。 >それと、再度、同じように読み込みをしたら、いい結果が表示されませんでした。。 状況が良くわかりません。悪い結果とは、どんな状況ですか?

noname#142813
質問者

お礼

ご教授ありがとうございます。 早速試してみます。 再度、一回目、パスを読み込み、タイトルバーを広げると、 うまく表示されるのですが、 その後、同じように、右クリックでファイルダイアログを開き、 パスを読み込むと、 表示されたものにプラスされた表示がされてしまうのです。 具体的に言いますと、 ファイルの中の文字を数えるとします。 その数をウィンドウ上に表示させます。 次に、続けて右クリックで同じようにファイルダイアログを 開いてファイルパスを読み込むと、 前の数字にプラスされた数字が表示されてしまうのです。 一応ファイルをアップしました。 これは、InvalidateRect関数で修正していないものです。 http://onegaisimasune.web.fc2.com/main.txt

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.14

WinMainの処理に関しては、Oh-Orangeさんにお任せするとして。 私としては用語の扱いがアバウトなのを直してほしいと思います。回答者のみなさんがそのために混乱しているのが見受けられますので。 >GetOpenFileName(&ofn); >でファイルを読み込み、 >(中略) >読み込んだファイル名で置き換えれないかと言う事です。 GetOpenFileNameでは、ファイル名(パスを含む)を得ることができるだけで、ファイルを読み込む事はしません。 機能は理解していると思いますが、表現がまずいので他にも処理があるんじゃないかと混乱させられます。 「GetOpenFileName(&ofn);でパス付のファイル名を得て」などが正しい表現ですので今後は表現に注意してください。読む、読み込んだという表現はファイル実体の読み込み時ぐらいにしか使いません。 >また、別に、自分で作った、 >const char * func() >関数にも、同じ記述があり、 >ファイル名を渡して、処理をしたいのですが・・・ const char * func(TCHAR *str) と関数を作れば渡せると思いますが。 呼び出しは、 char_ptr = func(strFile); で出来ます。 注意点は、func関数の利用時点で、strFile変数の有効範囲内であることです。

noname#142813
質問者

お礼

回答ありがとうございます。 ファイルを読み込んでいるのではなく、パスを 読み込んでいるのですね、注意します。

noname#142813
質問者

補足

一応、ファイルを開いて、ファイルを選択した時は、 何も表示されず、その後、 タイトルバーを広げると、思い通りの結果が表示されていました。 何が原因でしょう。 それと、再度、同じように読み込みをしたら、いい結果が表示 されませんでした。。 不具合を修正したいと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.13

★WinMain関数内ですか? ・GetOpenFileName 関数はプロシージャ関数の WM_RBUTTONUP メッセージで  記述していますよね。ここで選択されたファイル名を WinMain 関数に記述  されている fopen 関数に渡したいの? ・この動作はウインドウを一旦閉じるとまたメッセージ・ループに入って  そのときに fopen 関数でファイルからデータを読み込む仕組みですか?  もしこの動作なら次のように改善した方が好ましいです。  (1)プロシージャ関数の WM_RBUTTONUP で GetOpenFileName 関数を呼ぶ  (2)WM_RBUTTONUP 部分で選択されたファイル名を fopen 関数に渡す  (3)WM_RBUTTONUP 部分でデータを読み書きする  (4)WM_RBUTTONUP 部分でオープンされたファイルを fclose 関数で閉じる  この仕組みにします。なぜ WinMain 関数なのでしょうか? 対策: ・『sample.txt』の部分は文字型配列の変数にしておけば良いです。  TCHAR szFile[ MAX_PATH ]; ←GetOpenFileName 関数で選択されたファイル名が入っている  FILE *fp;    if ( (fp = fopen(szFile,"r")) == NULL ){   // エラーなど  }  // 読み込み処理  fclose( fp );  ↑ ・この部分を WinMain 関数に記述するのではなくて GetOpenFileName 関数の  呼び出した後に記述してみたらどうでしょうか。  自分で作った関数にもそのまま szFile などの文字型配列を渡せば良いです。  今回はコンパイラのオプション設定より TCHAR、LPTSTR が char、char* 型と  同じになりますのでそのまま TCHAR 型の配列を char *、const char * 型に  渡せば使えます。 ・以上。なぜ WinMain 関数で fopen しているのか補足して欲しいです。仕組みを。

noname#142813
質問者

お礼

このようにしました。 case WM_RBUTTONUP: hdc = GetDC( hWnd ); if ( GetOpenFileName(&ofn) ){ if ((fp = fopen(strFile, "r")) == NULL) { /* 読み込むファイル名 */ /* ファイルを開けなかったら */ fprintf(stderr, "Can't Open C Source File!\n");/* メッセージを表示して */ exit(2);/* シェルへ戻る */ } while (GetWord(fp, word)) { BSearch(word); } SelectObject( hdc, hFont ); SetBkColor( hdc, RGB(255,255,255) ); TextOut( hdc, 200, 410, strFile, lstrlen(strFile) ); SetWindowText( hWnd, strFile ); }else{ MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK ); } fclose( fp ); ReleaseDC( hWnd, hdc ); break; また、その後の、case WM_PAINT:では、 y = func(l,strFile); のように、strFileをfuncに渡しています。 const char * func(int number,TCHAR * strz) と言った関数です。 strzの部分は、 fp = fopen(strz, "r"); if (fp == NULL){ return 0; } と言った感じです。ちなみにfclose(fp); はこの関数の、下の方でやってます。 実行してみましたが、しっかり表示されないですね・・・ strFileが渡っていないみたいです・・・

noname#142813
質問者

補足

クリックし、何もしないと表示しないのですが、 タイトルバーをクリックしてウィンドウを広げると、 何とか思い通りの結果が表示させられました。 あとはこの不具合を何とかするだけです。。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.12

★追記。 ・今気づいたが『WINAPI』キーワードは Win32 API 関数という意味で使ってる?  Win32 API 関数は char 型を引数に取るタイプと wchar_t 型を引数で受け取る  2タイプが DLL で用意されています。そしてコンパイルのオプション設定から  『UNICODE』定数の有無によりどちらの関数を呼び出すかが決まります。 ・例えば SetWindowText() API 関数は次の2タイプが DLL 内に存在します。  (1)SetWindowTextA()…char型で処理  (2)SetWindowTextW()…wchar_t型で処理  この2つの関数を直接呼び出すことも出来ますがお勧めしません。  通常は TCHAR、LPTSTR、LPCTSTR 型を使うことでコンパイルのオプションから  適切に char、wchar_t 型に置き換えられます。関数の末尾の A、W も同様に  『UNICODE』定数の有無から適切に置き換わります。 ・C 標準関数だけは char 型を処理するようになっているためこの関数群を  利用するときには char、wchar_t 型に気をつける必要があります。  本当はファイル処理なども C 標準関数ではなく Win32 API 関数か、MFC の  CStdio クラスのメンバ関数を利用します。  Windows GUI で C 標準関数のファイル入出力を使うべきではない気がします。 ・以上。今後の参考にして下さい。

noname#142813
質問者

お礼

回答ありがとうございます。 ↓にも記述しましたが、私がしたい事といいますのは、 GetOpenFileName(&ofn); でファイルを読み込み、 WinMain関数内の、 if ((fp = fopen(sample.txt, "r")) == NULL) の中の、sample.txtを何とか、 読み込んだファイル名で置き換えれないかと言う事です。 また、別に、自分で作った、 const char * func() 関数にも、同じ記述があり、 ファイル名を渡して、処理をしたいのですが・・・ できますでしょうか。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.11

★この質問は次の質問の続きですか? ・http://oshiete1.goo.ne.jp/qa3364459.html→『ファイルを開く。(API・C言語)』  もしも続きの質問でしたら OPENFILENAME 構造体に正しく情報を  セットしていないために表示できていなかった可能性があります。 ・続きの質問でないとするならこの『SetWindowTextについて。』は  どのような質問でしょうか?補足して下さい。  ちなみに『WINAPI』は WinMain() 関数ぐらいしか使いません。  ユーザ関数にはつける必要はないです。  多分は WndProc のプロシージャ関数内での TCHAR 型の文字列処理を  どうすべきかという質問ですよね。 ・以上。

参考URL:
http://oshiete1.goo.ne.jp/qa3364459.html
noname#142813
質問者

お礼

読み込んだファイルを別のC関数に渡したいのですが、 何を渡せばいいのでしょう? strFileでしょうか? ofnでしょうか?

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

>ちょっとソースは長くなるので無理だと思います・・・ 全部でなくても良いのですが、 >GetOpenFileName(&ofn); >SetWindowText(hWnd , strFile); これだと省略しすぎてわからない。。。 もしこの通りのコードならstrFileにはファイル名さえ 入っていませんし。。。もう少し周辺のコードを載せてみては?? >一つは、WINAPI関数に渡したいのですが・・・。 WINAPI関数とは何者なのでしょうか?? ANo.5さんがおっしゃっているように、WINAPIという語句は Windowsの呼び出し規約の予約語として既に使用されています。 無理にWINAPIという関数名を使うと様々なところに弊害が出ると 思います。 #もしかしてWinMain関数の事を言っている?? #あと補足を要求している部分についての回答が全くないのですが。。。

noname#142813
質問者

お礼

回答ありがとうございます。 すみません、WinMain関数の事を言っておりました。 ↓に、私のやりたい事を記述しましたので、 よろしければご覧になってください。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.9

>WINAPI関数に渡したいと思うのですが。 WINAPIの意味が違うような気がしてきました。 前に、 > WINAPI(LPCTSTR str); と書いていましたが、もしかして void WINAPI xxxxx(TCHAR *str); という関数名xxxxxの関数を作りたいという意味でしょうか? WINAPIは、WindowsAPIの呼び出し規約を定義するためのマクロで、必要な場合は定義しなくてはなりませんが、関数内でWindowsAPIを呼び出しているだけの場合は定義する必要はありません。 それともまだ別の意味があるのでしょうか?

noname#142813
質問者

お礼

回答どうもありがとうございます。 WINAPI関数ではなく、WinMain関数でした。 この、WinMain関数の中に、この記述があります。 if ((fp = fopen("sample.txt", "r")) == NULL) { fprintf(stderr, "Can't Open C Source File!\n"); ですので、この中の、sample.txtを、 ファイル読み込みダイアグラムから読み込んだファイルに 置き換え、処理をさせたいのですが。。 また、別の、 const char * func() にも、同じような、 fp = fopen(sample.txt, "r"); if (fp == NULL) の記述があり、 これを、 WndProc関数の中の、 GetOpenFileName(&ofn); から読み込んで何とか渡したいのですが。。 何とかなりませんでしょうか。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.8

★こちらにも書き込みます。 >ファイル読み込みをしているわけなのですが、 >このstrFileを別の関数に渡したいわけです。 >そういう時どうすればいいでしょう?  コンパイル・オプションが UNICDOE を定義しない設定ですので  そのまま strFile を関数などに渡せば良いと思います。  何かエラーが出た場合は補足に貼り付けて下さい。  回答しやすくなります。 ・この質問も char 型 と wchar_t 型の変換は必要ないと思います。  char 型で使う C 標準関数の文字列も TCHAR 型で宣言しても上手く動くと思います。  すべての char 型を TCHAR 型に書き換えれば問題は解決しませんか?  エラーが出た場合はそのメッセージをそのまま補足に貼り付けて下さい。 ・以上。

noname#142813
質問者

お礼

回答ありがとうございます。 置き換えてやってますね。 しかし、WINAPI関数に渡したいと思うのですが、 難しいですねぇ。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.7

WINAPIという名前は予約されているので基本的に使わないでください。 >"file.txt"の部分を置き換えたいのです。 って事は、文字列の置き換え処理を関数側でしたいってことですよね。 LPCTSTRのCはconstつまり変更しないという意味なので、文字列置換するなら使ってはいけません。TCHAR*を使ってください。 >また、char型をchar_w型に変換する際に、 >WideCharToMultiByte >MultiByteToWideChar >関数を用いればいいことがわかりました。 >しかし、char_w型は検索しても見つかりません。 >この事も何かヒントを教えていただけたらと思います。 Oh-Orangeさんの言うとおり、文字コードの変換はややこしいので、UNICODEを使わない設定でコンパイラを利用したほうが簡単です。 どうしても、文字コードの変換を使いたい理由があるのでしょうか? UNICODEで便利なこともありますので挑戦したないなら止めはしませんが。

noname#142813
質問者

お礼

ありがとうございます。 UNICODEとは何なのかとかまださっぱりわからないので、 ちょっと勉強してみます。 ちなみに使っているコンパイラはBorland C++です。

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

>char_w すみません、こちらにも書きましたが誤りです。。。 http://oshiete.nikkeibp.co.jp/qa3364459.html >別の関数に渡したいわけです この関数はどこから呼び出されるのですか?? 差し支えなければ、ソースを載せてみてはいかがでしょうか?

noname#142813
質問者

お礼

ちょっとソースは長くなるので無理だと思います・・・ 一つは、WINAPI関数に渡したいのですが・・・。 回答ありがとうございます。

関連するQ&A

  • ファイルを開く。(API・C言語)

    case WM_RBUTTONUP: GetOpenFileName(&ofn); SetWindowText(hWnd , strFile); return 0; ↑のソースは、ウィンドウを右クリックした後、ファイル名をタイトルバーに表示させるものなのですが、この、strFileを、ウィンドウの画面上に表示させるのに、 SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); TextOut(hdc , 40, 10, strFile, lstrlen(strFile)); で表示させてみようとしたところ、エラーが発生し、できませんでした。どうやるのでしょうか。ちなみに、strFileはstatic TCHAR型です。 また、ウィンドウから読み込んだテキストファイルを、ある文字列がどれだけあるか、などを数え、その後、その数を表示させたりもさせるプログラムを作っています。それで分からなかったのが、読み込んだファイルはTCHAR型ですよね。それをどうやってchar型に直すかです。 宜しくお願い致します。

  • ウィンドウに表示されないのはなぜ?

    ウィンドウの右クリックで、 ファイル名を読み込み、ウィンドウ上に表示させたいのですが、 うまくいかないです。どうしてでしょう。 ちなみに、タイトルバーには、表示されます。 宜しくお願い致します。 case WM_RBUTTONUP: if ( ofn.lStructSize == 0 ){ ofn.lStructSize = sizeof( OPENFILENAME ); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("Text files {*.txt}\0*.txt\0") TEXT("HTML files {*.htm}\0*.htm;*.html\0") TEXT("All files {*.*}\0*.*\0\0"); ofn.lpstrCustomFilter = strCustom; ofn.nMaxCustFilter = sizeof( strCustom ); ofn.nFilterIndex = 0; ofn.lpstrFile = strFile; ofn.nMaxFile = sizeof( strFile ); ofn.Flags = OFN_FILEMUSTEXIST; } if ( GetOpenFileName(&ofn) ){ SelectObject( hdc, hFont ); SetBkColor( hdc, RGB(255,255,255) ); TextOut( hdc, 200, 410, strFile, lstrlen(strFile) ); SetWindowText( hWnd, strFile ); } else{ MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK ); } return 0;

  • fread時の0xc0000005エラーについて

    現在、win32APIのGetOpenFileName()を利用して、音声ファイル(wav形式)を選択し、その選択した音声ファイルの情報を取り出すことを考えています。 プログラム自体が長いのですべて載せることが出来ないのですが、関連する部分だけピックアップすると、 main.c内で static OPENFILENAME ofn = { 0 }; static TCHAR strFile[MAX_PATH]; //ダイアログボックスが生成されたら case WM_INITDIALOG: ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("WAVファイル(*.wav)\0*.wav\0"); ofn.lpstrFile = strFile; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST; // ファイル選択ボタンが押されたら case IDC_FILE_SELECT: //ファイルを開くダイアログを表示しwavファイルを選択 GetOpenFileName(&ofn); //選択されたファイル名(フルパス)を引数として関数に渡す if(road_wav(strFile) == FALSE) //エラー処理 ------------------ 上記の関数road_wav()は別ファイル(road_wav_file.c)で記述し、 BOOL road_wav(const char *filename){ FILE* wfp; char reafword[4]; if(fopen_s(&wfp, filename, "rb") != 0){ //エラー処理 return FALSE; } else{ //fopen_s成功 } //ここでエラー(0xc0000005) fread(reafword, 4, 1, &wfp); return TRUE; } ------------------ というように、freadの部分で0xc0000005エラーが出てしまいます。 wfpのポインタがエラーの原因かと考え、関数の引数(=選択した音声ファイル名)が間違っている、もしくは、fopen_sで正しく音声ファイルが開けていないかと思い調べてみたのですが、 strFileには選択したファイル名がフルパスで正しく格納されており、f_opensもelse側に行っている(成功している)ようなので、wfpが原因では無いようです。 しかし、他に思い当たる原因が特に無く、どの部分を直せばよいかが分からず困っております。 もし何か分かりましたら教えていただけると助かります。 説明が非常に分かりにくくなってしまい申し訳ありませんが、よろしくお願いいたします。 作業環境 Windows7 64bit Visual Studio 2013 professional

  • 猫でもわかるプログラミング74章

    74章は http://www.kumei.ne.jp/c_lang/sdk/sdk_74.htm です。簡単なメモ帳をつくるというお題で、その中に ファイルをオープンするとき、 char szFileName[256];// オープンするファイル名(パス付き) char szFile[64];// ファイル名 OPENFILENAME ofn; として、 … ofn.lpstrFile = szFileName; //フルパスつきファイル名を格納 ofn.lpstrFileTitle = szFile;//選択されたファイル名が格納されます … GetOpenFileName関数 として、「ファイルを開く」のコモンダイアログを開いてファイル名等等を取得し、 CreateFileでそのファイルをopenするという例題なのですが、 szFileNameにはパスつきファイル名が格納されているのですが、szFileにはなにも格納されていないみたいなんです。ずっと色々悩んでいるのですが、どこがいけないでしょうか。 VC++ 6.0 WinXP

  • ファイルの保存ダイアログでデフォルト命名したい

    ファイルの保存ダイアログでデフォルト命名したい Win32API(C言語)編 第55章 ファイルを開く・保存のコモンダイアログ http://www.geocities.jp/ky_webid/win32c/055.html をみてファイルの保存ダイアログを出せるようになりました。 しかし、たまーにフリーソフトなどでもファイルを保存する際に、 デフォルトのファイル名が初期値として指定されているものもあります。 私のソフトでもそのようにしたいのですが、色々な部分に文字列を 入れてみて試してみても、思ったとおりの結果にはなりませんでした。 下記は上記サイトに記載されている ファイルを保存する際のダイアログの出し方から引用したものですが、 これをどのようにしたらダイアログが開いた際にファイル名部分に デフォルト命名された状態で開けるのでしょうか? static OPENFILENAME ofn; static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域 static TCHAR filename[MAX_PATH]; // ファイル名を受け取る領域 // 構造体に情報をセット ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類 ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定 ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類 // 名前を付けて保存コモンダイアログを作成 if( !GetOpenFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }

  • OpenCvを使ったプログラムでエラーが出ます。

    OpenCvを使ったプログラムでエラーが出ます。 ダイアログで画像ファイルを選択して表示するプログラムを作ったのですが、WindowsXPでは問題なく実行できるのにWindows7の32ビット版で実行するとダイアログでファイルを選択すると以下のエラーが出ます。 (VisualC++2008の設定はどちらも同じです。OpenCvのバージョンは1.1preです。7、XP共に同じように導入しました) ↓エラーメッセージ Null pointer (null filename) in function cvLoadImage,.\loadsave.cpp(404) Press"Abort"to terminate application. Press"Retry"to debug(if the app is running under debugger). Press"Ignore"to continue(this is not safe). ↓問題のあるコード #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> int main( int argc, char **argv ) { int key; OPENFILENAME ofn; // ファイル名情報 WCHAR fileName_w[200]; // ファイル名格納用バッファ IplImage *image; // 画像の格納先 char windowName[] = "Result"; //読み込んだ画像をを表示するウィンドウの名前 // ウィンドウを用意します。後で用意するときは、※1のようにhwndOwnerにNULLを指定します。 cvNamedWindow(windowName); // OPENFILENAME構造体を設定します。 ZeroMemory(&ofn, sizeof(ofn)); // 初期化 ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = (HWND)cvGetWindowHandle(windowName); // 親ウィンドウ // = (HWND)NULL; // 親ウィンドウがないときはNULLを指定します。※1 ofn.lpstrFile = fileName_w; // ファイル名格納先 ofn.lpstrFile[0] = '\0'; // ファイル名の初期値はなし ofn.nMaxFile = sizeof(fileName_w); // ファイル名の格納サイズ ofn.lpstrFilter = L"すべて\0*.*\0Bitmap\0*.bmp\0Jpeg\0*.jpg\0"; // フィルタの設定 ofn.nFilterIndex = 1; // フィルタの初期値 ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; // フラグの設定 // 「ファイルを開く」ダイアログを呼び出します。 if(GetOpenFileName(&ofn) == TRUE){ char fileName[200]; size_t n; // ファイル名をWCHAR文字列からchar文字列へ変換します。 wcstombs_s(&n, fileName, sizeof(fileName), ofn.lpstrFile, _TRUNCATE); // 画像ファイルを読み込みます。 image = cvLoadImage(fileName); // ウィンドウに貼り付けます。 cvShowImage(windowName, image); } key = cvWaitKey( 0 ); cvReleaseImage( &image ); cvDestroyWindow( windowName ); return 0; } このプログラムはhttp://cvwww.ee.ous.ac.jp/opencv.htmlにあるサンプルを参考にしました。 どうすればエラーをなくすことができるのでしょうか? よろしくお願いします。

  • プロトタイプが必要な場合

    WndProc関数の前にFunc関数を書いているから、WndProc関数の ソースがコンパイルされる時はFunc関数は既に読み込み済みで Func関数のプロトタイプは必要無いと思ったんだけど、必要なんですか? #include <windows.h> int Func(HWND); ←これは必要ですか? LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpstr, int n) {  … } int Func(HWND hWnd) {  … } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {  static int i;  switch(uMsg){  case WM_CREATE:   i = Func(hWnd);   break;  … }

  • C言語の自作関数がエラーになる

    C言語の自作関数がエラーになる 現在C言語でWindowsのプログラミングを学習中ですが あるプロトタイプ宣言した自作の関数がエラーになってしまいます。 エラー内容は「未解決の外部シンボル・・・」といった内容です。 関数の引数をHWNDだけにした場合は問題ありませんでした。 環境はMicrosoft Visual C++ 2008 Express Editionです。 自作関数の引数に型の制限はあるのでしょうか? よろしくお願いします。 以下コード一部です LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int MySave(TCHAR *,HWND,int); ・ ・ ・ LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { THCAR buffer[1024]; int iCount; ・ ・ ・ MySave(buffer,hWnd,iCount); ・ ・ ・ } int MySave(buffer,hWnd,iCount); ・ ・ ・ }

  • 「ファイルを開く」のダイアログ作成

    ファイルを開くのダイアログを作成しています。 CEdit *wdit; FileDialog wdlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, "A系ファイル(*.a)|*.a|" "A系ファイル(*.b)|*.b|" "A系ファイル(*.c)|*.c||"); if(wdlg.DoModal()==IDOK){  wdit = (wdit*)GetDlgItem(IDC_EDIT1);  wdit->SetWindowText(wdlg.GetPathName()); } 上のようなプログラムだと、A系ファイルを選択したときに対象となる拡張子が1つになります。 利便性を考えて、A系ファイルを選択すると、*.aと*.bと*.cの3つの拡張子が対象となる様に書き換えたいのですが、どのようにすればよいでしょうか? VC6.0で奮闘しています。 よろしくお願いします。

  • コールバック関数のメンバ関数化

    コールバック関数のメンバ関数化について質問です。 WindowsAPIでウィンドウプロシージャ(コールバック関数)をクラスのメンバ関数に しようと思っているのですが、出来るのでしょうか? たとえば、 http://wisdom.sakura.ne.jp/system/winapi/win32/win10.html このサイトにある LRESULT CALLBACK WndProc(HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam); をクラスのメンバ関数にしたいです。 開発環境 XP C,C++ Visual Studio 2005

専門家に質問してみよう