• ベストアンサー

テキストの画像描画について

初投稿失礼致します。 現在、VC++2003にてダイアログベースのアプリケーションを作成中です。 内容は、テキストファイルに記載されている文字をダイアログに画像として表示する、というものです。1行ずつTEXTOUTで描画していくやり方でやってみています。 現在画像表示はされるものの、テキストファイルの容量が大きくなると、ダイアログのサイズを描画サイズが上回り、表示がおかしくなる、という状態です。 これを解消するためスクロールバーを導入し、ダイアログ内に収まるようにしようと考えたのですが、関数の使い方が分からず作業が頓挫してしまいました。この内容について、どなたか解決策、代替案を思いつける方がいらっしゃいましたら、ご助力をお願い致します。 以下は画像描画に関する所について私がコーディングしたものです。 ScrollWindowEx関数について、理解ができないため、NULLが許される箇所にはNULLと代入してしまっています。 _____________________________________________________________ void COCRDiffToolDlg::OnPaint() { dc.SetBkColor(RGB(255,255,255)); int nXStart = 450; int nYStart=5; for(int i =0; i < 200;i++){   dc.TextOut(nXStart,nYStart,imgText1[i]/*テキストファイルを1行ずつ分割したもの*/);   nYStart = nYStart + 10;   ScrollWindowEx(100,600,NULL,NULL,NULL,NULL,SW_INVALIDATE); } } _____________________________________________________________

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

  • ベストアンサー
回答No.1

 こんにちは。  う~む。ダイアログ上にエディットコントロールを設置して、其れに対してテキスト文字を表示すれば、もっとイージーな感覚で達成出来るような気がします。  「CEdit MFC」  http://msdn.microsoft.com/ja-jp/library/f7yhsd2b(VS.80).aspx  如何しても描写に拘るなら、縦スクロール付きの子ウィンドウを搭載した方が楽なのでは。  その場合、確かにScrollWindowEx()が必要になると思います。

yukke33
質問者

お礼

ご助力ありがとうございました。 子ウインドウの利用と、リッチエディットを利用することで、目的としていたことを達成できました。 とても助かりました。ありがとうございました。

yukke33
質問者

補足

解答ありがとうございます。 う~ん。。。 何故描画にこだわるか、ということなのですが、 ある一部分については背景色を変えたいから、という理由があります。 また、この描画を始める前には別の画像が描画されているため、 エディットコントロールではその画像がの表示ができなくなってしまいます。 子ウインドウの搭載については、これから試してみたいと思います。 進展がありましたら、お伝えしたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

ScrollWindowExはとりあえず使わなくてもいいですし、OnPaintの中で使ってもいけません。 根本的な考え方としては、 >for(int i =0; i < 200;i++){ この部分、iを0から200まで全部回すのではなく、スクロールバーから値を読み取って、現在画面に表示したい分だけ回すのです。 例えば、スクロールさせた結果、10行目から20行目までを表示する場合は、 for(int i =10; i < 20;i++){ と、なります。 スクロールバーの値は、OnHScrollとかで取得して、適当なメンバ変数にでも保存しておくといいでしょう。

yukke33
質問者

お礼

ありがとうございます。 ScrollWindowExの特性を初めて知りました。 今後の参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

    非クライアント領域に文字を書こうとしました。 以下の(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

  • 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表示 のようになります。 これは仕様なのでしょうか? それとも何かコードレベルで解決できるのでしょうか? お詳しい方がおりましたらご教授お願いいたします。 よろしくお願いいたします。

  • クライアント領域をCBitmapに取り込みたい

    VC6.0MFCで クライアント領域(みたまま)を CBitmapに取り込みたいのですがどうすればよいのでしょうか? ためしにダイアログの領域をクリップボードに取り込むコード OnPaint書いたのですが真っ黒の画像しか取り込めていませんでした。 根本的に使うAPIが違うのでしょうか? void CCaptureDlg::OnPaint() {  CPaintDC dc(this); // 描画用のデバイス コンテキスト  CRect cr;  GetClientRect(&cr);  dc.TextOut(0,0,"テスト");  CDC* pDC = new CDC();  pDC->CreateCompatibleDC(&dc);  CBitmap img;  img.CreateCompatibleBitmap(pDC, cr.Width(), cr.Height());  OpenClipboard();  ::EmptyClipboard();  ::SetClipboardData(CF_BITMAP, img.GetSafeHandle());  ::CloseClipboard();  pDC->DeleteDC();  delete pDC;  CDialog::OnPaint(); }

  • 16ビットグレースケールの画像を描画させたい。

    16ビットグレースケールの画像を描画させたい。 こんにちは。 Photoshopで16ビットグレースケールのPNGファイルを作り、 それをlibpngを使って読み込むプログラムを書きました。 16ビットRGBではなくグレースケールです。1ピクセルの 情報は0~65535です。 640*480の画像で例えるならば、640*480*2の大きさで CreateDIBSection関数を使って作成しているだけなので Bitblt関数を使って描画させようとしても、16ビットRGB として描画しようとするので正しく表示されません。 これを正しく描画させる方法はありませんでょうか? さらにLineToやRectangle等で編集もしたいのですが、 可能でしょうか?

  • 描画について

    今DirectXでゲームを作ろうとしてるものですが、描画しようと思い打ったのですが位置が思い通りにならない(描画が範囲を下回っている)描画されなくて困っています。ソースはこれです。 HRESULT Render(void) { g_pD3DDevice->Clear(0, NULL,NULL, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // シーンの描画開始 if (SUCCEEDED(g_pD3DDevice->BeginScene())) { // スプライトの描画開始(アルファ・ブレンディング有効&デバイス状態を保存も復元もしない) pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE); // シーンの描画(2D画像の描画) RECT SrcRect = { 0,0,640,480 }; // テクスチャ内でスプライトに使う範囲(0,0)-(512,64) D3DXVECTOR3 Center(320,240,0); // スプライト内の中心の位置(256,32,0) D3DXVECTOR3 Position(320,240,0); // スプライトを表示する位置(0,0,0)+(320,240,0) static int alpha=0; pSprite->Draw(pTexture.m_texture, // スプライトに使うテクスチャ &SrcRect, // 描画範囲 &Center, // スプライト内の中心の位置 &Position, // スプライトを表示する位置 D3DCOLOR_ARGB(alpha>255?511-alpha:alpha,255,255,255)); //alpha++; alpha &= 0x1FF; //pTexture.m_colorKey); // スプライトの描画終了 pSprite->End(); // シーンの描画終了 g_pD3DDevice->EndScene(); } // シーンの表示 return g_pD3DDevice->Present(NULL, NULL, NULL, NULL); }どうしたらきちんとした位置に描画できるのでしょうか。

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • DrawTextでの描画

    お世話になります。 現在開発中のアプリケーションにて行き詰ってしまった箇所が あったためご質問させていただきました。 Visual Studio2005にてダイアログベースのアプリケーションを作成しており、オリジナルのCStatic派生のクラスCSampleStaticクラスを作成します。 このCSampleStaticクラスはメインダイアログでのサブクラスにした際に PreSubclassWindow() ないでタイマーイベントを発生させます。タイマーイベントの内容は1秒ごとにタイマーを呼び、ランダムの値をそのCStaticの値に代入し、ダイアログ上に表示させる動作をします。 その際の処理のプログラムは以下のように作成しています CString str;//メンバー変数 //メインダイアログにてサブクラス化した際に呼ばれる CSampleStatic::PreSubclassWindow() { SetTimer(1,1000,NULL);//1秒毎に } CSampleStatic::OnTimer(UINT_PTR nIDEvent) { str.Format(_T("%d"),rand()%200); //1~199の乱数をstrに代入  Invalidate();           //OnPaint()を呼ぶ  CStatic::OnTimer(nIDEvent); } CSampleStatic::OnPaint() { CPaintDC dc(this); CFont MyFont; MyFont.CreateFont(-----); //フォント設定 CDC* myDC = GetDC(); CRect Myrect; GetClientRect(&Myrect); myDC->SelectObject(&Myrect); myDC->DrawText(str,-1,&Myrect,DT_CENTER); //strを表示 ReleaseDC(myDC); MyFont.DeleteObject(); } というプログラムを作成しているのですが、この方法でのダイアログへの文字の表示では、たとえば90が表示され、次に100が表示されるのであればいいのですが、100のあとに90が表示された時に100の上にそのまま90が表示されてしまい、うまく表示できません。 再描画のときに、上書きではなく、前回の数値を消去してから新たな数値を表示できればいいとは思うのですが、やり方がわからず、ご意見をいただければと思い質問させていただきました。 どうか宜しくお願いいたします。 開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • MFCでネガポジ変換

    以下のプログラムはネガポジ変換をするプログラムです。MFCで最初に作られるプロジェクトのCChildView.cppのOnPaint関数に実装しました。デバッグするとウィンドウ全体が真っ黒になるはずです。が、なぜか添付のファイルのように白黒の縞模様になってしまします。ちなみに私はVC++2008を使っています。知人にも相談して、VC++2005で全く同じプログラムで試してもらいましたが、そちらではウィンドウが真っ黒になって成功しました。違いはおそらく2008か2005かということだけ何のです。 何か原因をご存知の方がいらしたら教えてもらえないでしょうか。 void CChildView::OnPaint() { CPaintDC dc(this); // 描画のデバイス コンテキスト int w = dc.GetDeviceCaps(HORZRES); //DCの幅を得る int h = dc.GetDeviceCaps(VERTRES); //DCの高さを得る int i, j; for(j=0; j<h; j++) { for(i=0; i<w; i++) { //DCの(i,j)位置から色を得る COLORREF c = dc.GetPixel(i, j); //色を取得 if(c!=CLR_INVALID) { //反転したr,g,b値を取得 int r = 255- GetRValue(c); int g = 255- GetGValue(c); int b = 255- GetBValue(c); c = RGB(r, g, b); //その画素を置く dc.SetPixel(i, j, 0); } } } }

  • WINAPI 他のウインドウを重ねると画像やテキストが消える

    C++とWINAPIで、ウインドウを作成し、テキストや画像を表示しています。 このウインドウに他のウインドウを重ねて、再度、このウインドウを表示すると画像やテキストが消えてしまいます。 case WM_PAINT: BitBlt( hbtn0DC, 0, 0, 40, 40, hbtn0bmpDC, 0, 0, SRCCOPY ); return 0; 再描画するタイミングで表示するようにしています。 他のウインドウが被っても消えないようにする方法を教えてください。 もしくは、 他のウインドウが被っても画像が消えないようにする処理を説明しているページをどこかで見たような気がするのですが、見つかりません。 ご存知でしたら教えてください。

  • プログラムの実行の順番(描画)

    メソッドの途中でテキストファイルを開いて読み取り、 そのテキストファイルの情報を整理して、整理した情報を元に 描画を更新していくプログラムを書いているのですが、 テキストファイルから一行読み込むごとに repaintは呼び出されているはずなのに、 テキストファイルを全行読み取ってから 描画されているようです。 どのようにしたら、一行ごとに順次再描画できるようになるでしょうか。 また、描画ごとに全ての機能を一時ストップさせたいのですが(動きが速いと図の移り変わりがわかりにくいと思うため)、 スレッドを使わないと無理なのでしょうか。

    • ベストアンサー
    • Java