• 締切済み

今DirectSoundの初期化でわからないことがあります。カレントデ

今DirectSoundの初期化でわからないことがあります。カレントディレクトリにもsoundファイルにもwavファイルがあるのにうまく読み込まれません。また、mmioRead関数でなぜか失敗時の処理が出てしまいます。下に一部省略したソースを書きます。 if(FAILED(hr = OpenWaveFile(aWaveFileName, aSound))) { TCHAR strWavFile[MAX_PATH]; TCHAR kSoundsPath[6]={'s','o','u','n','d','/'}; int kSoundsPathLength=6; lstrcpyn(strWavFile, kSoundsPath, MAX_PATH); lstrcpyn(strWavFile + kSoundsPathLength, aWaveFileName, MAX_PATH - kSoundsPathLength); if(FAILED(hr = OpenWaveFile((LPSTR)strWavFile, aSound))) { sprintf(tmpString, "wavファイル『%s』が見つかりませんでした", strWavFile); goto FAIL_RETURN; } HRESULT Sound::OpenWaveFile(LPSTR aWaveFileName, theSounds *aSound) { mmioOpen→mmioDescend →aChunkInfo.ckid = mmioFOURCC('f', 'm', 't', ' '); if(MMSYSERR_NOERROR != mmioDescend(aSound->sndHmmio, &aChunkInfo, &(aSound->sndChunkRiff), MMIO_FINDCHUNK)) { MessageBox(NULL, "FAIL:mmioDescend2","エラー", MB_OK | MB_ICONHAND); CloseWaveFile(aSound); return(E_FAIL); } →if(mmioRead(aSound->sndHmmio, (HPSTR) &aPCMWaveFormat, sizeof(aPCMWaveFormat)) != sizeof(aPCMWaveFormat)) { MessageBox(NULL, "FAIL:mmioRead","エラー", MB_OK | MB_ICONHAND); CloseWaveFile(aSound); return (E_FAIL); } } ソースは以上です。誰か原因に心当たりがある方がいましたら回答お願いします。

  • pjgam
  • お礼率0% (0/11)

みんなの回答

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

mmioRead関数の仕様をよく読みましょう。 mmioReadは、関数が成功すると、実際に読み取られたバイト数が返ります。 ファイルの終わりに到達し、それ以上バイトが読み取られない場合は、0 が返ります。 ファイルの読み取りエラーが発生した場合は?1 が返ります。 とあります。 つまり、読み込み途中の場合は読み込んだバイト数が、 読み込みが終了した場合は0が、読み込みに失敗した場合は-1が それぞれ返却されるということです。 以下の条件式では何バイト読み込んでも、 aPCMWaveFormat型のサイズと同じに成らない限り、 読み込みが失敗したことになります。 if(mmioRead(aSound->sndHmmio, (HPSTR) &aPCMWaveFormat, sizeof(aPCMWaveFormat)) != sizeof(aPCMWaveFormat))

関連するQ&A

  • DirectShowを用いたmpgファイルの再生が上手くいかないのですが

    趣味でゲームを作っているものです。ゲームのオープニングムービーでmpgファイルを再生したいのですが上手くいきません。詳細は以下の通りです。よろしくお願いします。 ゲームはウインドウモードで作成 ゲームウインドウ内にmpgファイルを再生 DirectXのバージョン DirectX9.0b ビデオボード GeForce7900GT (ドライバは最新のものを使用) 不具合点  mpgファイルの再生中にウインドウが再描画されたとき(他のウインドウに隠されて た後、再びアクティブにしたり、最小化後最大化など)ムービーの一部あるいは全部 が黒い画面になってしまいます。再描画されなければ上手くいきます。  また、aviファイルであれば、問題なく動作します。 具体的コード <初期処理部> RECT rc; long w,h; //COMライブラリの初期化 CoInitialize(NULL); //GraphBuilder オブジェクトの作成 if(FAILED(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pBuilder))){ MessageBox(NULL, "GraphBuilder オブジェクトの作成に失敗しました", NULL, MB_OK); return E_FAIL; } //フィルタ・グラフの作成 if(FAILED(pBuilder->RenderFile(L"sample.mpg",NULL))){ MessageBox(NULL, "フィルタ・グラフの作成に失敗しました", NULL, MB_OK); return E_FAIL; } // AVI描画用ウインドウを作成し... if(FAILED(pBuilder->QueryInterface(IID_IVideoWindow,(void **)&pVideoWindow))){ MessageBox(0,"AVI描画用ウインドウの作成に失敗しました",NULL,MB_OK); return E_FAIL; } // メインウインドウの子ウインドウに設定する // ウインドウハンドルの設定 if(FAILED(pVideoWindow->put_Owner((OAHWND)hwnd))){ MessageBox(0,"AVI描画用ウインドウを子ウインドウにすることに失敗しました",NULL,MB_OK); return E_FAIL; } // ウインドウスタイルの設定 if(FAILED(pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS ))){ MessageBox(0,"AVI描画用ウインドウを子ウインドウにすることに失敗しました",NULL,MB_OK); return E_FAIL; } // ウインドウサイズの設定(メインウインドウに合わせる) GetClientRect(hwnd,&rc); w=rc.right; h=rc.bottom; if(FAILED(pVideoWindow->SetWindowPosition(0,0,w,h))){ MessageBox(0,"ウインドサイズの変更に失敗しました",NULL,MB_OK); return E_FAIL; } // メディアコントロールの取得 if(FAILED(pBuilder->QueryInterface(IID_IMediaControl,(void **)&pMediaControl))){ MessageBox(0,"メディアコントロールの取得に失敗しました",NULL,MB_OK); return 0; } // メディアイベントの取得 if(FAILED(pBuilder->QueryInterface(IID_IMediaEvent,(void **)&pMediaEvent))){ MessageBox(0,"メディアイベントの取得に失敗しました",NULL,MB_OK); return 0; } //ウインドウメッセージの受け取り準備 if(FAILED(pBuilder->QueryInterface(IID_IMediaEventEx,(void **)&pMediaEventEx))){ MessageBox(0,"メディアイベントの作成に失敗しました",NULL,MB_OK); return E_FAIL; } if(FAILED(pMediaEventEx->SetNotifyWindow((OAHWND)hwnd,WM_GRAPHNOTIFY,0))){ MessageBox(0,"メッセージの設定に失敗しました",NULL,MB_OK); return E_FAIL; } <コールバック関数にて> long ecode,param1,param2; //DirectShow用 switch(iMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_KEYDOWN: switch((CHAR)wParam) { case VK_ESCAPE: PostQuitMessage(0); return 0; } // DirectShow用 case WM_GRAPHNOTIFY: while(SUCCEEDED(pMediaEventEx->GetEvent(&ecode,&param1,&param2,0))){ switch(ecode){ case EC_COMPLETE: case EC_END_OF_SEGMENT: case EC_WINDOW_DESTROYED: if(FAILED(pMediaControl->Stop())){ MessageBox(0,"停止に失敗しました",NULL,MB_OK); return 0; } GameStartFlag=true; } } break; } return DefWindowProc (hWnd, iMsg, wParam, lParam) ;

  • exeファイルの起動について教えてください

    はじめまして。 現在c言語を勉強しているのですが、プログラム内で別のプログラムのexeファイルを呼び出し起動させたいのですが、サイトをいろいろ回ったのですが上手くいきませんでした。 環境は、Microsoft Visual C++ 2005 Express Edition 現在の呼び出し方法は、 case IDC_AI: /* 表示の次へボタン有効化 */ // SendMessage( hwnd, WM_SETREDRAW, TRUE, 0); /* 表示 */ // ShowWindow( IAhwnd, SW_SHOW); // CGMain(IAhwnd, message, wParam, IParam, nCmdShow2); // ShellExecute(hwnd, "open", "C:\\Documents and Settings\\c319-1037\\デスクトップ\\卒業研究\\プログラム\\11-12\\SQL組と合わせるよう\\Debug\\D3DFWSample2005.exe", NULL, NULL, SW_SHOW); path=(char*)calloc(MAX_PATH+1,sizeof(char)); if(0!=GetModuleFileName( NULL, buf, MAX_PATH )){// 実行ファイルの完全パスを取得 char drive[MAX_PATH+1] ,dir [MAX_PATH+1] ,fname[MAX_PATH+1] ,ext [MAX_PATH+1]; _splitpath(buf,drive,dir,fname,ext);//パス名を構成要素に分解します // file = '"'; // file += "\\"; // file += '"'; file = drive; file += dir; file += "SQL組と合わせるよう\\Debug\\D3DFWSample2005.exe"; // file += '"'; // file += '"'; MessageBox( hwnd, file.c_str(), "完全パス", MB_OK); // MessageBox( hwnd, drive, "ドライブ", MB_OK); // MessageBox( hwnd, dir, "ディレクトリ パス", MB_OK); // MessageBox( hwnd, fname, "ベース ファイル名 (拡張子なし)", MB_OK); } ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); MessageBox( hwnd, "秀丸を起動します", "完全パス", MB_OK); // 秀丸を起動する if( !CreateProcess( NULL, // No module name (use command line). (LPSTR)file.c_str(), // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi ) // Pointer to PROCESS_INFORMATION structure. ) { MessageBox( hwnd, "CreateProcess failed.", "実行エラー", MB_OK); iRtn = -1; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); MessageBox( hwnd, "秀丸を終了しました", "完全パス", MB_OK); return iRtn; です。 よろしくお願いします。

  • WINAPI editbox内の文字が文字化けする

    プログラムは、ウィンドウ内にエディットボックスを表示するだけのものです。 下のプログラムを実行すると、エディットボックス内に ”繧ィ” と表示されます。また、“エディタ“ と入力すると ”ィ」ソ” と表示されます。 GetWindowTextでテキストを取得すると、MessageBoxには何も表示 されませんでした。 使用しているパソコンはwindows10です。 どうすれば文字化けが解消されるのでしょうか。 #include <stdio.h> #include <windows.h> HINSTANCE hinstance; TCHAR tch[128]; LRESULT CALLBACK winpr(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR lpcmdline,int ncmdshow) { TCHAR szwinClass[]=TEXT("samp1"); TCHAR sztitle[]=TEXT("サンプル"); int width=720; int height=720; WNDCLASSEX wcx; HWND hwnd; MSG msg; hinstance=hinst; wcx.cbSize=sizeof(WNDCLASSEX); wcx.style=CS_HREDRAW | CS_VREDRAW; wcx.hbrBackground=(HBRUSH)(COLOR_WINDOWTEXT+1); wcx.cbClsExtra=0; wcx.cbWndExtra=0; wcx.hIcon=NULL; wcx.hIconSm=NULL; wcx.hCursor=LoadCursor(NULL,IDC_ARROW); wcx.hInstance=hinstance; wcx.lpfnWndProc=winpr; wcx.lpszClassName=szwinClass; wcx.lpszMenuName=sztitle; if(!RegisterClassEx(&wcx)){ MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OK); return 1; } hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,szwinClass,sztitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, width,height, NULL,NULL,hinstance,NULL); if (!hwnd) { MessageBox(NULL,TEXT("failed"),TEXT("fail"),MB_OKCANCEL); int err=GetLastError(); return 1; } ShowWindow(hwnd,ncmdshow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)>0){ TranslateMessage(&msg); DispatchMessage(&msg); } } LRESULT CALLBACK winpr(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam){  HDC hdc; HWND hwndedit; int id; switch(message){ case(WM_CREATE): hwndedit= CreateWindow( TEXT("edit"), TEXT("エディタ"), WS_CHILD | WS_VISIBLE , 10, 10, 200, 30, hwnd, (HMENU)1,hinstance, NULL); return 0; case(WM_CLOSE): GetWindowText(hwndedit,tch,GetWindowTextLength(hwndedit) + 1); MessageBox(hwnd,tch,TEXT("文字化け"),MB_OK); id=    MessageBox(hwnd,TEXT("閉じる"),TEXT("閉じる"),          MB_OKCANCEL); if (id==IDOK){ DestroyWindow(hwnd); } return 0; case(WM_DESTROY): PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,message,wparam,lparam); } }

  • DirectXを用いたActiveXを用いてVistaで情報が取れない

    ActiveXからDirectXを叩いてOSやCPUなどの情報を 取得しようとしています。 XPでは問題なく情報が取れますが、Vistaでは 情報が取れる項目と取れない項目があります。 この現象について、教えてください。 APIは正常に終了しています。 OS(szOSExLongEnglish) → 正常取得 ベンダー(szSystemManufacturerEnglish) → n/a 型番(szSystemModelEnglish) → n/a CPU(szProcessorEnglish) → (空白) 物理メモリ(szPhysicalMemoryEnglish)  → 正常取得 IEのデフォルトの設定では上記のような状態ですが、 設定を変えて保護モードを外すと正常動作し、 すべての情報が取得できます。 しかし、保護モードが有効の状態で、 情報取得したいです。 以下にコードを書きます。 ※このコードはあるサンプルソースをほとんどそのまま使っています。 //////////////////////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::Init(void) { HRESULT hr; DXDIAG_INIT_PARAMS dxDiagInitParam; m_pDxDiagProvider = NULL; m_pDxDiagRoot = NULL; g_DxDiagInfo = NULL; g_DxSoundInfo = NULL; // COMライブラリを使用できるように初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return false; } hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider); if( FAILED(hr) || m_pDxDiagProvider == NULL) { return false; } // DXDIAG_INIT_PARAMSを初期化 ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; // WHQLを確認するかどうか // ネットを経由するので基本的にはfalseにしておく dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks; dxDiagInitParam.pReserved = NULL; hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) { return false; } hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot ); if( FAILED(hr) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// // DxDiag でSystem情報を取得 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::GetSyatemInfo( void ) { HRESULT hr; IDxDiagContainer* pObject = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; DWORD nCurCount = 0; // "DxDiag_SystemInfo" を取得 if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) ) { return false; } // 情報保存領域の確保 ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo)); if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) ) { SAFE_RELEASE( pObject ); return false; } SAFE_RELEASE( pObject ); return true; } よろしくお願いいたします。

  • BHO-2

    http://eternalwindows.jp/browser/mshtml/mshtml01.html の関数を、 http://msdn.microsoft.com/ja-jp/library/bb250489(v=vs.85).aspx のなかに組み込みたいと思っています。 BOOL CHelloWorldBHO::GetDocumentFromIE(IHTMLDocument3 **pp) { HWND hwnd; UINT uMsg; LRESULT lResult; HRESULT hr; EnumChildWindows(FindWindow(TEXT("IEFrame"), NULL), EnumChildProc, (LPARAM)&hwnd); if (hwnd == NULL){ return FALSE; } uMsg = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT")); if (!SendMessageTimeout(hwnd, uMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&lResult)){ MessageBox(NULL, L"WM_HTML_GETOBJECT", L"BHO", MB_OK); return FALSE; } hr = ObjectFromLresult(lResult, IID_IHTMLDocument3, 0, (void **)pp); if (FAILED(hr)) return FALSE; MessageBox(NULL, L"Hello World! ie-end", L"BHO", MB_OK); return TRUE; } で、 uMsg = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT")); if (!SendMessageTimeout(hwnd, uMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&lResult)){ MessageBox(NULL, L"WM_HTML_GETOBJECT", L"BHO", MB_OK); return FALSE; } の部分で失敗します。 原因はなんでしょうか・ VS2005 と Win7 を使っています。 MessageBox(NULL, L"WM_HTML_GETOBJECT", L"BHO", MB_OK); はバグの確認のため入れてあります。 アドバイスよろしくお願いします。

  • DirectXでのエラー処理について

    現在、Visual Studio .NET 2003でWindowsフォームを使って C++、DirectXのプログラムを作っています。 そこでXファイルを読み込むために以下のようにしているのですが、 Xファイルが存在しない場合 「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。」 というメッセージが繰り返し出てきてreturnまで処理が進みません。 returnまで進まない原因、もしくはXファイルが存在しない場合の よい処理方法があれば教えていただけないでしょうか。 初心者なので説明足らずなところがあると思いますが よろしくお願いします。 if(FAILED(D3DXLoadMeshFromX("**.x",D3DXMESH_SYSTEMMEM,**,NULL,&**,NULL,&**,&**))){ MessageBox(NULL,"",NULL,MB_OK); return E_FAIL; } (**は全て独自、同じではありません)

  • C言語で黒い画面が出る

    gcc使ってC言語を勉強していますが、スタートmainをwindowsにしても黒い画面が出てきます。これを消すことはできませんか。やりたいことは単にメッセージボックスを表示して簡単なファイル入出力するだけです。ソースコードは以下 #include <windows.h> #include <tchar.h> int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MessageBox( NULL, _T("Hello, Windows!"), _T("sample"), MB_OK); return 0; }

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • fgetsで2行目から文字化け

    fgetsでファイルを一行ずつ読み込みたいのですが、二行目以降が文字化けしてしまいます。 ******* ソース ******* #include <windows.h> #include <stdio.h> FILE *fp; if ((fp = fopen("textlist.txt", "r")) == NULL){ MessageBox(NULL, TEXT("ファイルを開けません"), NULL, NULL); exit (1); } while (1) { TCHAR buf[128] = {0}; if (fgets(buf, sizeof(buf), fp) == NULL) break; MessageBox(NULL,buf,NULL,NULL); } fclose(fp); ***** textlist.txt ***** あいうえお かきくけこ さしすせそ メッセージボックスの一回目は正しく"あいうえお"と表示されますが、二回目・三回目は文字化けしています。 最終的に一行ずつ分けて配列に入れたいので、fgetsで出来たらと思っています。 よろしくお願いします。

  • 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; }

専門家に質問してみよう