• 締切済み

MFC XPでのTextOutのボヤケについて

はじめまして。 質問させてください。 CImageを使用して OnPaint( )でBMP画像を描画するアプリを作成しております。 仕様といたしまして ダイアログのDC部にBMPを全体に描画して RGB( 255, 255, 255 )を透明化(背景が完全に見える)する ようにしております。 OnInitDialog( )で透過、透明処理をしています。 OnPaint( )で PaintDC PDC; //背景を透過 PDC.SetBkMode( TRANSPARENT ); PDC.SetTextColor( RGB( 255, 0, 0 ) ); PDC.SetBkColor( RGB( 255, 255, 255 ) ); PDC.TextOutW( 100, 100, _T( "TEST" ) ); 上記のように実装して、EXEで実行して確認しますと Windows2000の場合、正常に文字(TEST)が赤字で描画されるのですが WindowsXPの場合、赤字で描画されるのですが文字の周りがぼやけてしまいます。 イメージとしては文字描画部分が 2000の場合、BMP表示 XPの場合、JPG表示 のようになります。 これは仕様なのでしょうか? それとも何かコードレベルで解決できるのでしょうか? お詳しい方がおりましたらご教授お願いいたします。 よろしくお願いいたします。

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

Xpでは文字にアンチエイリアス (文字の縁を滑らかにする技法) がかかる為です。 「画面のプロパティ」→「デザイン」タブにある「効果」の 「次の方法でスクリーン フォントの縁を滑らかにする」のチェックをはずせば Windows2000と同じにようにアンチエイリアスがかからなくなります。 (つまりTextOutA/W APIはこの設定に影響を受けます。MFCのTextOutも内部でこのAPIを呼んでいるだけです。) 私は使ったことが無いので詳細はわかりませんが コード上で実現する為には GetGlyphOutlineを使う事でシステムの設定に関係なく アンチエイリアスを無効にしたフォントの出力が可能なようです。 「GetGlyphOutline アンチエイリアス無し」で検索すると、 それについて解説しているページが見つかります。

関連するQ&A

  • CEditクラスの透過について

    CEditクラスを派生させれば できるのでしょうか? 文字を入力した部分が白い帯になり 派生クラスで CDC *pDC=GetDC(); pDC->SetBkColor(RGB(0,0,255)); pDC->SetBkMode(TRANSPARENT); ReleaseDC(pDC); などとしても TextOut関数に対してなので 違うような気がします。 別に透過でなくても 親ウインドウ画面をコピーしてCEditの派生クラスに貼り付けても(BitBlt)いいんですが、 文字の部分にどう処理させればいいのかわかりません。 CEditクラスの派生クラスの透過は出来るのでしょうか? よろしくお願いします。

  • VC++でのアイコン背景透過について

    VC++2013 MFC環境です。 プログラムで○や×などの記号のアイコンを描画し、PNG,GIF,JPEGの形式でファイルに保存したいです。その時、アイコンの背景を透過したいのですがうまくいきません。 CDCクラスとCImageクラスを使用しアイコンの出力をしています。 背景透過について調べていくつか使えそうな関数があり試したのが、TransparentBltという関数で、デバイスコンテキストを二つ用意して、片方に記号を描画し、透過したい色を指定してもう片方にコピーすると指定した色が透過になる?と解釈しプログラム組みましたが結果は真っ黒の画像でした。 ここで完全に手が止まってしまい、質問させていただきます。 以下ソース CImage Image, image2; Image.Create( 50, 50, 24 ); image2.Create( 50, 50, 24 ); CDC* pDC = CDC::FromHandle( Image.GetDC( ) ); CDC* pdc2 = CDC::FromHandle( image2.GetDC( ) ); CRect rect( 0, 0, 50, 50 ); CPen BlackPen( PS_SOLID, 3, RGB( 0, 0, 0 ) ); CBrush WhitBrush( RGB( 255, 255, 255 ) ); CBrush BlackBrush( RGB( 0, 0, 0 ) ); pDC->FillRect( &rect, &WhitBrush ); pDC->SelectObject( &BlackPen ); pDC->SelectObject( &WhitBrush ); pDC->Ellipse( 5, 5, 45, 45 ); COLORREF col = Image.GetPixel( 0, 0 ); pdc2->TransparentBlt( 0, 0, 50, 50, pDC, 0, 0, 50, 50, col ); Image.SetTransparentColor( col ); image2.Save( L"c:\\icon\\maru.png" ); Image.ReleaseDC( ); image2.ReleaseDC( ); 他にも実装例があれば教えてください。 C++や画像生成に関しては経験がありません。

  • MFCで画像を表示させているのですが、透過表示する方法がわかりません。

    VC2005のMFCで画像を表示させているのですが、透過表示する方法がわかりません。 OnDraw(CDC* pDC) で、#include <atlimage.h>として、 CImage img; img.Load( "test.gif" ); CDC* pDCImg = CDC::FromHandle( img.GetDC() ); pDC->BitBlt( 60, 10, img.GetWidth(), img.GetHeight(), pDCImg, 0, 0, SRCCOPY ); img.ReleaseDC(); すればGIF画像が表示されましたが、このGIG画像は透過GIFですが そのまま表示されているので、背景が黒の場合透、明部分の白が見えて 四角い枠の画像となります。 GIF透過ファイルの場合、そのまま透過になる方法や、何か手段を用いて透過をさせたいです。

  • VC++のTextOutの再描画の仕方

    VC++6.0のMFCでプログラムを組んでいます。 OnDrawクラス内であるテキストデータを読み込んで、配列に格納しておいてその中の値がある値を超えたら、文字表示。超えていなければ文字非表示としようと思っているのですが if(w[16][m]<-700.0){ pDC->SetTextColor(RGB(0,0,0)); pDC->TextOut(20,200,"表示文字"); }else{pDC->SetTextColor(RGB(255,255,255)); pDC->TextOut(20,200,"表示文字"); } としてfor文でmを増加させていくのですが、初めの評価だけでずっと変わりません。(初め-700以下なら文字がずっと表示され、以上ならずっと白で表示されます。赤(255,0,0)にして試してみましたところずっと赤が出ました。) ネットを方々探しましたが、いまいちわからなく困っています。 わかりづらい質問かもしれませんが、よろしくお願いいたします。

  • MFCプログラミング

    MFCのダブルバッファリングを用いて画面を切り替えるプログラムを作ったのですが 画面がちらついてしまいます、どう修正すればよいか教えてください // CgraphView 描画 void CgraphView::OnDraw(CDC* pDC) { CgraphDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 CRect myRect; GetClientRect(myRect); if(background_color == 0) pDC->FillSolidRect(myRect, RGB(255, 255, 255)); else if(background_color == 1) pDC->FillSolidRect(myRect, RGB(153, 204, 255)); else pDC->FillSolidRect(myRect, RGB(255, 153, 204)); //ダブルバッファに関するコード CRect rc; GetClientRect(&rc); bkDC.CreateCompatibleDC(pDC); bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom); CBitmap Bitmap, *pOldBitmap; pOldBitmap = bkDC.SelectObject(&bkBMP); //これから、すべての描画は、裏画面bkDCにおいて行う bkDC.FillSolidRect(rc, RGB(255, 255, 255)); int x, y, sx, sy; if(draw_state == 0) { bkDC.SetTextColor(RGB(0, 0, 0)); bkDC.TextOut(400, 500, _T("Start")); sx = 128;//表示するビットマップの横の大きさ sy = 128;//表示するビットマップの縦の大きさ y = 300;//表示するビットマップの左上の頂点のy座標 x = 50; draw_school(x, y, sx, sy); x = 200; draw_health(x, y, sx, sy); x = 350; draw_environment(x, y, sx, sy); } else if(draw_state == 1) { CRect myRect; GetClientRect(myRect); pDC->FillSolidRect(myRect, RGB(255, 255, 255)); } //裏画面bkDCにおいて、すべての描画を行った後 //裏画面を表画面に送る pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY); bkDC.SelectObject(pOldBitmap); //裏画面を消去 bkBMP.DeleteObject(); bkDC.DeleteDC(); void CgraphView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 bitmap[0].LoadBitmap(IDB_BITMAP1); bitmap[1].LoadBitmap(IDB_BITMAP2); bitmap[2].LoadBitmap(IDB_BITMAP3); bitmap[3].LoadBitmap(IDB_BITMAP4); bitmap[4].LoadBitmap(IDB_BITMAP5); bitmap[5].LoadBitmap(IDB_BITMAP6); Bmp_ID = 0; //タイマーをスタート SetTimer(ID_BITMAP, TIMER_MS_BITMAP, NULL); //画面再描画のタイマーをスタートする SetTimer(ID_REDRAW, TIMER_MS_FPS, NULL); Bmp_ID = 0; } void CgraphView::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if(nIDEvent == ID_BITMAP) Bmp_ID = (Bmp_ID+1) % 2; if(nIDEvent == ID_REDRAW) InvalidateRect(NULL, FALSE); CView::OnTimer(nIDEvent); } void CgraphView::OnDestroy() { CView::OnDestroy(); // TODO: ここにメッセージ ハンドラ コードを追加します。 KillTimer(ID_BITMAP); KillTimer(ID_REDRAW); } void CgraphView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 mouse_x = point.x; mouse_y = point.y; if(draw_state == 0) { if(mouse_x > 400 && mouse_y > 500) { draw_state = 1; } } CView::OnLButtonDown(nFlags, point); } BOOL CgraphView::OnEraseBkgnd(CDC* pDC) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 return TRUE; //return CView::OnEraseBkgnd(pDC); }

  • MFCダイアログベースでのボタン背景透過方法

    VC++初心者です。 MFCダイアログベースでボタンを描画したいのですが、 そのボタンの背景を透過(透明)にしたいのです。 環境はWinXP、VSC++2010です。 OnCtrlColor()関数でSetBkMode(TRANSPARENT)や brash.CreateStockObject(NULL_BRUSH)などを実装していますが、 背景は変わりません。 ちなみに、ダイアログにはbitmap画像を貼りつけています。 ボタンはCMFCButtonを使用しているので、 CMFCButtonの変数m_mfcBtnのメンバ(プロパティ?)の m_bTransparentをTrueにしてもダメでした。 なぜ背景が透過できないのかわかりません。 ご教授宜しくお願いします。

  • リストボックスのオーナードローでInsertStringした文字列の取得

    ダイアログボックスの上にリストボックスを貼り付け、そのリストボックスを各行ごとに色を変て表示させることにトライしています。 なんとかかんとか調べて、 1.リストボックスのリソースで「Owner Draw=固定」に設定変更した。 2.そのリストボックスを持つクラスのウィンドウメッセージ    WM_DRAWITEM    WM_MEASUREITEM   にハンドラを追加した。 3.以下の様にハンドラを記述した。   void COwnerTestDlg::OnMeasureItem(int nIDCtl,       LPMEASUREITEMSTRUCT lpMeasureItemStruct)   {     lpMeasureItemStruct->itemHeight = 10/*1行の高さを設定*/;     CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);   }   void COwnerTestDlg::OnDrawItem(int nIDCtl,        LPDRAWITEMSTRUCT lpDrawItemStruct)   {     CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);     pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0,0,0)/*背景の色*/);     pDC->SetBkColor(RGB(0,0,0)/*文字の後ろの色*/);     pDC->SetTextColor(RGB(255,255,255)/*文字の色*/);     pDC->TextOut(lpDrawItemStruct->rcItem.left,        lpDrawItemStruct->rcItem.top,        (char*)lpDrawItemStruct->itemData/*行に書かれた文字列*/);   } 4. CListBox* wp = (CListBox*)GetDlgItem(IDC_LIST1);     wp->InsertString(-1,"ADDED"); とやり、うまく表示されました。 ここまでは良かったのですが、 次に、4.のところを     char wbuf[256];     strcpy(wbuf,"ADDED");     wp->InsertString(-1,wbuf); とやったら文字化け(?)の様な、ちゃんと表示してくれなくなってしまいました。何がいけないのでしょうか?

  • MFCでbitmapを背景にしてstaticテキストを透過させる方法

    MFCでbitmapを背景にしてstaticテキストを透過させる方法 VisualStadio2005 MFC ダイアログベースでプログラムを作成しています。 bitmapをPictureControlで配置し、その上にStaticControlを配置して 画像の上に文字が表示されるようにしたいのですが、 Staticの背景を透過させて、下の画像を表示されることができません。 OnCtlColor()でstaticにSetBkMode(TRANSPARENT)を設定すると、 Dialog自体の色が出てきてしまいます。 どうかご教示お願いいたします。

  • CStaticコントロールの静的イメージ描画

    はじめまして、質問させてください。 VC++ 2005 MFC で開発しております。 Picture Control(DDX CStasic型)に イメージ(外部ファイル JPG)を静的に描画させたいのですが 方法がわかりません。 お詳しい方がおられましたら、ご教授お願いいたします。 ちなみに CImageを使用して描画はできるのですが その場合、OnPaintをオーバーライドして 描画更新処理を書かないと一度だけ描画されて終わって しまうと思います。 CStaic変数にロードしたら 再度ロードされるまで ずっと描画させていたいです。 以上になります。 宜しくお願いいたします。

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

専門家に質問してみよう