• ベストアンサー

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

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

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

★HDC の問題です。 >hdc、hFont には正しくハンドルが入っていますか?確認して下さい。  ↑  hFont のハンドルは CreateFont() の戻り値であっています。  ただし NULL が返されたときの処理を入れておきましょう。  hFont に NULL が入っているとフォントの設定が出来ません。 ・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 );』を記述します。 ・あと GetOpenFileName() 関数で使う ofn 構造体は最初にセットしているので  WM_RBUTTONUP メッセージの部分は削除して下さい。私のお勧めは WM_CREATE の  場所ではなくて GetOpenFileName() 関数を呼び出す直前で記述する方法です。  どちらでも結果的には同じです。好みの問題かな。 改善策: ・次のように修正して下さい。  修正前⇒『hdc = BeginPaint(hWnd , &ps);』  修正後⇒『hdc = GetDC( hWnd );』 ・あと次の部分も一緒に修正して下さい。  修正前⇒『EndPaint( hWnd, &ps );』  修正後⇒『ReleaseDC( hWnd, hdc );』 ・以上。

noname#142813
質問者

お礼

毎回詳しい説明感謝致します。 修正後、うまく行きました。 今度は、stfFileを何とか別の関数に渡す方法を考えたいと 思います。

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

その他の回答 (8)

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

★予想通りの間違いだ。 >ofn構造体には何も設定はしてないですね。。  ↑  これが原因です。 ・GetOpenFileName() 関数を呼ぶ前に OPENFILENAME 構造体の情報を正しく  セットして下さい。次のリンクを以前に紹介しましたが WM_RBUTTONUP の  部分だけをコピーしちゃいましたね。  http://wisdom.sakura.ne.jp/system/winapi/common/common6.html  ↑  このリンクの GetOpenFileName() 関数を呼ぶ前に OPENFILENAME 構造体を  セットする部分を記述して下さい。これがないと何も表示されません。 ・今回の質問では ofs 構造体に正しいデータをセットしていないからです。  次のようにして下さい。 サンプル: LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {  static TCHAR strFile[ MAX_PATH ];  static TCHAR strCustom[ MAX_PATH ] = TEXT("Before files\0*.*\0\0");  static OPENFILENAME ofn;    switch ( uMsg ){   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) ){     SetWindowText( hWnd, strFile );     SelectObject( hdc, hFont );     SetBkColor( hdc, RGB(255,255,255) );     TextOut( hdc, 200, 410, strFile, lstrlen(strFile) );    }    else{     MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK );    }    return 0;  }  return DefWindowProc( hWnd, uMsg, wParam, lParam ); } その他: ・hdc、hFont には正しくハンドルが入っていますか?確認して下さい。  上記のサンプルは WM_RBUTTONUP メッセージのみです。 ・以上。参考に。

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/common/common6.html
noname#142813
質問者

お礼

回答ありがとうございます。 ちなみに、case WM_RBUTTONUP:の前に、 ↓のような記述は前からありました。 case WM_CREATE: 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 = 256; ofn.nFilterIndex = 0; ofn.lpstrFile = strFile; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST; return 0; hdc、hFontは、 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 */ と設定しています。 サンプルを実行してみましたが、 結果は同じでした。。 表示されないですね。。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★恐らく構造体に何も設定していないのでは?  つまり GetOpenFileName() 関数の引数である ofn 構造体に正しい設定を  していないような気がします。ソースが長いようですから WM_RBUTTONUP  メッセージの部分だけソースを貼り付けて下さい。そのままコピー&ペースト。 ・あと str の容量が足りない気がします。  修正前⇒static TCHAR str[ 64 ];  修正後⇒static TCHAR str[ MAX_PATH ];  ※MAX_PATH定数は既に定義されています。たしか 260 だったかな。  安全なために 64 よりも MAX_PATH の定数を使って下さい。 ・以上。ソースの提示を待っています。

noname#142813
質問者

お礼

case WM_RBUTTONUP: GetOpenFileName(&ofn); SetWindowText(hWnd , strFile); SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); TextOut(hdc , 200, 410, strFile, lstrlen(strFile)); return 0; です。 64→MAX_PATHに変換しておきます。 ofn構造体には何も設定はしてないですね。。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★お礼の解釈はあっています。 ・これで先に進めます。  今回はコンパイルのオプションで UNICODE が定義されないため TCHAR 型と char 型は  同じ型になります。だから変換する必要はありません。 ・ただ気になるのはなぜエラーが出たのか?  TCHAR 型が char 型ですので SetWindowText()、TextOut() 関数も char 型の文字列を  普通に渡して問題はありません。それに strFile は TCHAR 型で宣言しているので  どんなエラーが表示されるのかを今度は補足して下さい。 ・それでは補足情報を待っています。

noname#142813
質問者

お礼

↓のように記述しております。 エラー出ないのですが、 ウィンドウ上に何も表示されません。 strは、 static TCHAR str[64]; という感じに宣言しております。 case WM_RBUTTONUP: GetOpenFileName(&ofn); SetWindowText(hWnd , strFile); SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); TextOut(hdc , 200, 410, strFile, lstrlen(strFile));

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

>char_w  誤り >wchar_t 正しい 訂正です・・・申し訳ない・・・orz エラーについての補足が全くありませんが、解決したのでしょうか? もしかしたら、今回の不具合にTCHAR型はあまり無いかもしれないので、エラーの内容を・・・と聞いているのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★TCHAR型(char型,wchar_t型)の意味は分かりましたか? ・簡単に説明しますと『Borand C++』コンパイラのオプションで  『UNICODE』記号定数が定義される設定では  (1)TCHAR型……wchar_t  (2)LPTSTR型 …wchar_t *  (3)LPCTSTR型…const wchar_t *  『UNICODE』記号定数が定義されない設定では  (1)TCHAR型……char  (2)LPTSTR型 …char *  (3)LPCTSTR型…const char *  にソースの記述を機械的に置き換えます。 ・まずは『Borand C++』コンパイラのオプションで UNICODE 定数が定義するように  なっているのか、定義されないでマルチバイト(char型)なのかを確認して下さい。  確認はコンパイル時のオプションです。ソース内容ではありません。 ・どうしても分からない場合は次のコードで分かります。  #if defined(UNICODE)   MessageBox( NULL, TEXT("UNICODE"), TEXT("確認"), MB_OK );  #else   MessageBox( NULL, TEXT("SJIS"), TEXT("確認"), MB_OK );  #endif  上記の5行を WinMain() のメッセージループより前に記述してコンパイルします。  その後に実行してどちらのメッセージが表示されるか補足して下さい。  それから UNICODE 定数の意味、TCHAR、LPTSTR、LPCTSTR 型の意味は分かりましたか? ・以上。2つの補足がないとアドバイスできません。先に進みませんよ。

noname#142813
質問者

お礼

回答どうもありがとうございます。 SJISでした。 TCHAR、LPTSTR、LPCTSTR 型の意味は下記のようでよろしいでしょうか。 ・TCHAR = char ・LPCTSTR = const char* ・LPTSTR = char* というのは「UNICODE」が定義されていないときの置き換えということになり、「UNICODE」が定義されているときには ・TCHAR = WCHAR ・LPCTSTR = const WCHAR* ・LPTSTR = WCHAR*

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

私の補足要求については解答なしでしょうか? >エラーとはどんなエラーなのでしょうか? 追加要求です。。。 ファイル読み込みの関数は何を使用しているのでしょうか? TCHAR型について、 説明のしかたがまずかったでしょうか・・・ 前回も書きましたが、TCHAR型というのは、 UNICODEマクロを定義した場合にTCHARはchar_w型になります。 つまりもともとchar型の場合があるわけですから、 TCAHR型をchar型にするという作業をそのまま行うのはまずいのです。 char_w と char の相互変換はWindowsであれば、 WideCharToMultiByte MultiByteToWideChar という関数を使用することで可能です。 これらはWindowsAPIなので、 Windows環境であればWindows.hをインクルードすることで 使用可能でC++ではありません。 >二つ目のリンクはC++ではないでしょうか。 newとかをmallocとかに読み直す必要はあるかもしれませんね。

noname#142813
質問者

お礼

ありがとうございます。 つまり、char_w型をchar型に変換すればいいわけですね。 一度やってみたいと思います。 また、うまく行かなかったら質問させていただきます。

noname#142813
質問者

補足

やっぱりよくわかりませんね。。 そもそもchar_wと検索してもあまり出てきませんでした。。 いい方法はありますでしょうか。。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★ここでしっかりと TCHAR 型についてお勉強しましょう。 ・前も char 型の文字列を描画したいという内容の質問でしたよね。 >読み込んだファイルはTCHAR型ですよね。 >それをどうやってchar型に直すかです。  ↑  これは Windows で開発しているとき TCHAR 型を使っていてファイルの入出力の時に  C関数を使いたいから char 型に直したいのですよね。  Windows 環境なら C 関数ではなくて API のファイル入出力を使うべきだと思います。  MFC なら CStdio クラスが C 関数と同じ操作で便利です。  MFC、API を利用すれば char 型に直す必要はありません。  まずは次のリンクをよく読んで下さい。  http://www.ruche-home.net/program/tips/tchar.php→『Unicode対応プログラミング』 ・ちなみに次のリンクに TCHAR 型を char 型に変換する内容が紹介されています。  http://www.usefullcode.net/2006/12/windowstchar.html→『WindowsプログラミングでのTCHARの扱い方』  上から7つ目です。  上記のをよく読み理解して下さい。  そうしないとまた TCHAR 型を char 型に変換するには…。で悩みます。 ・以上。上記の内容を読んだ後に解決策を出しますので理解度や感想なんかを補足。

参考URL:
http://www.ruche-home.net/program/tips/tchar.php
noname#142813
質問者

お礼

回答ありがとうございます。 結構長いプログラムを書いてしまいましたので、 読んでみたのですが、ちょっとよくわかりませんでした。。 ちなみにC++ではなくC言語でプログラムをしています。 二つ目のリンクはC++ではないでしょうか。 コンパイラはBorand C++です。 宜しくお願い致します。

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

>エラーが発生し、できませんでした どの様なエラーが発生したのか、 もう少し詳しく教えてください。 とりあえず、以下の2つがわかりませんね。 ・デバイスコンテキストハンドルはどうやって取得したのか? ・CreateFont関数の呼び出し方は正しか? >読み込んだファイルはTCHAR型ですよね 意味がわかりませんが。。。 ファイルからfgetsなどで読み込んだ文字列だとすると 普通はchar型です。 また、TCHAR型というのは、コンパイル時のプリプロセッサによって UNICODEが定義されていればchar_wに 定義されていなければ、char型に置換されるマクロ定義です。

noname#142813
質問者

お礼

すいません、エラーは発生せず、 表示されないだけでした。 回答ありがとうございます。 CreateFont関数は、 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 ); のようになっています。

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

関連するQ&A

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

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

  • Windows APIでおかしな事になる。

    Windows APIでプログラミングをしています。 Windows APIでプログラミングをしています。 char*型の文字列を表示させようと、このように記述しました。 const char * y; y=f(); SelectObject(hdc , hFont); SetBkColor(hdc , RGB(255 , 255 , 255)); wsprintf( str, "名前は、%s", y ); TextOut(hdc , 300, 20, str, lstrlen(str)); すると、表示できたのはいいのですが、 タイトルバーをクリックしてウィンドウを広げたり、別のウィンドウを一番前に持ってきて、 その後、そのウィンドウを出したりすると、エラーが出て、強制終了になってしまします。 何か問題はありますか? ちなみに、strの宣言はこのようになっております。 static TCHAR str[64]; あとですが、 wsprintf( str, "名前は、%s", y ); この部分のyを&yに変えると、エラーは起こりませんが、 変な文字が表示されてしまいます。 ウィンドウを少し操作すると、その文字がまた変な文字に変わります。 何が原因でしょうか。

  • グラフィカルパスについて

    グラフィカルパスについて教えてほしいことが2つあるんですが。 (1)1つ目は下記のソースのようにでフォントを作成しないと描画できないないのですが、その理由を教えて下さい。 デフォルトのフォントだとなぜダメなのでしょうか? (2)2つ目はフォントを作成した場合に、SetBkMode()の部分をコメントアウトすると、背景が塗りつぶされ、文字が塗りつぶされませんが、どうしてでしょうか?(このときフォント作成のコメントアウトは解除して下さい) MSDNにFillPath()の説明に「パスの内部を塗りつぶす」とありますが、このとき文字は「内部」の扱いにならないのでしょうか? どれが内部でどれが外部になるのかよく理解できていないだと思います。 // HFONT hFont; char Str[] = "ABCDE"; HDC hdc = GetDC( hWnd ); BeginPath( hdc ); SetBkMode( hdc, TRANSPARENT ); /* hFont = CreateFont( 80, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET ,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DEFAULT_QUALITY, 0 ,NULL ); SelectObject( hdc ,hFont ); */ TextOut( hdc, 0, 0, Str, lstrlen(Str) ); EndPath( hdc ); SelectObject( hdc, CreateHatchBrush(HS_DIAGCROSS ,0xFF) ); FillPath( hdc ); SelectObject( hdc ,GetStockObject( SYSTEM_FONT ) ); // DeleteObject( hFont ); DeleteObject( SelectObject( hdc, GetStockObject(WHITE_BRUSH) ) ); ReleaseDC( hWnd, hdc ); どなたか分かる方いらっしゃいましたらご教授下さい。 よろしくお願いします。

  • SDKでウィンドウの中央に文字列を表示させる方法

    ウィンドウの中央に文字列sを表示させる方法を教えて下さい。 /********************************** WM_PAINTで TCHAR s[80]; HDC hDC; PAINTSTRUCT ps; RECT rc; GetClientRect(hWnd, &rc); hDC = BeginPaint(hWnd, &ps); TextOut(hDC, rc.right / 2, rc.bottom / 2, tcDayTime, lstrlen(s)); EndPaint(hWnd, &ps); return FALSE; ***********************************/ GetClientRect(hWnd, &rc);でウィンドウのサイズを取得し、 TextOutの第2、第3引数で ウィンドウ幅/2、ウィンドウ高さ/2 としていますが、これだと中央から表示されてしまいます。 できれば、ウィンドウのサイズを変更してもウィンドウの中央に表示させたいです。 #VC ++ 6.0 & Win98 & SDK で作成してます。

  • フォントの指定 猫でもわかるwindowsプログラミングより

    猫でもわかるwindowsプログラミングの本で勉強している学生なんですが、第2章の2.4フォントの指定のところでプログラムを打ち込んでコンパイルしたのですがなぜか識別子が見つかりませんというエラーがでてコンパイルできません。どなたかわかる方お願いします。 一応プログラム(CALLBACK関数と論理フォント作成の関数のみ)↓ //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HFONT hFont1, hFont2, hFont3; PAINTSTRUCT ps; HDC hdc; char *szName1 = "○○"; char *szName2 = "▲▲"; switch (msg) { case WM_CREATE: hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "HG行書体"); hFont2 = MyCreateFont(40, ANSI_CHARSET, "Fraktur JS"); hFont3 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS 明朝"); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, hFont1); TextOut(hdc, 0, 0, (LPCTSTR)szName1, (int)strlen(szName1)); SelectObject(hdc, hFont2); TextOut(hdc, 0, 60, (LPCTSTR)szName2, (int)strlen(szName2)); SelectObject(hdc, hFont3); TextOut(hdc, 0, 120, (LPCTSTR)szName1, (int)strlen(szName1)); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hFont1); DeleteObject(hFont2); DeleteObject(hFont3); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //論理フォントの作成 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName){ return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE. FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } エラー内容↓ MyCreateFontの識別子が見つかりません。 論理フォントの関数のFALSEの値が構文エラーで参照できない。

  • SetWindowTextについて。

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

  • wParam

    wParamは、unsigned int型で、仮想キーコードを、格納してますよね。 wsprintf()内で(TCHAR)キャストしてますが、 これは、変数strの型がTCHAR型なので(wParamは、unsigned intなので型をあわせるために)やっているんですか? (TCHAR)キャストしないとエラーになりますか?教えてください。 HDC hdc; TCHAR str[255]; swich(umsg){   case WM_CHAR:     wsprintf( str, TEXT("%c"), (TCHAR)wPara );     hdc = GetDC(hwnd);     TextOut(hdc, 0, 0, str, lstrlen(str));     return0 }

  • 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]をファイルに書き込んで、保存するプログラムを教えてください。

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

  • TextOutについて

    ウィンドウの雛形に、 case WM_PAINT:{ static int t; PAINTSTRUCT ps; char cbuf[100]; HDC hdc = BeginPaint( hWnd, &ps ); wsprintf( cbuf, _T("on WM_PAINT%d"),t); TextOut(hdc,0,100,cbuf,sizeof(cbuf)); SetWindowText( hWnd, cbuf ); t++; EndPaint( hWnd, &ps ); break; } として実行したところ、ウィンドウを任意のところに重ねて、移動すると、SetWindowはタイトルバーにちゃんとの値が表示されるのですが、TextOutのtは再描画されないのですが、通っているのに描画されないのはなぜでしょうか?

このQ&Aのポイント
  • カラー小型LBP複合機の設置場所が狭い場合の最適な機種を探しています。
  • 使用環境はWindows11で無線LAN接続し、視覚障害者用音声ソフトを利用します。
  • 電話回線はひかり回線を使用しています。
回答を見る

専門家に質問してみよう