罫線を印刷したいのですが・・・

[戻る]
クリリン 2002/02/20(水) 21:55:52
どうも、クリリンです。
エクセルやワードのような、罫線のついた帳票を印刷したいのですが、どうしたらよいのでしょ
うか?

内容は、罫線付きの表内に文字列を入れて、データ行ごとに表も増やし、最終的に印刷といった
感じです。イメージとしてはエクセルの簡易印刷みたいなものなのですが・・・

印刷例として、こんな感じです。
  _________________
  |あああああ|いいいいい|ううううう|
  |―――――|―――――|―――――|
  |11111|22222|33333|
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
どなたか、印刷ツールを使わないで印刷する方法を教えてください。
よろしく御願いします。

TAKA 2002/02/21(木) 12:01:53
こんな感じでできるはず・・・。
かなり省略していますが、後は通常の描画とかわらないので
それと同じようにすればいいです。

void  印刷クラス::線引き関数( 
                             CDC *pPrintDC,    // デバイスコンテキスト
                             CRect crctLabel,  // 描画用領域変数
                             )
{

    // ペン作成   CPen 
    // ペン選択   pPrintDC->SelectObject

    // 線描画     pPrintDC->MoveTo
    //            pPrintDC->LineTo

    // ペン開放

    return ;    
}

[E-Mail] 2002/02/21(木) 16:28:52
いんちき手段ですが、「罫線文字を使う」って手もあります。

┌┐こーゆー文字です。
└┘

クリリン 2002/02/21(木) 17:03:06
回答ありがとうございます。
難しい・・・

TAKA 2002/02/21(木) 17:32:36
一度覚えればというか、線を引く関数さえできれば
後は簡単ですよ。

ダイアログに描画してみて、出来たものを
プリンタデバイスに置き換えてあげましょう。

がんばって下さい (^o^)

EIJI 2002/02/21(木) 17:43:44
印刷するときは解像度の違いに気をつけてください。
なにもしないで画面に描画する感覚でプリンタデバイスに描画すると
普通はすごーく小さい絵になります。

クリリン 2002/02/21(木) 18:20:35
ん、ダイアログに描画してからそれをプリンタデバイスに送るということではないのですか?

EIJI 2002/02/21(木) 19:06:01
「ダイアログに描画してからそれをプリンタデバイスに送る」の意味がよくわかりませんが、
例えば、ダイアログ(ウィンドウ)上に表を描画する関数が下のようにあったとします。

void CDlgHoge::DrawTable( CDC* pDC )
{
    CRect r(0,0,600,600);
    pDC->Rectangle(&r);
}

この関数を印刷するときにも使うとすると、プリンタが600dpiの場合は1インチ(2.54センチ)
の四角形になります。プリンタが400dpiだったら1.5インチの四角形になります。
つまり、プリンタの解像度によって印刷したときの大きさが変わるということです。
実際に印刷してみるとわかりやすいと思います。

クリリン 2002/02/26(火) 16:44:07
どうもです。
>ダイアログに描画してみて、出来たものをプリンタデバイスに置き換えてあげましょう。
のところで、エクセルみたいにダイアログに描画は出来たのですが、プリンタデバイスに置き換
える方法がわかりません。

pDC->Rectangle(&r);
pDC->TextOut(TextLeft, TextTop, DataStr);
 ↑
ここをHDCに置き換えるという意味でしょうか?

よろしくお願いします。

不良PG 2002/02/26(火) 16:47:49
考え方は
「テキストを印刷する時のフォントの変更方法を教えてください」
の時と同じです。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200202/02020094.txt

クリリン 2002/02/26(火) 17:21:52
どうも、関連付けが今ひとつピンと来ません。
もう少しがんばってみます。

クリリン 2002/02/26(火) 17:24:14
既にダイアログに描画された物は印刷できないと云うことでしょうか?

TAKA 2002/02/26(火) 17:36:08
> 既にダイアログに描画された物は印刷できないと云うことでしょうか?
クリップボード等ですれば可能だとおもいますが・・・

ダイアログに書いたのと同じ要領で書いたほうが簡単だと思います。
線等を書くのにはEIJIさんの指摘どおり縮尺だけ気をつけないといけません。

始めに縮尺率だけ求めて、ダイアログに書いたのと同じ要領で
縮尺率をかけると、同じものが印字されます。

クリリン 2002/02/26(火) 18:02:36
あの・・・初心者を言い訳にしたくないのですが、話が飛びすぎて何をどうしたらうまくいくの
か解らなくなってきました。
ただ、単純に、罫線のついた帳票を印刷したいのです。
みなさんはお詳しいので、このスレッドの内容はすぐ理解できると思いますが、
できれば、ちょっとしたソースを見せていただけないでしょうか?
私たち多くの初心者はおそらく皆さんの通り過ぎた道が知りたいのです。
こういうと、「C++を勉強しろ!」とか「HELPを見ろ!」等と言いたくなると思います。
最もな意見です。ですが、解りづらいから、この掲示板を頼りにしているので、どうか、暖かい
意見をお願いします。
生意気な事を申し上げますが、初心者代表?として、よろしくお願いします。
管理者様、ならびにご意見をくださる皆様方、本当にすいません。
でも、これからもよろしくお願いします。

不良PG 2002/02/26(火) 18:17:06
>あの・・・初心者を言い訳にしたくないのですが、話が飛びすぎて何をどうしたらうまくいく>か解らなくなってきました。
クリリンさんが何がわからないかを具体的に(範囲を絞って)質問しないからではないでしょう
か?
あと、こういう記述をしてうまくいかなくて困っているとか・・

>ただ、単純に、罫線のついた帳票を印刷したいのです。
>みなさんはお詳しいので、このスレッドの内容はすぐ理解できると思いますが、
>できれば、ちょっとしたソースを見せていただけないでしょうか?

でしたらソフト会社に依頼してください(悪)

>私たち多くの初心者はおそらく皆さんの通り過ぎた道が知りたいのです。
>こういうと、「C++を勉強しろ!」とか「HELPを見ろ!」等と言いたくなると思います。
>最もな意見です。ですが、解りづらいから、この掲示板を頼りにしているので、どうか、暖か>意見をお願いします。
私も勉強しろと言うこともありますが・・、基本文法を学んだりHELPを見るのは、初心者とし
ては、当然ではないでしょうか・・(初心者で無くてもHELPは見ます)
その上で、解らないとか、HELPで見つけられない場合に質問するのがこういう場では、無いで
しょうか?

>生意気な事を申し上げますが、初心者代表?として、よろしくお願いします。
>管理者様、ならびにご意見をくださる皆様方、本当にすいません。
>でも、これからもよろしくお願いします。

クリリン 2002/02/26(火) 18:37:39
そうですね、確かに質問の仕方が悪かったのかもしれませんね。
えっと、私も出来る限りHELPは見ています。
しかし、焦っているせいなのか、それとも私が馬鹿なのかはともかくとして、
とにかく、生意気言ってすいません。m(__)m

で、質問をさせていただきます。
現在、ダイアログに「CRect」を使って罫線を引き、枠内に「pDC->TextOut(...)」を使って表
示をすることが出来ました。
ですが、どうしても、「HDC」と「CDC」が結びすかないのです。
「CDC *pDC = CDC::FromHandle(hDC);」を以前フォントの時に教えていただいていたので、
なんとなくこれを使用するのだろうとは思っていましたが、どのタイミングで使用するのかわか
らないのです。
どうか、そのあたりをご教授ください。よろしくお願いします。


もしかしたら、ソースの書き方に問題があるのかも知れないので、参考までに、ダイアログ描画
のソースを記述しておきます。

 DataStrは枠内に描画する内容です。
 LineCountは行のカウントです。
 ColLeft、ColRight、CellTopはそれぞれ、罫線の左側、右側、上の位置です。また、
CellTopが「0」の時、表型罫線、「0」以外は単独罫線です。

const CELL_TOP  = 100; // 表の最上座標
const T_SPACE   =   5; // テキストから罫線までの隙間

// 描画処理
void CTest2Dlg::f_AddLine(CString DataStr, int LineCount, int ColLeft, int 
ColRight, int CellTop)
{
  // 描画関連の定義
  CSize size;               // サイズのクラス定義
  int   TextHeightInPixels; // テキストの縦幅(ピクセル単位)
  int   TextWidthInPixels;  // テキストの横幅(ピクセル単位)
  int   TextLeft;           // テキストの左座標
  int   TextTop;            // テキストの上座標
  int   ImageLeft;          // 罫線の左座標
  int   ImageTop;           // 罫線の上座標
  int   ImageRight;         // 罫線の右座標
  int   ImageBottom;        // 罫線の下座標
  int   ImageSpace;         // テキストから罫線のピクセル単位も含んだ隙間
  
  // 情報取得
  size = pDC->GetTextExtent(DataStr);
  TextHeightInPixels = (int)size.cy;
  TextWidthInPixels  = (int)size.cx;
  ImageSpace  = T_SPACE + 3;
  // 罫線の座標設定
  ImageLeft   = ColLeft;
  ImageRight  = ColRight;
  if( LineCount == 0 ){
    // 先頭行
    if( CellTop == 0 )
      // ヘッダーでは無い時
      ImageTop = CELL_TOP;
    else
      // ヘッダーで有る時
      ImageTop = CellTop;
  }
  else{
    // 2行目以降
    if( CellTop == 0 )
      // ヘッダーでは無い時
      ImageTop = CELL_TOP + LineCount * (TextHeightInPixels + ImageSpace);
    else
      // ヘッダーで有る時
      ImageTop = CellTop  + LineCount * (TextHeightInPixels + ImageSpace);
  }
  ImageBottom = ImageTop +  TextHeightInPixels + ImageSpace + 1;
  
  // 罫線設定
  CRect r;
  r.left    = ImageLeft;
  r.top     = ImageTop;
  r.right   = ImageRight;
  r.bottom  = ImageBottom;
  // 中身表示
  if(CellTop == 0){ // ヘッダーチェック
    // ヘッダーでは無い時
    pDC->Rectangle(&r); // 罫線表示
    TextLeft = ImageLeft + (ImageRight - ImageLeft - TextWidthInPixels) / 2; // 
中央表示
  }   else{
    // ヘッダーで有る時
    pDC->Rectangle(&r); // 罫線表示
    TextLeft  = ImageLeft + T_SPACE; // 左表示
  }
  TextTop   = ImageTop + T_SPACE;
  pDC->TextOut(TextLeft, TextTop, DataStr);
}

不良PG 2002/02/26(火) 18:47:50
変数pDCは、どこから取得していますか?

クリリン 2002/02/26(火) 18:55:04
クラスのprivete領域です。

コードはこうです。
class CTest2Dlg : public CDialog
{
private:
  CDC *pDC;// ハンドル取得  
  void f_AddLine(CString DataStr, int LineCount, int ColLeft, int ColRight, int 
CellTop);
// 構築
public:
以下省略

不良PG さんの意見は私の質問以外でも参考にさせていただいております。すごいですね!
どうやったら、上級者になれるのでしょうか?
あ、この質問は気にしないでください。

すいませんが、よろしくお願いします。

クリリン 2002/02/26(火) 19:08:53
あ、すいません。

OnInitDialogの時に
  pDC = GetDC(); // デバイスの取得
  // フォント用デバイスコンテキスト
  CFont tmpFont;
  tmpFont.CreatePointFont(90,"MS ゴシック",pDC);// フォントサイズは9
  pDC->SelectObject(&tmpFont);
として取得しております。

いもちぃ 2002/02/26(火) 19:28:08
質問の答えは(初心者に説明するレベルで説明してほしいという要望も含めて)
猫でもわかるプログラミングの、77-80章を見ればそのままのことが書いてあります。
このレベルが理解できないのでは、正直どうしようもありません。
過言ではありません。

ここで皆さんがレスされている内容がわからなければ問題は解決しませんから、
上記をよく読んでください。たいした分量ではありません。

不良PG 2002/02/26(火) 19:36:25
今回だけの出血大サービスです

まず
>CDC *pDC;// ハンドル取得  
>void f_AddLine(CString DataStr, int LineCount, int ColLeft, int ColRight, int 
void f_AddLine( CDC *pDC, CString DataStr, int LineCount, int ColLeft, int 

このようにしてf_AddLineという関数を描画する関数とする

//ダイアログに描画
void CTest2Dlg::OnPaint( CDC* pDC )
{
   f_AddLine( pDC, ... );
}

//プリンタに描画
{
  CPrintDialog dlgPrint(FALSE,PD_ALLPAGES,this);
  
  if( IDOK == dlgPrint.DoModal() )
  {
    HDC hDC = dlgPrint.GetPrinterDC();
    CDC* pDC = CDC::FromHandle( hDC );
    DOCINFO di;
    ::memset(&di, 0, sizeof(DOCINFO));
    di.cbSize = sizeof(DOCINFO);
    di.lpszDocName = _T("Test");    
    pDC->StartDoc(&di);
    pDC->StartPage();
    f_AddLine( pDC, ... );
    pDC->EndPage();
    pDC->EndDoc();
  }
}
参考: http://www.kumei.ne.jp/c_lang/sdk/sdk_77.htm


>不良PG さんの意見は私の質問以外でも参考にさせていただいております。すごいですね!
>どうやったら、上級者になれるのでしょうか?
>あ、この質問は気にしないでください。
あの私は上級者のレベルでは、ありません。
ただ、プロの(お金を貰っている)プログラマということです。
このラウンジで書き込みながら少しでも自分のスキルをあげていこうと思って書いています。
いままで、質問に答えた内容は、十分WebやHELPで入手することが出来ますので、質問する前に
良く探してみてください

不良PG 2002/02/26(火) 19:39:23
あら、
>   pDC->EndPage();
>   pDC->EndDoc();
    pDC->DeleteDC();
> }
忘れ物

不良PG 2002/02/26(火) 19:48:51
うーまただ・・(;;)
>//ダイアログに描画
>void CTest2Dlg::OnPaint( CDC* pDC )
>{
>   f_AddLine( pDC, ... );
>}

void CTest2Dlg::OnPaint()
{
   CPaintDC dc;
   f_AddLine( &dc, ... );
}

クリリン 2002/02/26(火) 20:24:33
[[解決]]
皆さんありがとうございます。先が見えてきました。
何とか、印刷できるようになりました。
あとは、サイズ調整ですが、ここからは自力で出来ます。
本当にありがとうございます。(~o~)

これからは猫さんのサイトをちゃんと読むようにします。
でも、このサイト、MFCから始めた人はきつい気がします。
やっぱり、MFCに頼ってはいけないのですね・・・
しかし、がんばります。

ところで、
OnPaint() のところ以外では
>CPaintDC dc;
CDC *pDC = GetDC();
でもいいですよね・・・?

みなさんには多大な迷惑をおかけしました事をお詫び申し上げます。

不良PG 2002/02/26(火) 20:51:18
>これからは猫さんのサイトをちゃんと読むようにします。
>でも、このサイト、MFCから始めた人はきつい気がします。
猫でもわかるプログラミングは、SDK向けに書かれていますので
たしかにMFCから始めた人からには、ハードルが高いと思います。

>やっぱり、MFCに頼ってはいけないのですね・・・
MFCに頼ることは、別に悪いことではありません。
MFCのクラスがどのような動作をするのかを理解して使っていれば、
こんな便利なものはありません。(たまに、バグもありますが・・)

>ところで、
>OnPaint() のところ以外では
>>CPaintDC dc;
>CDC *pDC = GetDC();
>でもいいですよね・・・?
同じ事ですので大丈夫でしょう。

クリリン 2002/02/26(火) 21:10:49
これから、スキルを上げて行きますので、応援してください。
よろしくお願いします。

ところで、皆さんはどの位のペースで上達したのでしょうか?
やはり、皆さんは賢そうなので、一ヶ月ぐらいで上達したのでしょうね・・・

私は一ヶ月経っても何も解らない・・・悔しいです!
だから、頑張ります!

古いスレッドには追加発言できません。