TextDrowについて
TextDrowについて
TextDrow()で描画したのですが、改行はするのですが、ウィンドウのサイズを小さくして大きくして改行されると最後の文字が連なって表示されます。どうしたら文字が連なわなくすることができるのでしょうか?
Re:TextDrowについて
次々と質問するよりも、しっかりとWinAPIの基礎を学ぶべきだと思います。
描画の仕組みとかイメージできていないでしょ。
http://www.kumei.ne.jp/c_lang/
http://www.amazon.co.jp/dp/4756136001
描画の仕組みとかイメージできていないでしょ。
http://www.kumei.ne.jp/c_lang/
http://www.amazon.co.jp/dp/4756136001
Re:TextDrowについて
そのサイトではないですがあるサイトで
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,PSTR lpCmdLine ,int nCmdShow ) {
MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION);
return 0;
}のlpCmdLineがパスが文字化けして出ないのですが。
これはGetCommandLine関数でやった方がいいのでしょうか?
またなぜ文字化けしたのでしょうか?
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,PSTR lpCmdLine ,int nCmdShow ) {
MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION);
return 0;
}のlpCmdLineがパスが文字化けして出ないのですが。
これはGetCommandLine関数でやった方がいいのでしょうか?
またなぜ文字化けしたのでしょうか?
Re:TextDrowについて
落ち着いて質問を読み直してください。
・環境が書いていません。
・どのような出力のプログラムを書いたのか書いていません。
・どこでどのように文字化けしているのか書いていません。
これらは回答に最低限必要な情報です。
これなしで私に確実に答えられることは、
「私のプログラムでは文字化けしませんよ」程度です。
こっからはサービスです。少しだけね。
VC2003でデフォルトの_tWinMainの直後に次のように書いたら文字化けもなく、
ひらがなの出力ができました。
TCHAR buf[1024];
_tcscpy(buf, lpCmdLine);
OutputDebugString(buf);
OutputDebugString(TEXT("\n"));
最後にもう一度書きますが、質問の投稿前に必ず読み直し、
自分の状況が相手に伝わるかを想像すると約束してください。
・環境が書いていません。
・どのような出力のプログラムを書いたのか書いていません。
・どこでどのように文字化けしているのか書いていません。
これらは回答に最低限必要な情報です。
これなしで私に確実に答えられることは、
「私のプログラムでは文字化けしませんよ」程度です。
こっからはサービスです。少しだけね。
VC2003でデフォルトの_tWinMainの直後に次のように書いたら文字化けもなく、
ひらがなの出力ができました。
TCHAR buf[1024];
_tcscpy(buf, lpCmdLine);
OutputDebugString(buf);
OutputDebugString(TEXT("\n"));
最後にもう一度書きますが、質問の投稿前に必ず読み直し、
自分の状況が相手に伝わるかを想像すると約束してください。
Re:TextDrowについて
すみませんでした。環境はVC2005です。どういう文字化けが出たかは、どう書いてよいのかわかりません。漢字が
出てきます。メッセージボックスのクライアント領域に文字化けが表示されます。
出てきます。メッセージボックスのクライアント領域に文字化けが表示されます。
Re:TextDrowについて
私が書いた例は実行しましたか?
プロジェクトを新しく作って試してください。
> メッセージボックスのクライアント領域に文字化けが表示されます。
なぜメッセージボックス表示のコードをここに書かないのですか?
それと、半角英数字が正しく表示できるか確認してください。
プロジェクトを新しく作って試してください。
> メッセージボックスのクライアント領域に文字化けが表示されます。
なぜメッセージボックス表示のコードをここに書かないのですか?
それと、半角英数字が正しく表示できるか確認してください。
Re:TextDrowについて
回答ありがとうございます。
試しました・・・が文字化けでした。
#include<windows.h>
#include<TCHAR.h>
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,LPSTR lpCmdLine ,int nCmdShow ) {
}
半角英数字は正しく表示できてると思います。
試しました・・・が文字化けでした。
#include<windows.h>
#include<TCHAR.h>
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,LPSTR lpCmdLine ,int nCmdShow ) {
TCHAR buf[1024];
_tcscpy(buf, (LPWSTR)lpCmdLine);
OutputDebugString(buf);
OutputDebugString(TEXT("\n"));
MessageBox(NULL , buf , TEXT("Kitty") , MB_ICONINFORMATION);return 0;
}
半角英数字は正しく表示できてると思います。
Re:TextDrowについて
回答ありがとうございます。
ウィンドウのクライアント領域の真ん中に文字化けで出力されました。
確か A abcd とプロジェクトのプロパティのコマンド引数のところに書きました。
ウィンドウのクライアント領域の真ん中に文字化けで出力されました。
確か A abcd とプロジェクトのプロパティのコマンド引数のところに書きました。
Re:TextDrowについて
> ウィンドウのクライアント領域の真ん中に文字化けで出力されました。
私はそのような例を書いていませんけど。このスレの話ですよ。
しっかり確認してください。
私はそのような例を書いていませんけど。このスレの話ですよ。
しっかり確認してください。
Re:TextDrowについて
回答ありがとうございます。
わかっています。デバッグの出力元に表示されるのですよね。
すみません。探してみましたが上の方に書いてありました。
?????とだけ書いてあります。
わかっています。デバッグの出力元に表示されるのですよね。
すみません。探してみましたが上の方に書いてありました。
?????とだけ書いてあります。
Re:TextDrowについて
> わかっています。デバッグの出力元に表示されるのですよね。
たこやきさんが分かっているということを書いてくれないと、
私にはそれが分からないのですよ。忘れないで書いてください。
> ?????とだけ書いてあります。
それは、私の例のままですか?
YuOさんの指摘しているcastをしているのですか?
それとプロジェクトの文字セットを教えてください。
たこやきさんが分かっているということを書いてくれないと、
私にはそれが分からないのですよ。忘れないで書いてください。
> ?????とだけ書いてあります。
それは、私の例のままですか?
YuOさんの指摘しているcastをしているのですか?
それとプロジェクトの文字セットを教えてください。
Re:TextDrowについて
回答ありがとうございます。
はい、YuOさんの指摘しているとおりcastしてます。
出ないとエラーが「PSTRからLPWSTRに変換できません」と表示されるのです。
ので入れてみました。
間違っていますでしょうか?
文字セットはUnicodeです。
はい、YuOさんの指摘しているとおりcastしてます。
出ないとエラーが「PSTRからLPWSTRに変換できません」と表示されるのです。
ので入れてみました。
間違っていますでしょうか?
文字セットはUnicodeです。
Re:TextDrowについて
LPSTRはマルチバイト文字列のポインタです。
LPSTRの文字列の文字コードはマルチバイト文字じゃないでしょうか?
今のままだとマルチバイト文字列のポインタを無理やりワイド文字列のポインタにキャストしてるだけですね。
ポインタをキャストしているだけですから、当然中身の文字列はマルチバイト文字のままなので文字化けしているんですね。
この間から曖昧に使っているなとは思いますが重症です。
まず、マルチバイト文字とワイド文字の違いを理解してください。
http://ja.wikipedia.org/wiki/%E3%83%9E% ... E.E6.AF.94
http://ja.wikipedia.org/wiki/%E3%83%AF% ... 7%E5%AD%97
Windowsだとワイド文字の文字コードは"UTF-16"です。 覚えておいてください。
さて、問題解決ですが
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,LPSTR lpCmdLine ,int nCmdShow ) {
である限りワイド文字列ではなくマルチバイト文字列となります。
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPWSTR lpCmdLine, int nShowCmd);
を使ってください。
LPSTRの文字列の文字コードはマルチバイト文字じゃないでしょうか?
今のままだとマルチバイト文字列のポインタを無理やりワイド文字列のポインタにキャストしてるだけですね。
ポインタをキャストしているだけですから、当然中身の文字列はマルチバイト文字のままなので文字化けしているんですね。
この間から曖昧に使っているなとは思いますが重症です。
まず、マルチバイト文字とワイド文字の違いを理解してください。
http://ja.wikipedia.org/wiki/%E3%83%9E% ... E.E6.AF.94
http://ja.wikipedia.org/wiki/%E3%83%AF% ... 7%E5%AD%97
Windowsだとワイド文字の文字コードは"UTF-16"です。 覚えておいてください。
さて、問題解決ですが
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE,LPSTR lpCmdLine ,int nCmdShow ) {
である限りワイド文字列ではなくマルチバイト文字列となります。
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPWSTR lpCmdLine, int nShowCmd);
を使ってください。
Re:TextDrowについて
> 出ないとエラーが「PSTRからLPWSTRに変換できません」と表示されるのです。
> ので入れてみました。
> 間違っていますでしょうか?
間違っています。
というか,一番やってはいけないキャストです。
キャストはエラーを消すためにあるのではないです。
Win32 APIではどうしても多用しますが,これは例えばWPARAMに構造体へのポインタが入っていると決まっている等の,
ちゃんとした理由に基づくもので,「エラーを消すためのキャスト」ではありません。
TCHARを使ってプログラムを作るのであれば,エントリポイントは_tWinMainを使い,
LP(C)STRやLP(C)WSTRではなくLP(C)TSTRを,char (CHAR) やwchar_t (WCHAR) ではなくTCHARを,
それぞれ使って組む必要があります。
> ので入れてみました。
> 間違っていますでしょうか?
間違っています。
というか,一番やってはいけないキャストです。
キャストはエラーを消すためにあるのではないです。
Win32 APIではどうしても多用しますが,これは例えばWPARAMに構造体へのポインタが入っていると決まっている等の,
ちゃんとした理由に基づくもので,「エラーを消すためのキャスト」ではありません。
TCHARを使ってプログラムを作るのであれば,エントリポイントは_tWinMainを使い,
LP(C)STRやLP(C)WSTRではなくLP(C)TSTRを,char (CHAR) やwchar_t (WCHAR) ではなくTCHARを,
それぞれ使って組む必要があります。
Re:TextDrowについて
> VC2003でデフォルトの_tWinMainの直後に次のように書いたら文字化けもなく、
> ひらがなの出力ができました。
...
> 私が書いた例は実行しましたか?
> プロジェクトを新しく作って試してください。
というような事を私は書いているわけで、その通りに
VCのデフォルトで作れば、問題は回避されていたはずです。
文字化けが解決した後に振り返って、
自分の姿勢のどこが間違っていたかを考えてください。
さて、もう一度、新しくプロジェクトを作り、
デフォルトに私が書いた4行だけ追加して確認してみてください。
# 集中砲火みたいに感じるかもしれませんが、誰も非難するつもりはないですよ。
# でも、みんなから似た指摘をされるならば、多分そこがあなたの弱点なのでしょう。
# 成長するには克服する必要がありますね。
> ひらがなの出力ができました。
...
> 私が書いた例は実行しましたか?
> プロジェクトを新しく作って試してください。
というような事を私は書いているわけで、その通りに
VCのデフォルトで作れば、問題は回避されていたはずです。
文字化けが解決した後に振り返って、
自分の姿勢のどこが間違っていたかを考えてください。
さて、もう一度、新しくプロジェクトを作り、
デフォルトに私が書いた4行だけ追加して確認してみてください。
# 集中砲火みたいに感じるかもしれませんが、誰も非難するつもりはないですよ。
# でも、みんなから似た指摘をされるならば、多分そこがあなたの弱点なのでしょう。
# 成長するには克服する必要がありますね。
Re:TextDrowについて
あっ、_tWinMainじゃないとまずかったですね。訂正します。
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd);
これでお願いします。
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nShowCmd);
これでお願いします。
Re:TextDrowについて
softyaさん回答ありがとうございます。
サイト参考にしたいと思います。ところで一つ質問なのですが、今自分winodwXPを使っているのですが、
Window2000serverSP4下位で使うことを考えた場合、マルチバイト文字を使うべきなのでしょうか?
ワイド文字列を使うべきなのでしょうか?基本的にワイド文字列を使った方がいいのでしょうか?
サイト参考にしたいと思います。ところで一つ質問なのですが、今自分winodwXPを使っているのですが、
Window2000serverSP4下位で使うことを考えた場合、マルチバイト文字を使うべきなのでしょうか?
ワイド文字列を使うべきなのでしょうか?基本的にワイド文字列を使った方がいいのでしょうか?
Re:TextDrowについて
YuOさん回答ありがとうございます。
そうなんですか、一番やってはいけないことですか。わかりました以後気をつけます。
たいちうさん回答ありがとうございます。
># 集中砲火みたいに感じるかもしれませんが、誰も非難するつもりはないですよ。
># でも、みんなから似た指摘をされるならば、多分そこがあなたの弱点なのでしょう。
># 成長するには克服する必要がありますね。
当然何言われるか分からないと覚悟して聞いてますので仕方ないと思っています。
弱点を克服するため頑張りたいと思います!
そうなんですか、一番やってはいけないことですか。わかりました以後気をつけます。
たいちうさん回答ありがとうございます。
># 集中砲火みたいに感じるかもしれませんが、誰も非難するつもりはないですよ。
># でも、みんなから似た指摘をされるならば、多分そこがあなたの弱点なのでしょう。
># 成長するには克服する必要がありますね。
当然何言われるか分からないと覚悟して聞いてますので仕方ないと思っています。
弱点を克服するため頑張りたいと思います!
Re:TextDrowについて
> Window2000serverSP4下位で使うことを考えた場合、マルチバイト文字を使うべきなのでしょうか?
> ワイド文字列を使うべきなのでしょうか?基本的にワイド文字列を使った方がいいのでしょうか?
W系のAPIは,NT系列 (製品名にNTの付かない2000~7/2008含む) では初期からサポートされていました。
とりあえず,私が扱ったことのある中での最古はWindows NT 4.0です。
このため,Windows 2000であればW系のAPIを利用する事に躊躇する必要はありません。
# A系のAPIを利用した場合,内部でW系のAPIを呼び出す実装になっていると聞いています。
ただし,ファイルの読み書きを行う場合は,文字コードに注意する必要が (A/Wどちらにしろ) 出てきます。
> ワイド文字列を使うべきなのでしょうか?基本的にワイド文字列を使った方がいいのでしょうか?
W系のAPIは,NT系列 (製品名にNTの付かない2000~7/2008含む) では初期からサポートされていました。
とりあえず,私が扱ったことのある中での最古はWindows NT 4.0です。
このため,Windows 2000であればW系のAPIを利用する事に躊躇する必要はありません。
# A系のAPIを利用した場合,内部でW系のAPIを呼び出す実装になっていると聞いています。
ただし,ファイルの読み書きを行う場合は,文字コードに注意する必要が (A/Wどちらにしろ) 出てきます。