• ベストアンサー

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

ウィンドウの右クリックで、 ファイル名を読み込み、ウィンドウ上に表示させたいのですが、 うまくいかないです。どうしてでしょう。 ちなみに、タイトルバーには、表示されます。 宜しくお願い致します。 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;

noname#142813
noname#142813

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

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

>修正しても駄目でした・・・^^; >すいません、できましたー! えっと。。。どっちだろう。。。? 一応タイトルとウィンドウに表示するサンプル貼っとこう。。。 (空白全角) #Oh-Orangeさんがおっしゃっていることをそのままな感じデスガ /* * OpenFile Dialog Sample * Windows XP Pro / VC++6.0 */ #include<windows.h> #define ALL_FILTER TEXT("All File {*.*}\0*.*\0") #define TXT_FILTER TEXT("Text File {*.txt}\0*.txt\0") #define FILE_FILTER (TXT_FILTER ALL_FILTER) OPENFILENAME ofn = {0}; BOOL InitFileDialog( HWND hWnd ); BOOL GetOpenFilePath( CHAR* Path, INT cbSize ); LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp); INT WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance ,LPSTR lpCmdLine , int nCmdShow ) {   MSG msg;  HWND hWnd;  char* Class = "HOGE";  char* Titel = "HOGE";  WNDCLASS winc;  winc.style    = CS_HREDRAW | CS_VREDRAW;  winc.lpfnWndProc  = WndProc;  winc.cbClsExtra   = 0;  winc.cbWndExtra   = 0;  winc.hInstance   = hInstance;  winc.hIcon    = NULL;  winc.hCursor   = NULL;  winc.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);  winc.lpszMenuName  = NULL;  winc.lpszClassName  = Class;  if( !RegisterClass( &winc )){   MessageBox( NULL, "アプリ登録失敗", NULL, MB_OK );   return 1;  }  hWnd = CreateWindowEx( WS_EX_TOPMOST, Class, Titel, WS_OVERLAPPEDWINDOW,   CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL );  if( !hWnd )  {   MessageBox( NULL, "ウィンドウ作成失敗", NULL, MB_OK );   return 2;  }  ShowWindow( hWnd, SW_SHOW );  while (GetMessage(&msg , NULL , 0 , 0 )) {   TranslateMessage(&msg);   DispatchMessage(&msg);  }  return msg.wParam; } LRESULT CALLBACK WndProc( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam ) {  static HFONT hFont = NULL;  static HDC hDC = NULL;  static CHAR FullPath[256] = {0};  switch (uMsg) {  case WM_CREATE:   hFont = CreateFont( 20, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE,   SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,   FIXED_PITCH | FF_MODERN, "MS ゴシック" );   if ( hFont == NULL )   {    MessageBox( hWnd, "フォントオブジェクトの生成に失敗", NULL, MB_OK );    PostQuitMessage(0);   }   hDC = GetDC( hWnd );   if(InitFileDialog(hWnd)==FALSE)   {    MessageBox( hWnd, "ファイルダイアログの初期化失敗", NULL, MB_OK );    CloseHandle( hFont );    PostQuitMessage(0);   }   break;    case WM_RBUTTONUP:   memset( FullPath, '\0', sizeof(FullPath));   GetOpenFilePath( FullPath, sizeof(FullPath) );   SetWindowText( hWnd, FullPath );   //読み込んだパスをWINDOW上に表示   TextOut( hDC, 20, 200, FullPath, lstrlen(FullPath));   //ダイアログで文字が欠けるので無効領域をクライアント領域に発生させる   InvalidateRect( hWnd, NULL, TRUE );   break;  case WM_PAINT:   //無効領域が発生した場合の再描画   HDC hPaint;   PAINTSTRUCT ps;   hPaint = BeginPaint(hWnd , &ps);   TextOut( hPaint , 20 , 200 , FullPath , lstrlen(FullPath));   EndPaint(hWnd , &ps);   break;  case WM_CLOSE:   DestroyWindow(hWnd);   break;  case WM_DESTROY:   CloseHandle( hFont );   ReleaseDC( hWnd, hDC );   PostQuitMessage(0);   break;  default:   return DefWindowProc( hWnd, uMsg, wParam, lParam );  }  //何か処理をしたら0を返却する  return 0L; } BOOL InitFileDialog( HWND hWnd ) {  CHAR strFile[MAX_PATH];  if( hWnd==NULL ){   return FALSE;  }  ofn.lStructSize = sizeof (OPENFILENAME);  ofn.hwndOwner = hWnd;  ofn.lpstrFilter = FILE_FILTER;  ofn.lpstrFile = strFile;  ofn.nMaxFile = MAX_PATH;  ofn.Flags  = OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;  return TRUE; } BOOL GetOpenFilePath( CHAR* Path, INT cbSize ) {  GetOpenFileName(&ofn);  if( cbSize < (lstrlen(ofn.lpstrFile)+1)){   return FALSE;  }    lstrcpy( Path, ofn.lpstrFile );  return TRUE; } 実は、WM_RBUTTONUPで描画しなくても、再描画してるから 無効領域を発生させるだけで描画できたりとか・・・:-P

noname#142813
質問者

補足

すいません、できております。 コンパイルしたのですが、 ファイルを選択したものの、何もウィンドウに表示されない。 そこで、タイトルバーをクリックしてウィンドウを広げた ところ、思い通りの結果がウィンドウ上に表示されました。 原因は何かを調べているところです。 また、ファイルを一回選択し、タイトルバーを広げると思い通りの結果が表示されるのですが、もう一度ファイルを開くと、その結果につけたした結果が出てしまうのです。カウンターが初期化されてないのでしょうかね。。 /* ---------------------表示部分 ---------------------------------- */ #define TITLE TEXT("CL(15:0)") LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hdc; HDC hDC; HPEN hpen; PAINTSTRUCT ps; HFONT hFont; HWND hwnd; int i; int j ; int k = 1; int l; int m=0; static TCHAR str[64]; static TCHAR strtwo[640]; static TCHAR strFile[MAX_PATH]; int modulecounter; /* "module"の数 */ int countertwo; int inputcounter; /* inputの数 */ int outputcounter; /* outputの数 */ FILE *fp; /* module名をとってくる */ char *y = modulename(m,strFile); /* module名をとってくる */ char word[100]; char finger; PAINTSTRUCT paint; static OPENFILENAME ofn = {0}; static TCHAR strCustom[256] = TEXT("Before files\0*.*\0\0"); modulecounter = ShowResult(); /* moduleの数を探してこい */ countertwo = ShowResultThree(); /* ";"の数を探して来い */ inputcounter = ShowResultTwo(); outputcounter = ShowResultFour(); switch (msg){ case WM_DESTROY: PostQuitMessage(0); return 0; /* ウィンドウからファイルオープンダイアグラム */ case WM_CREATE: ofn.lStructSize = sizeof (OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("Text files {*.v}\0*.v\0") TEXT("HTML files {*.htm}\0*.htm;*.html\0") TEXT("All files {*.*}\0*.*\0\0"); ofn.lpstrCustomFilter = strCustom; ofn.nMaxCustFilter = 256; ofn.nFilterIndex = 0; ofn.lpstrFile = strFile; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST; return 0; 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 ); } ReleaseDC( hWnd, hdc ); fclose(fp); break; case WM_PAINT: hdc = BeginPaint(hWnd , &ps); hFont = CreateFont( 15 , 0 , 0 , 0 , FW_THIN , 0 , 0 , FALSE , SHIFTJIS_CHARSET , OUT_DEFAULT_PRECIS , CLIP_DEFAULT_PRECIS , DEFAULT_QUALITY , VARIABLE_PITCH | FF_ROMAN , NULL ); /* フォント TRUE = 1 , FALSE = 0 */ hpen = CreatePen(PS_DASH , 0 , RGB(100 , 0 , 50)); /* 線の形・線の色・ペンの色 */ SelectObject(hdc , hpen); MoveToEx(hdc , 50 , 50 , NULL);/* 線のカレントポジション */ LineTo(hdc , 100 , 50); /* 左上X座標左上Y座標右下X座標右下Y座標 */ /* 円は、Ellipse(hdc , 30 , 30 , 180 , 180); */

その他の回答 (3)

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

>そこで、タイトルバーをクリックしてウィンドウを広げた >ところ、思い通りの結果がウィンドウ上に表示されました。 >原因は何かを調べているところです。 >また、ファイルを一回選択し、タイトルバーを広げると思い通りの >結果が表示されるのですが、もう一度ファイルを開くと、その結果に >つけたした結果が出てしまうのです。カウンターが初期化されてないのでしょうかね。。 この現象は恐らく、ウィンドウサイズが変更されたことによって 発行される WM_PAINT のおかげです。WM_RBUTTONUPの中で描画処理を 行っていない為、 WM_PAINT が送られるまで何も表示されなかったり、 前回のものがそのまま表示されていたりする為だと思われます。

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

★あらら別質問を立てちゃいましたね。 ・こちらにも一部を貼り付けておきます。 >hdc、hFont には正しくハンドルが入っていますか?確認して下さい。  ↑  hdc のハンドルに BeginPaint() 関数を使っていますが間違いです。  この BeginPaint() 関数は WM_PAINT メッセージ内でしか使うことがない関数です。  同様に EndPaint() 関数も同じく WM_PAINT メッセージ内でしか使いません。  ここが面白い(おかしい)ところですが WM_PAINT メッセージ以外でクライアント領域などに  描画したい場合は GetDC()、RealeceDC() 関数を使います。  下にサンプルを載せます。 サンプル1: WM_PAINT: {  PAINTSTRUCT ps;  HDC hDC;    hDC = BeginPaint( hWnd, &ps );  // ここで図形や文字を hDC に描画  EndPaint( hWnd, &ps );  break; } サンプル2: WM_RBUTTONUP: {  HDC hDC;    hDC = GetDC( hWnd );  // ここで図形や文字を hDC に描画  ReleaseDC( hWnd, hDC );  break; } 解説: ・WM_PAINT メッセージ内では BeginPaint、EndPaint 関数を使います。  でも WM_PAINT メッセージ以外では GetDC、ReleaseDC 関数を使います。  GetDC 関数でデバイスコンテキストを取得して  ReleaseDC 関数でデバイスコンテキストを解放します。 ・今回の場合は WM_CREATE メッセージで『hDC = GetDC( hWnd );』を記述して  WM_CLOSE メッセージか、WM_DESTORY メッセージのどちらか一方に  『ReleaseDC( hWnd, hDC );』を記述します。 改善策: ・次のように修正して下さい。  修正前⇒『hdc = BeginPaint(hWnd , &ps);』  修正後⇒『hdc = GetDC( hWnd );』 ・あと次の部分も一緒に修正して下さい。  修正前⇒『EndPaint( hWnd, &ps );』  修正後⇒『ReleaseDC( hWnd, hdc );』 ・以上。

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

お礼

修正しても駄目でした・・・^^;

noname#142813
質問者

補足

すいません、できましたー! やっと、一つ、進みました・・・^^

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

デバイスコンテキストのhdcをきちんと設定していますか GetDC(hWnd) などで hdcを適切なデバイスコンテキストのハンドルに結び付けましょう

関連するQ&A

  • ファイル名の取得について

    以下のサンプルで、選択したファイル名を任意の変数に取得したいのですが、どこに手を加えると取得できますでしょうか。 void OpenImgFiles(HWND hWnd) {   OPENFILENAME ofn;   memset(&ofn, 0, sizeof(OPENFILENAME));   ofn.lStructSize = sizeof(OPENFILENAME);   ofn.hwndOwner = hWnd;   ofn.lpstrFilter = "BMP files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";   ofn.lpstrFile = FileName;   ofn.nMaxFile = MAX_PATH;   ofn.Flags = OFN_FILEMUSTEXIST;   ofn.lpstrDefExt = "bmp";   ofn.nMaxFileTitle = 64;   ofn.lpstrFileTitle = FileTitle;   ofn.lpstrTitle = "ファイルを開く";   if (GetOpenFileName(&ofn)) {     show = 1;     InvalidateRect(hWnd, NULL, TRUE);   }   return; } ひょっとして簡単すぎるのかも知れませんが・・・ どうかよろしくお願いします。

  • bmpファイルビューアを作るため

    猫のサイトのコードを使って void OpenImgFiles(HWND hWnd) { OPENFILENAME ofn; memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = "BMP files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0"; ofn.lpstrFile = FileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST; ofn.lpstrDefExt = "bmp"; ofn.nMaxFileTitle = 64; ofn.lpstrFileTitle = FileTitle; ofn.lpstrTitle = "ファイルを開く!"; if (GetOpenFileName(&ofn)) { show = 1; InvalidateRect(hWnd, NULL, TRUE); } return; } を呼び出してファイルを開くためのダイアログボックスを表示しようとしてのですが無応答で何も表示してくれません コンパイラは無償Borland C++5.5です 何が悪いか教えてください

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

    ファイルの保存ダイアログでデフォルト命名したい 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 ); }

  • WriteFile関数

    WriteFile関数 C言語でWindowsプログラミングを学習中です。 2点ご質問です。 LPTSTR型のbufferには(1)のように文字列を格納して、 画面に表示しています。 ファイルに保存するために改行は「\r\n」に置き換えているので、 画面上ではもちろん改行されません。 Editコントロールを使用すれば簡単にいくと思いますが、 このような方法で画面上にも改行・ファイルにも改行という方法はありますか? さらに(2)で保存したファイルを開くと文字と文字の間に半角のスペースが 入ってしまいます。 ごくたまに入らない時もありますが、文字列の一部しか表示されません。 これはUNICODEとマルチバイトの関係なのでしょうか? UNICODEを定義しています。 マルチバイトを定義してしまうとGetSaveFileName関数が エラーになってしまうので・・・ ご教授お願いします。 (1) case WM_CHAR: if(wp==VK_BACK){ if(!iCount) return 0; iCount--; InvalidateRect(hWnd,NULL,TRUE); }else if(wp==VK_RETURN){ buffer[iCount++]='\r\n'; InvalidateRect(hWnd,NULL,TRUE); return 0; }else{ buffer[iCount++]=(TCHAR)wp; InvalidateRect(hWnd,NULL,TRUE); } return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rc); DrawText(hdc,buffer,iCount,&rc,DT_WORDBREAK); EndPaint(hWnd,&ps); return 0; ・ ・ ・ ・ (2) int MySave(LPTSTR buffer,HWND hWnd) { OPENFILENAME ofn; HANDLE hFile; TCHAR szFile[MAX_PATH]; TCHAR szFileTitle[MAX_PATH]; DWORD dwAccBytes; memset(&ofn,0,sizeof(OPENFILENAME)); ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=hWnd; ofn.lpstrFilter=TEXT("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); ofn.lpstrFile=szFile; ofn.lpstrFileTitle=szFileTitle; ofn.nFilterIndex=1; ofn.nMaxFile=MAX_PATH; ofn.nMaxFileTitle=MAX_PATH; ofn.Flags=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY; ofn.lpstrDefExt=TEXT("txt"); ofn.lpstrTitle=TEXT("名前を付けて保存"); if(!GetSaveFileName(&ofn)) return -1; hFile=CreateFile(szFile,GENERIC_WRITE,0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(hFile,buffer,(DWORD)lstrlen(buffer), &dwAccBytes,NULL); SetWindowText(hWnd,szFileTitle); CloseHandle(hFile); 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

  • Win32API ファイルの書き込み、保存

    Win32APIを使って、ファイルの保存ダイアログを表示→ファイルを指定→保存ボタンを押す→指定されたファイルに書き込む→指定したファイルを保存 というプログラムを作りたいと考えています。しかし、ファイルに書き込んだ後どう保存すればいいかわからないので教えてください。s[256]をfilename_fullに書き込んで保存したいです。この場合プログラムは抜粋したものなので、s[256]に文字が格納してあると考えてください。 char s[256]; FILE *fp; 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( !GetSaveFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }else{ if((fp=fopen(filename_full,"w")) == NULL) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); exit(0); /* (3)エラーの場合は通常、異常終了する */ } /*ここからがわかりません*/     /*s[256]をファイルに書き込んで、保存するプログラムを教えてください。

  • 構造体をファイルに出力できません

    はじめまして、お世話になります。 『ダイアログで取得したファイル名』を、含むData構造体をファイルとして書き込む場合に限り、ファイルが出力されません。 Data構造体の文字列file_nameが『ダイアログで取得したファイル名』でなければ正常に出力されます。また、関数の返値や書き込み後のFILE構造体の中身を読み込んで調べたりしましたが、見る限りエラーはありませんでした。 開発ツールはMicrosoft Visual Studio 2005を使用しています。 どうか皆さんの知恵を貸してください! お願いします! //ファイルとして出力する構造体 typedef struct { TCHAR file_name[256]; BYTE id; }Data; //ファイルを開くダイアログ void OpenFile(HWND hWnd, TCHAR file_name[]) { OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("png files {*.bmp}\0*.bmp\0") TEXT("all files {*.*}\0*.*\0\0"); ofn.lpstrFileTitle = (LPWSTR)file_name; ofn.nMaxFileTitle = CHAR_SIZE; ofn.lpstrFile = NULL; ofn.Flags = OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); } //ファイルを書き込む void SaveData(Data save_file[]) { FILE *file; errno_t err; size_t write_num; //書き込む err = _tfopen_s(&file, TEXT("hoge.map"), TEXT("w+b")); if(err != 0) return; write_num = fwrite(save_file, sizeof(Data), 6, file); //きちんと書き込めているか確かめる Data chek_data[6]; fseek(file, 0L, SEEK_SET); fread(chek_data, sizeof(Data), 6, file); fclose(file); }

  • 構造体の一度のメンバを保持

    自作関数の中で、一部のメンバはいつも同じ値です。 自作関数の中で宣言したローカルな構造体の一部のメンバを一度だけ指定して、以降はその設定が有効になるようにしたいんですが、現在のソースをどのように変更すればいいか教えて下さい。 CHOOSEFONT構造体で、変化のあるメンバは、hwndOwner、hDC、lpLogFont、rgbColors の4つだけです。 自作のFUNCFONT関数が実行されるたびに、その4つのメンバだけを書き換えることによって処理速度をアップさせようとしています。 BOOL FUNCFONT(HWND hWnd, HDC hdc, LOGFONT lt, DWORD coler) { CHOOSEFONT cf = {0}; cf->lStructSize = sizeof(CHOOSEFONT); cf->hwndOwner = hWnd; cf->hDC = hdc; cf->lpLogFont = &lt; cf->Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT; cf->rgbColors = coler; … //処理 return TRUE; } これを、 BOOL FUNCFONT(HWND hWnd, HDC hdc, LOGFONT lt, DWORD coler) { static CHOOSEFONT cf = {sizeof(CHOOSEFONT), NULL, NULL, NULL, 0, CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT}; cf->hwndOwner = hWnd; cf->hDC = hdc; cf->lpLogFont = &lt; cf->rgbColors = coler; … //処理 return TRUE; } このようにしてもいいんですか?

  • ファイルを開く。(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型に直すかです。 宜しくお願い致します。

  • VB6.0で、ファイルのマルチセレクトダイアログでエラーがでます。

    VB6.0で、ファイルのマルチセレクトダイアログでエラーがでます。 ファイルを10個ほど選択ならエラーがでません。 250個ほどファイルを選択したいのですが、 コードを何度みなおしてもわかりません。 どなたか、どこをどう修正したらよいのかアドバイスをいただけませんでしょうか。 お手数をおかけしますがよろしくお願いします。 エラー箇所は下部の For i = 1 To UBound(GetFileName) です。 Public Function apiGetOpenFileName(nHandle As Long, nFilter As String, nDir As String) As Variant Dim OFN As OPENFILENAME 'OPENFILENAME構造体 Dim Ret As Long '戻り値 With OFN '構造体の設定 .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加 .hInstance = App.hInstance 'インスタンスハンドルを設定 .hwndOwner = nHandle 'ウインドウハンドルを設定 .lpstrTitle = "ファイルを開く" 'コモンダイアログのタイトルを設定 .lpstrFilter = nFilter 'フィルタを設定 .lStructSize = Len(OFN) '構造体のサイズを設定 .nMaxFile = 257 'ファイル名のバッファのサイズを設定 .lpstrFileTitle = String(257, Chr(0)) 'フルパス用のバッファを確保 .nMaxFileTitle = 257 'フルパス用のバッファのサイズを設定 .lpstrFile = String(257, Chr(0)) 'ファイル名のバッファを確保 .lpstrInitialDir = nDir 'デフォルトのディレクトリを指定 End With Ret = GetOpenFileName(OFN) '「ファイルを開く」ダイアログボックスを表示する If Ret = 0 Then '[キャンセル]を押した時 apiGetOpenFileName = vbNullString Exit Function Else '[OK]を押した時 apiGetOpenFileName = Split(OFN.lpstrFile, Chr(0)) End If End Function ' ファイル名を取得する ・・・コード省略 Dim GetFileName As Variant 'ファイル名(フルパス) GetFileName = apiGetOpenFileName(Form1.hWnd, strFilter, strDir) 'ダイアログ表示 'ファイル名取得 j = 1 For i = 1 To UBound(GetFileName) ←ここでエラーが出ます If GetFileName(i) <> "" Then strDFname(j) = GetFileName(i) j = j + 1 End If Next i

専門家に質問してみよう