そうですね、確かに質問の仕方が悪かったのかもしれませんね。
えっと、私も出来る限り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);
}
変数pDCは、どこから取得していますか?
クラスのprivete領域です。
コードはこうです。
class CTest2Dlg : public CDialog
{
private:
CDC *pDC;// ハンドル取得
void f_AddLine(CString DataStr, int LineCount, int ColLeft, int ColRight, int
CellTop);
// 構築
public:
以下省略
不良PG さんの意見は私の質問以外でも参考にさせていただいております。すごいですね!
どうやったら、上級者になれるのでしょうか?
あ、この質問は気にしないでください。
すいませんが、よろしくお願いします。
あ、すいません。
OnInitDialogの時に
pDC = GetDC(); // デバイスの取得
// フォント用デバイスコンテキスト
CFont tmpFont;
tmpFont.CreatePointFont(90,MS ゴシック,pDC);// フォントサイズは9
pDC->SelectObject(&tmpFont);
として取得しております。
質問の答えは(初心者に説明するレベルで説明してほしいという要望も含めて)
猫でもわかるプログラミングの、77-80章を見ればそのままのことが書いてあります。
このレベルが理解できないのでは、正直どうしようもありません。
過言ではありません。
ここで皆さんがレスされている内容がわからなければ問題は解決しませんから、
上記をよく読んでください。たいした分量ではありません。
今回だけの出血大サービスです
まず
>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で入手することが出来ますので、質問する前に
良く探してみてください
あら、
> pDC->EndPage();
> pDC->EndDoc();
pDC->DeleteDC();
> }
忘れ物
うーまただ・・(;;)
>//ダイアログに描画
>void CTest2Dlg::OnPaint( CDC* pDC )
>{
> f_AddLine( pDC, ... );
>}
void CTest2Dlg::OnPaint()
{
CPaintDC dc;
f_AddLine( &dc, ... );
}
皆さんありがとうございます。先が見えてきました。
何とか、印刷できるようになりました。
あとは、サイズ調整ですが、ここからは自力で出来ます。
本当にありがとうございます。(~o~)
これからは猫さんのサイトをちゃんと読むようにします。
でも、このサイト、MFCから始めた人はきつい気がします。
やっぱり、MFCに頼ってはいけないのですね・・・
しかし、がんばります。
ところで、
OnPaint() のところ以外では
>CPaintDC dc;
CDC *pDC = GetDC();
でもいいですよね・・・?
みなさんには多大な迷惑をおかけしました事をお詫び申し上げます。
>これからは猫さんのサイトをちゃんと読むようにします。
>でも、このサイト、MFCから始めた人はきつい気がします。
猫でもわかるプログラミングは、SDK向けに書かれていますので
たしかにMFCから始めた人からには、ハードルが高いと思います。
>やっぱり、MFCに頼ってはいけないのですね・・・
MFCに頼ることは、別に悪いことではありません。
MFCのクラスがどのような動作をするのかを理解して使っていれば、
こんな便利なものはありません。(たまに、バグもありますが・・)
>ところで、
>OnPaint() のところ以外では
>>CPaintDC dc;
>CDC *pDC = GetDC();
>でもいいですよね・・・?
同じ事ですので大丈夫でしょう。
これから、スキルを上げて行きますので、応援してください。
よろしくお願いします。
ところで、皆さんはどの位のペースで上達したのでしょうか?
やはり、皆さんは賢そうなので、一ヶ月ぐらいで上達したのでしょうね・・・
私は一ヶ月経っても何も解らない・・・悔しいです!
だから、頑張ります!