• ベストアンサー

GetGlyphOutlineについて

はじめまして。 現在GetGlyphOutline(API関数)を使い、 文字のビットマップを取得しようとしています。 GGO_BITMAPを指定した、普通のビットマップの取得には成功したのですが、 GGO_GRAY8_BITMAPをしていすると、何も表示されなくなってしまいます。 dwRet = ::GetGlyphOutline(hDC,'A',GGO_GRAY8_BITMAP,&gm,0,NULL,&m2); どこかGGO_BITMAPの時とは違う設定にしなければいけないのでしょうか? ご回答よろしくお願いいたします。

  • micho
  • お礼率100% (1/1)

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

  • ベストアンサー
  • bir
  • ベストアンサー率44% (11/25)
回答No.1

GGO_GRAY8_BITMAP以外のパラメータは特に変更する必要はありません。 ビットマップの表示処理をどのように行われているのかわかりませんが、 そちらを見直されてはいかがでしょうか。

micho
質問者

お礼

早速のご回答ありがとうございました。 ビットマップの表示はBitBltを使用しているのですが、 BITMAP構造体のbm.bmWidthBytesに値を代入するところが一番 怪しいところだと思っています。 GetGlyphOutline 以下このように書いております。 hBitmap = BitmapFromBits(lpBuf,(WORD)gm.gmBlackBoxX,(WORD)gm.gmBlackBoxY); hOldBmp = (HBITMAP)::SelectObject(hMemDC,hBitmap); ::BitBlt(hDC,10,10,gm.gmBlackBoxX,gm.gmBlackBoxY,hMemDC,0,0,SRCCOPY); BitmapFromBitsのところでBITMAP構造体に値を代入しているのですが、  bm.bmType = 0;  bm.bmWidth = gm.gmBlackBoxX;  bm.bmHeight = gm.gmBlackBoxY;  bm.bmWidthBytes = ((gm.gmBlackBoxX + 31) >> 5) << 2;  bm.bmPlanes = 1;  bm.bmBitsPixel = 8;  bm.bmBits = lpBits; これだと何も表示されません。 たびたび済みませんが、助言の方よろしくお願いいたします。

関連するQ&A

  • メモリーかな?

    ひそひそと小規模なげーむを作っております。 実はノベルゲームのような文字がたくさん出るようにしたくて DirectX技術編というサイトを参考にしまして、テクスチャ文字を 一文字作成するclassをつくりまして、それを派生させて、自分なりの 会話表示に使う分を出力するクラスをつくりました。 ここまではよかったのですが、それを使っていると不具合が出ました。 はじめのマップ1でキャラクター人数分の会話文の文字作成を行い、 マップ1からマップ2に移動することで、マップ1で作成した文生成 のクラスをdelete。 次にマップ2のキャラクターの会話文を生成。ここまでは不具合なく 問題はなかったのですが、マップ1とマップ2を行き来することで 文字の破棄と生成を繰り返すことで、アプリケーションが強制終了 の状況に追い込まれました。 何度か試して、最初に一括して文の文字を生成して生成と破棄を繰り返さなければ問題はでませんでした。 問題が発生してとまる部分はいつも、文字作成部分の TEXTMETRIC TM; GetTextMetrics( hdc, &TM ); GLYPHMETRICS GM; CONST MAT2 Mat = {{0,1},{0,0},{0,0},{0,1}}; DWORD size = GetGlyphOutline(hdc, code, GGO_GRAY4_BITMAP, &GM, 0, NULL, &Mat); BYTE *ptr = new BYTE[size]; GetGlyphOutline(hdc, _T(code), GGO_GRAY4_BITMAP, &GM, size, ptr, &Mat); の、BYTE *ptr= new BYTE[size]の部分でした。 おそらく自分なりの考えではメモリー容量とかんけいしているのかな とおもったんですけど、詳しい方どうかお願いします。 僕のパソコンはメモリー256MBです。 こんな文字の出力はゲームボーイでもできたのに、やはりメモリー ではなくて、自分の非効率なプログラムのせいでしょうか…。 メモリーリークは出ていません。

  • c言語を使いダイアログにbmpを表示したい 

    はじめまして、 私は、c言語は初心者なのでが、ダイアログボックスに、画像(bmp)が表示することができません。 ソースは、 hdc = BeginPaint(hDlg, &ps); //指定ウィンドウ内での描写準備 // ビットマップをファイルからロードする hBitmap = ::LoadBitmap( NULL, _T("test.bmp") ); // ウィンドウのデバイスコンテキストハンドルを取得する hDC = GetDC( hDlg ); // メモリデバイスコンテキストを作成する hCompatDC = CreateCompatibleDC( hDC ); // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); // ビットマップをウィンドウに転送する(表示する) if(hBitmap != NULL){ StretchBlt( hDC, 0, 0, 100, 100, hCompatDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SendDlgItemMessage( hDlg, IDC_STATIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。

  • UNICODE指定のプロジェクトで関数Wの呼出し?

    .NET VC++で簡単な印刷プログラムを作りました hdc = CreateDC(TEXT("EPMJ3"), TEXT("Canon MP280 series Printer"), NULL, NULL);・・・(1) StartDoc(hdc, &docinfo);                           ・・・(2) StartPage(hdc); TextOut (hdc, 10, 200,L"テスト印刷の1行目です。", 12);           ・・・(3) TextOutW(hdc, 10, 100,L"テスト印刷の2行目です。", 12);           ・・・(4)  EndPage(hdc); EndDoc(hdc); DeleteDC(hdc); プロジェクトの文字コードはUNICODEを指定しております (1)はCreateDocW関数 (2)はStartDocW関数が呼ばれます (3)は当然TextOutW関数になるだろうと思っていたら、TextOutA関数が呼ばれいます 試しに(4)のように直接TextOutW関数を指定してみたら、これも結果に於いてTextOutA関数が呼ばれています    【以上の事柄はAPIフックを仕掛けて調べました】 なぜ私のコンパイラはUNICODE用のTextOut関数を呼出してくれないのですか????

  • GetPixelに使うHDCの作り方

    ビットマップハンドルhBitmap の(x,y)の画素の色を読み取るプログラムに使うデバイスコンテキストとして、  hDC = CreateCompatibleDC(NULL);  SelectObject(hDC, hBitmap);  rgb = GetPixel(hDC, x,y);  DeleteDC(hDC); のように、NULL を指定して、画面と互換性のあるメモリデバイスコンテキストを指定したのですが、正しい色が読み出せません。hDC = GetDC(NULL);でも同じく駄目でした。hDCはどのように作ったらよいのでしょう。 なお、関数の中でGetPixel()を使いたいので、hWnd などは使えません。

  • 画像表示について

    画像を表示させたいのですがうまくいきません。 途中まで打ってみたのでご意見お願いします。 (リソースから読み込んで表示させる方法) 環境:MicrosoftVisualC++ SDK ******省略********* case WM_PAINT:   hdc = BeginPaint(hWnd,&ps);   //ビットマップリソースハンドルの取得   hBmp = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1));   if(hBmp == NULL){     MessageBox(hWnd,"ファイルの読み込みに失敗しました。","エラー",MB_ICONWARNING | MB_OK);     exit(1);   }   //ビットマップの大きさの情報取得   GetObject(hBmp,(int)sizeof(BITMAP),&bmp_info);   w = bmp_info.bmWidth;   h = bmp_info.bmHeight;   hdc_mem = CreateCompatibleDC(hdc);   SelectObject(hdc_mem,hBmp);   BitBlt(hdc,0,0,w,h,hdc_mem,0,0,SRCCOPY);   DeleteDC(hdc_mem);   DeleteObject(hBmp);   EndPaint(hWnd,&ps);   break; ******リソース(img.rc)****** // // Bitmap // IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" #ifdef APSTUDIO_INVOKED

  • WinAPIのGetDIBitsでディスプレイのビットを...

    CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL) で、ディスプレイのHDCを収得したのですが、その後ある一定範囲のビットを調べたいです。 しかし、GetPixelだと処理が遅くなり、困っています。 GetDIBitsはあまり解説しているサイトが少なく、よくわかりません・・・。 また、第一パラメータはHDCを指定すればいいようですが、そのあとのビットマップハンドルをなぜ指定する必要があるのでしょうか。 それと、ディスプレイのビットマップハンドルを収得できますか?

  • 画像処理 ビットマップ ダブルバッファリング

    「猫でもわかるWindowsプログラミング」を参考に、ビットマップを表示するプログラムを作っています。 下記ソース(WM_PAINT部分のみ抜粋)のような感じで、 読み込んだビットマップをダブルバッファリングを用いて表示させたいのですが、 何も表示させることができず、困っております。 LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) {   HBITMAP hBmp;   BITMAP bmp_info;   HDC hDC, hDC_mem;   PAINTSTRUCT ps;   int w=0, h=0;   switch (msg) { case WM_PAINT:   hDC = BeginPaint(hwnd,&ps);   hDC_mem = CreateCompatibleDC(hDC);   hBmp=LoadBitmap(hInst, TEXT("MYBMP"));   hBmp = (HBITMAP)LoadImage(hInst, TEXT("MYBMP"), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; SelectObject(hDC_mem, hBmp); BitBlt(hDC, 0, 0, w, h, hDC_mem, 0, 0, SRCCOPY); DeleteDC(hDC_mem); DeleteObject( hBmp ); EndPaint( hwnd, &ps ); break; } } リソースですが、下記のように bitmap1.bmpを指定しており、画像はもちろんフォルダ内に入れ、 読み込める状態にはしています。   //   // Bitmap   //   MYBMP BITMAP "bitmap1.bmp"   #endif // 日本語 resources しかし、hBmpの戻り値を調べると NULL の値が入っています。当然画像は表示されません。 当方、Microsoft visual studio 2005を使っておりますが、このプロジェクトは、 Win32コンソールアプリケーション⇒Windowsアプリケーション で作成はせず、 Win32コンソールアプリケーション⇒コンソールアプリケーション で作成していますので、 ここが問題になっているのでしょうか? できれば、コンソールアプリケーションで作成したいですが、LoadImage関数は使えないのでしょうか? それとも他に問題点があるのでしょうか? 以前は動画処理をしており、SetDIBitsToDevice関数を使って配列の中身を指定し、画像をウィンドウ上に表示していました。 しかし、画像のちらつきが気になったため、ダブルバッファリングに改良しようとし、 調べてみたところ、ビットマップを用いるやり方が一般的なようでした。 そこで、まずはビットマップの表示をさせるプログラムをつくってみようと思ったのですが、つまずいている状態です。 環境は、 Microsoft Windows XP Home Edition Version2002 Service Pack 3 Pentium(R) 4 CPU 2.80GHz 1.0GB RAM Microsoft visual studio 2005(有料) です。 何かアドバイスをよろしくお願いします。

  • Win32APIとC言語を使ってビットマップを表示したいのですが、表示できません。

    小生、只今Win32APIとC言語を使い、WindowsXPSP3上でBCC5.5.1とBCCFormを使いビットマップを表示するプログラムを書いていますが、 "猫でもわかるWindows~"などに掲載されているサンプルを実行してみますが、ビットマップが表示されません。 ウィンドウクラスの登録、ウィンドウの生成などはほぼ、 http://gurigumi.s349.xrea.com/programming/visualcpp/intro4.html に掲載されている、サンプルプログラムと同じです。 違いと言うと、ResBitmap.hをインクルードしているくらいです。 問題はウィンドウプロシージャにあって、 下記にウィンドウプロシージャ、WndProc関数を記します。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBmp; BITMAP bmp_info; static int w, h; switch(msg){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hBmp = LoadBitmap(hInst, "MYBMP"); if(hBmp == NULL){ MessageBox(hWnd, "ビットマップ読み込み失敗", NULL, MB_OK); return 0; } GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); DeleteDC(hdc_mem); DeleteObject(hBmp); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return 0; } return DefWindowProc(hWnd, msg, wp, lp); } この状態で実行ファイルを、 bcc32 -W source.cpp brc32 Bitmap.rc source.exe とし、出来上がったsource.exeを実行すると"ビットマップ読み込み失敗"のメッセージボックスが表示されてしまい、ウィンドウには何も表示されません。 ちなみに、Bitmap.rcは下記の様になってます。 MYBMP BITMAP DISCARDABLE "C:\Documents and Settings\ShuNakagawa\My Documents\C\test.bmp" ResBitmap.hは下記の様になってます。 #define MYBMP 100 以上です。 諸先輩方、アドバイス宜しくお願い致します。 もう悩んで2ヶ月程経ちます、どうか本当に助けてください。 ※LoadBitmapの第2引数をMAKEINTRESOURCE(MYBMP)とし、  実行ファイルを作成しましたが、結果は同じでした。。。

  • 丸いボタンの表示でCPU100%

    VC6.0でMFCアプリケーションを作成しています。 ・ダイアログベース ・背景はビットマップ(スタイルにWS_CLIPCHILDRENを追加) ・ボタンはビットマップ&非矩形(丸) これを作成し、実行するとCPU使用率が100%になってしまいます。 OnPaint()での描画をしなければ、ボタンが丸く表示されません。 ご存知の方は教えてください。 以下、ソース抜粋です。 メンバ CButton m_cbImage; CBitmap m_cBmpBack; CBitmap m_cBmpButton; HBITMAP m_hBmpBack; BITMAP m_bmp; HDC m_hDc; OnInitDialog(){ //背景ビットマップ m_cBmpBack.LoadBitmap(IDB_BITMAP_BACK); //ボタンビットマップ m_cBmpButton.LoadBitmap(IDB_BITMAP_BUTTON); HBITMAP hBmpButton = HBITMAP(m_cBmpButton); m_cbImage.SetBitmap(hBmpButton); // ウィンドウに関する情報を取得 // BMPサイズ取得 m_hBmpBack = HBITMAP(m_cBmpBack); GetObject(m_hBmpBack, sizeof(BITMAP), &m_bmp); // BMPデバイスコンテキスト作成 m_hDc = CreateCompatibleDC(NULL); // オブジェクトを選択する SelectObject(m_hDc, m_hBmpBack); // ボタン変形 CRect cRectButton; m_cbImage.GetClientRect(cRectButton); CRgn rgnButton; rgnButton.CreateEllipticRgn(cRectButton.Width() * 1 / 8, cRectButton.Height() * 1 / 8, cRectButton.Width() * 7 / 8, cRectButton.Height() * 7 / 8); m_cbImage.SetWindowRgn((HRGN)rgnButton, TRUE); } OnPaint(){ HDC hdc = ::GetDC(m_hWnd); BitBlt(hdc, 0, 0, (int)m_bmp.bmWidth, (int)m_bmp.bmHeight, m_hDc, 0, 0, SRCCOPY); ::ReleaseDC(m_hWnd, hdc); } 以上、よろしくお願いします。

  • ビットマップ画像表示

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を 表示させようとプログラムを組んだのですが、 子ウィンドウを出してもビットマップ画像が表示されません。 以下のようなプログラムを追加しました。 --------------------------------- ///リソーススクリプト/////////////////////////////////  IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp" ///ヘッダースクリプト/////////////////////////////////  #define IDB_BITMAP1   3000 ///ソーススクリプト/////////////////////////////////// void ShowMyBMP(HWND hWnd, HDC hdc){   HDC hmdc;   HBITMAP hBitmap;   BITMAP bmp;   HINSTANCE hInst;   int BMP_W, BMP_H;   hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);   hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));  //インスタンスハンドル取得   GetObject(hBitmap, sizeof(BITMAP), &bmp);  //ビットマップの情報を得る   BMP_W = (int)bmp.bmWidth;  //画像の幅   BMP_H = (int)bmp.bmHeight;  //画像の高さ   hmdc = CreateCompatibleDC(hdc);  //メモリデバイスコンテキストハンドルを取得   SelectObject(hmdc, hBitmap);   BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);   StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);   DeleteDC(hmdc); //デバイスコンテキストハンドルを開放   DeleteObject(hBitmap);   return; } --------------------------------- ShowMyBMP関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。

専門家に質問してみよう