はじめまして、ゼンと言います。
VC++でMFCを使って、リソースから読み込んだBMPをビュー上に表示させ、BMP上
に円や新たなBMP画像を描画し、それを印刷するシステムを作成しているのですが、MF
Cの経験がなくて悩んでいます。
環境はWinXP,VC6,MFC,SDI(CView)で作成しています。
BMP上に円を描画することは出来るのですが、それを印刷しても、
もとのBMP画像しか印刷されません。
プログラムは以下のようになっています。
void CMap112View::OnDraw(CDC* pDC)
{
CMap112Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
// 画像の表示
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmap(IDB_BITMAP1);
myDC.CreateCompatibleDC(pDC);
CBitmap* oldBMP=myDC.SelectObject(&myBMP);
pDC->BitBlt(5,25, 700, 755, &myDC, 0, 0, SRCCOPY);
myDC.SelectObject(oldBMP);
}
・
・
・
void CMap112View::OnButton1()
{
// 選択画面の出力
MyDialog1 myDL;
myDL.DoModal();
// 円の表示
CClientDC dc(this);
CPen myPen,*oldPEN;
myPen.CreatePen(PS_SOLID, 4, RGB(255, 0, 0));
oldPEN = dc.SelectObject(&myPen);
dc.SelectObject(&myPen);
dc.SelectStockObject(NULL_BRUSH);
dc.Ellipse(700, 600, 500, 500);
dc.SelectStockObject(BLACK_PEN);
}
すいませんが、よろしくお願いします。
この作りでは、ボタンを押した後にウィンドウを別のウィンドウで隠すと、
円が表示されませんよね。以下の例のようにしてください。
void CMap112View::OnButton1()
{
m_Flag = TRUE; // メンバ変数。初期化しておく。
Invalidate();
}
void CMap112View::OnDraw(CDC* pDC)
{
...
// 画像の表示
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmap(IDB_BITMAP1);
//
if (m_Flag) {
// 円の表示
}
さっそくの御返事ありがとうございました。
実行してみたのですが、やはりもとのBMP画像しか印刷されません。
void CMap112View::OnDraw(CDC* pDC)
{
CMap112Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
// 大阪地図の表示
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmap(IDB_BITMAP1);
myDC.CreateCompatibleDC(pDC);
CBitmap* oldBMP=myDC.SelectObject(&myBMP);
pDC->BitBlt(5,25, 700, 755, &myDC, 0, 0, SRCCOPY);
myDC.SelectObject(oldBMP);
CClientDC dc(this);
CPen myPen,*oldPEN;
myPen.CreatePen(PS_SOLID, 4, RGB(255, 0, 0));
oldPEN = dc.SelectObject(&myPen);
dc.SelectObject(&myPen);
dc.SelectStockObject(NULL_BRUSH);
dc.Ellipse(700, 600, 500, 500);
dc.SelectStockObject(BLACK_PEN);
}
と書いてももとのBMP画像しか印刷されません。
ビュー上にはきちっと表示されているのですが・・・。
OnDrawの引数のpDCに描かないと。
あと、説明不足で申し訳なかったのですが、
ボタンを押した後に新しいウィンドウを呼びだし、円を描く位置を選択した後、
その情報がCViewに戻ってきてBMP上に円を描くようにしたいのですが。
ちなみに、新しいウィンドウは、円を描く位置を選択した後、
EndDialog(IDC_BUTTON1);
を用いて消すようにしています。
void CMap112View::OnButton1()
{
//円の位置を選択する画面を表示
MyDialog1 myDL;
myDL.DoModal();
CClientDC dc(this);
CPen myPen,*oldPEN;
myPen.CreatePen(PS_SOLID, 4, RGB(255, 0, 0));
oldPEN = dc.SelectObject(&myPen);
dc.SelectObject(&myPen);
dc.SelectStockObject(NULL_BRUSH);
switch (myDL.ss) {
case 1:
dc.Ellipse(700, 600, 500, 500);
break;
case 2:
dc.Ellipse(275, 275, 400, 400);
break;
case 3:
dc.Ellipse(275, 275, 350, 350);
CWnd* GetDlgItem;
break;
case 4:
dc.Ellipse(200, 200, 400, 400);
break;
case 5:
dc.Ellipse(700, 600, 500, 500);
break;
case 6:
dc.Ellipse(400, 100, 500, 500);
break;
}
dc.SelectStockObject(BLACK_PEN);
}
これじゃ、駄目なの?
void CMap112View::OnButton1()
{
m_Flag = TRUE; // メンバ変数。初期化しておく。
MyDialog1 myDL;
myDL.DoModal();
m_ss = myDL.ss;
Invalidate();
}
void CMap112View::OnDraw(CDC* pDC)
{
...
// 画像の表示
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmap(IDB_BITMAP1);
//
if (m_Flag) {
// 円の表示
switch (m_ss) {
}
}
# pDCに変更して印刷できたかどうかをまず書いてほしかった。
>pDCに変更して印刷できたかどうかをまず書いてほしかった。
pDCに変更して印刷できました。
すいません。大丈夫でした。
こちらのミスです。。
すっかかり勘違いをしていました。
振り返ってみるとすっごく、つまらない箇所でつまずいていたみたいですね。
そんなことにも丁寧に受け答えして頂き、どうも有難うございましたm(_ _)m