[1] 質問文
[1.1] 自分が今行いたい事は何か
マルチバイト文字をビットマップとして取得し、表示したい。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
コードです。 http://marupeke296.com/WINT_GetGlyphOutline.html を参考にしました。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
switch(msg) {
case WM_LBUTTONDOWN:
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
//http://marupeke296.com/WINT_GetGlyphOutline.html 参考
GLYPHMETRICS GM;
CONST MAT2 Mat = {{0,1},{0,0},{0,0},{0,1}};
HFONT hFont = CreateFont(
150,
0,
0,
0,
0,
FALSE,
FALSE,
FALSE,
SHIFTJIS_CHARSET,
OUT_TT_ONLY_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
FIXED_PITCH | FF_MODERN,
TEXT("MS ゴシック")
);
HDC hdc = GetDC(hwnd);
HFONT oldFont = (HFONT)SelectObject(hdc, hFont);
char *c = "あ";
UINT code = 0;
if(IsDBCSLeadByte(*c))//ダブルバイト文字か否か
code = (BYTE)c[0]<<8 | (BYTE)c[1];// 2バイト文字のコードは[文字コード]*256 + [先導コード]
else
code = c[0];
// ビットマップ取得
DWORD size = GetGlyphOutline(hdc, code, GGO_GRAY4_BITMAP, &GM, 0, NULL, &Mat);
BYTE *ptr = new BYTE[size];
GetGlyphOutline(hdc, code, GGO_GRAY8_BITMAP, &GM, size, ptr, &Mat);
TEXTMETRIC TM;
GetTextMetrics(hdc, &TM);
DWORD pixel = 0;
//ビットマップ表示
for(UINT y = TM.tmAscent-GM.gmptGlyphOrigin.y; y < GM.gmBlackBoxY; y++){
for(UINT x = GM.gmptGlyphOrigin.x; x < GM.gmBlackBoxX; x++){
pixel = (DWORD)(y*GM.gmBlackBoxX + x);
SetPixelV(hdc, x-GM.gmptGlyphOrigin.x, y-(TM.tmAscent-GM.gmptGlyphOrigin.y), (COLORREF)ptr[pixel]);
}
}
// オブジェクトの開放
SelectObject(hdc, oldFont);
DeleteObject(hFont);
ReleaseDC(hwnd, hdc);
delete[] ptr;
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
WNDCLASS winc;
MSG msg;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("WINC");
if (!RegisterClass(&winc)) return 0;
hwnd = CreateWindow(
TEXT("WINC") , TEXT("test") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return 0;
while (GetMessage(&msg , NULL , 0 , 0)){
DispatchMessage(&msg);
}
return msg.wParam;
}
文字がずれて表示されます。表示方法が間違っているのだと思います。
また、for文の条件式をいじるとヒープ不足と怒られます。
[1.4] 今何がわからないのか、知りたいのか
表示方法を知りたいです。いろいろ試したのですがヒープ不足と怒られたり、どうしても綺麗に表示されないのです。
[2] 環境
[2.1] OS : Windows10
[2.2] コンパイラ名 : visual studio 2008