• ベストアンサー

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)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> WINAPI(LPCTSTR str); > としたいのですが、うまく行かないみたいです・・・ WINAPIがマクロだからでしょう。 どうしてもWINAPIという名前の関数を作りたいのであれば、 #undef WINAPI としておけば、WINAPI関数を作れるようになると思いますが、決してお勧めはしません。

noname#142813
質問者

お礼

マクロだと無理でしょうねぇ・・・

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

>GetOpenFileName(&ofn); >SetWindowText(hWnd , strFile); >と言う部分でファイルダイアログを開き、 >ファイル読み込みをしているわけなのですが、 この2行だとファイル名を文字列として得て、それをウィンドタイトルに表示しているだけです。strFileは、GetOpenFileNameの戻り値ですよね?これだけだとファイルの中身を読み込んではいませんよ。 言葉が混乱されているようですが、ファイル名=文字列、ファイルの中身=テキスト(文字列)データなどがごっちゃになっていませんか? >このstrFileを別の関数に渡したいわけです。 >そういう時どうすればいいでしょう? 文字列ですので、普通に関数パラメータとして受け渡してください。 それとも、ファイルを読み込んでファイルの中身を渡したいのでしょうか?

noname#142813
質問者

お礼

File名を取得して、 "file.txt"の部分を置き換えたいのです。 ファイルから読み込むプログラムはできあがっております。

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

★この質問を立てる前に前の質問を解決する努力をして下さい。 ・前の質問にまた回答を書き込みましたので補足して下さい。  http://oshiete1.goo.ne.jp/qa3364459.html→『ファイルを開く。(API・C言語)』 >ある文字だけをファイルから読み込み…  ↑  これは C 標準関数の fopen、fclose を使っているようですね。  だから char型、wchar_t型の変換を行いたいのですよね?  もしかしたら前々回の質問も同じ理由でしたか?  http://oshiete1.goo.ne.jp/qa3342727.html→『char型の文字列をウィンドウに表示させる。』  この3つの質問は全部同じ意味合いですよね。  重要なのは TCHAR、LPTSTR型の意味を理解することです。 解決策1: ・コンパイルのオプションより UNICODE を定義しない設定にします。  総合環境を使っているのか、コマンドラインからオプションを指定しているのかは  こちらでは分かりませんが、UNICODE を定義しない設定でコンパイルして下さい。 ・こうすると TCHAR、LPTSTR型は char 型に置き換えられますので C 標準関数との  やりとりで char型 と wchar_t型 の相互変換をしなくてもすみます。  この方法をお勧めします。 解決策2: ・コンパイルのオプションより UNICODE が定義されていたらば  wchar_t 型から char 型に変換する仕組みをとります。  変換方法は MultiByteToWideChar() 関数で行えます。  あと検索時は『wchar_t』型です。  既に回答がありますが、前回の質問の aris-wiz さんのはちょっとした記述ミスです。  正しくは『wchar_t』型になります。 以上。UNICODE 定数についての理解度を補足して下さい。先に進みませんから。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpintl/html/_win32_widechartomultibyte.asp
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 引数として渡す方法がちょっとわかりませんね・・・ どう分からないのでしょうか? void func(LPCTSTR str); に対して func(strFle); とするだけだと思いますが...

noname#142813
質問者

お礼

ありがとうございます。 WINAPI(LPCTSTR str); としたいのですが、うまく行かないみたいです・・・

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> このstrFileを別の関数に渡したいわけです。 > そういう時どうすればいいでしょう? 引数として渡せばよいだけでは? > しかし、char_w型は検索しても見つかりません。 char_w型ではなく、wchar_t型ではないでしょうか?

noname#142813
質問者

お礼

回答ありがとうございます。 引数として渡す方法がちょっとわかりませんね・・・

関連する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

専門家に質問してみよう