いつもお世話になっております。
また教えて頂きたいのですが、
directxで以下のように半角英数のテキスト表示したとき、英語版windowsなどの各国版のwindowsでも正常に表示されるものでしょうか?
よろしくお願い致します。
各国版のWindowsでの英数表示について
Re: 各国版のWindowsでの英数表示について
ネットで調べているのですが、
Tahoma、Microsoft Sans Serif、Arialであれば大丈夫というネット上での記述を見つけましたが、
Unicode、マルチバイト、どちらのコンパイルでも大丈夫なのでしょうか?
Tahoma、Microsoft Sans Serif、Arialであれば大丈夫というネット上での記述を見つけましたが、
Unicode、マルチバイト、どちらのコンパイルでも大丈夫なのでしょうか?
Re: 各国版のWindowsでの英数表示について
MSDN読むとGDIと同様の方法を使っていると思われるので,そういう仮定の上で。
文字集合の指定がSHIFTJIS_CHARSETですが,Arialを指定したいのであればCharSetの値を,
・SHIFTJIS_CHARSETではなくArial自身がサポートする言語,例えばANSI_CHARSETを指定する
・「気にしない」ことを意味するDEFAULT_CHARSETを指定する
などとした方がよいでしょう。
一応,公式資料ではCharSetは(GDIにおいてですが)不一致は最大のペナルティとされているので。
Windows Font Mapping
文字集合の指定がSHIFTJIS_CHARSETですが,Arialを指定したいのであればCharSetの値を,
・SHIFTJIS_CHARSETではなくArial自身がサポートする言語,例えばANSI_CHARSETを指定する
・「気にしない」ことを意味するDEFAULT_CHARSETを指定する
などとした方がよいでしょう。
一応,公式資料ではCharSetは(GDIにおいてですが)不一致は最大のペナルティとされているので。
Windows Font Mapping
Re: 各国版のWindowsでの英数表示について
ご返事ありがとうございます。
英字1byte文字はANSI_CHARSETかDEFAULT_CHARSETがいいようなので、
とりあえずANSI_CHARSETでやってみます。
GDIでCharSet不一致は最大のペナルティというのも全然知りませんでした。
でも、やってみるのはいいのですが、確認の方法が今は無いのです。
英語版Windows買って試してみようかな?
英字1byte文字はANSI_CHARSETかDEFAULT_CHARSETがいいようなので、
とりあえずANSI_CHARSETでやってみます。
GDIでCharSet不一致は最大のペナルティというのも全然知りませんでした。
でも、やってみるのはいいのですが、確認の方法が今は無いのです。
英語版Windows買って試してみようかな?
Re: 各国版のWindowsでの英数表示について
CreateFont 関数の dwCharSet に HANGUL_CHARSET を指定し、lpszFace に TEXT("Gulim") を指定すれば、英語版でも日本語版でも韓国語を表示することができます。
Re: 各国版のWindowsでの英数表示について
ご返事ありがとうございます。
参考にさせて頂きます。
全ての国の言語に対応できませんので、
共通語の英語で間に合わせたいです。
save、load、yes、noなど、簡単な単語が文字化けしなければいいかなと思っています。
参考にさせて頂きます。
全ての国の言語に対応できませんので、
共通語の英語で間に合わせたいです。
save、load、yes、noなど、簡単な単語が文字化けしなければいいかなと思っています。
Re: 各国版のWindowsでの英数表示について
とりあえずArial + ANSI_CHARSETでやってみています。
これで解決とさせて頂きます。
ありがとうございました!
これで解決とさせて頂きます。
ありがとうございました!
Re: 各国版のWindowsでの英数表示について
単純に文字化けしない,という点で言うと,CharSetに指定した文字コードを持つフォントの中から選ばれるため,そのようなフォントさえあれば文字化けしません。
ただし,SHIFTJIS_CHARSETにArialが対応していないため,Arialが使われない,ということになります。
以下のコードを実行すると,Arialという文字列が異なって表示されると思います。
これは,上部分はArialでないフォントが選択されたための結果です。
ただし,SHIFTJIS_CHARSETにArialが対応していないため,Arialが使われない,ということになります。
以下のコードを実行すると,Arialという文字列が異なって表示されると思います。
これは,上部分はArialでないフォントが選択されたための結果です。
#include <Windows.h>
void OnPaint(::HWND hWnd)
{
::PAINTSTRUCT ps;
auto hdc = ::BeginPaint(hWnd, &ps);
::LOGFONT lf1 = { 0 };
lf1.lfHeight = 200;
lf1.lfCharSet = SHIFTJIS_CHARSET;
::lstrcpy(lf1.lfFaceName, TEXT("Arial"));
::LOGFONT lf2 = { 0 };
lf2.lfHeight = 200;
lf2.lfCharSet = ANSI_CHARSET;
::lstrcpy(lf2.lfFaceName, TEXT("Arial"));
auto font1 = ::CreateFontIndirect(&lf1);
auto font2 = ::CreateFontIndirect(&lf2);
auto oldFont = ::SelectObject(hdc, font1);
::TextOut(hdc, 0, 0, TEXT("Arial"), 5);
::SelectObject(hdc, font2);
::TextOut(hdc, 0, 200, TEXT("Arial"), 5);
::SelectObject(hdc, oldFont);
::DeleteObject(font1);
::DeleteObject(font2);
::EndPaint(hWnd, &ps);
}
::LRESULT CALLBACK WndProc(::HWND hWnd, ::UINT uMsg, ::WPARAM wParam, ::LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
::DestroyWindow(hWnd);
return 0;
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
case WM_PAINT:
OnPaint(hWnd);
return 0;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(::HINSTANCE, ::HINSTANCE, ::LPSTR, int nCmdShow)
{
::WNDCLASS wc = { 0 };
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hIcon = ::LoadIcon(nullptr, IDI_APPLICATION);
wc.hCursor = ::LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = reinterpret_cast<::HBRUSH>(COLOR_WINDOW + 1);
wc.lpszClassName = TEXT("TestClass");
auto atomValue = ::RegisterClass(&wc);
auto hWnd = ::CreateWindow(reinterpret_cast<::LPCTSTR>(atomValue), TEXT("Test Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, nullptr, nullptr);
::ShowWindow(hWnd, nCmdShow);
::MSG msg;
::BOOL result;
while ((result = ::GetMessage(&msg, nullptr, 0, 0)) != 0 && result != -1)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
if (result == -1)
{
return ::GetLastError();
}
return msg.wParam;
}
Re: 各国版のWindowsでの英数表示について
サンプルプログラムまで用意して頂いて恐縮です。
色々試しながら作っていきたいと思います。
ありがとうございました!
色々試しながら作っていきたいと思います。
ありがとうございました!