void CReusuView::OnFileOpen()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CReusuDoc* pDoc = GetDocument();
CFileDialog dlg(TRUE,bmp,*bmp);
if(dlg.DoModal()==IDOK){
pDoc->m_ga =dlg.GetPathName();
}
}
として
void CReusuView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CReusuDoc* pDoc = GetDocument();
m_bitmap.Attach(
LoadImage(AfxGetInstanceHandle(),
pDoc->m_ga,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE));
}
したのですがエラーはでなくなったのですが開くをやっても画像がでてきません
OnInitialUpdate() がどのような関数であるかご存知ですか?
ビューが表示される直前によばれる関数ですよね?
ビューが表示される直前によばれる関数ですよね?
OnFileOpen/OnInitialUpdateの両方にbreak-pointを仕掛け、
どちらが先に呼ばれるか確認したほうがいい。
# いずれにせよ やりかたがヘン
# すくなくとも OnInitialUpdateでやるのはすごくヘン
void CReusuView::OnDraw(CDC* pDC)
{
CReusuDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
m_bitmap.Attach(
LoadImage(AfxGetInstanceHandle(),
pDoc->m_ga,IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION | LR_LOADFROMFILE));
pDC->DrawState(0,48,&m_bitmap,DSS_NORMAL);
}
void CReusuView::OnFileOpen()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CReusuDoc* pDoc = GetDocument();
CFileDialog dlg(TRUE,bmp,*bmp);
if(dlg.DoModal()==IDOK){
pDoc->m_ga =dlg.GetPathName();
}
}
としました
やはり先ほどと同じ結果になりました
>OnFileOpen/OnInitialUpdateの両方にbreak-pointを仕掛け、
>どちらが先に呼ばれるか確認したほうがいい。
確認したところOnFileOpenのほうが先によばれていました
以下のことを確認してみてください。
・OnFileOpenでファイルを選択した後、pDoc->m_gaに期待した値が入っているか。
・画像をロードする部分でpDoc->m_gaに期待した値が入っているか。
・画像のロードは成功しているか。
・OnFileOpenで操作しているpDocとOnDrawで操作しているpDocは、同じものか。
また、確認した所で、期待通りでなかった場合、
なぜ期待通りにならないのか分析/予想をお聞かせください。
開くをしたあとにpDoc->m_gaには値は入っていないみたいです
そして開くしウインドウサイズなどさわると
Debug Assertion Failed
Program
File windi.cpp
Line 1120
というエラーが起こります。
考えたところ
開くの処理がダメのようなのですが
間違った書き方をしてるのでしょうか
ご意見お願いします。
上のプログラムでは
パスの取得、画像表示ができましたが
ウインドウのサイズをかえると
Debug Assertion Failed
Program
File windi.cpp
Line 1120
がでました
…だから、回答者はあなたと違って、テレパシーは使えないんだけどなぁ
「今私が書いてる、あるプログラムの1120行目でエラーが出ます。教えて下さい。」
という情報で、あなたは何かわかるのですか?
> File windi.cpp
> Line 1120
コピペミスでwingdi.cppではないかと……
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
ASSERT(m_hObject == NULL); // only attach once, detach on destroy
if (hObject == NULL)
return FALSE;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hObject = hObject, this);
return TRUE;
}
の最初のASSERTがwingdi.cppの1120行目ですが。
コピペミスというか、手書きミスですね。
つーか、肝心な情報を確認もせずに間違えたまま書き込む感覚が理解できない。
回答欲しくないんじゃなかろうか…
> ASSERT(m_hObject == NULL); // only attach once, detach on destroy
まあ、まともにコメントすると、only attach onceのとおりかと。
Windowのサイズを変えるだけじゃなくて、Windowを動かしたり、上に別のWindowを重ねて
からどかしてりしても、Debug Assertion Failedとなるでしょうね。
OnDrawがどういう時に呼ばれるのかを勉強して下さい。
そこで毎回ビットマップのロード、GDIオブジェクトへのAttachをしているのが問題。
プログラミングの入門書とか参考書は、一冊持っていればOKというわけではなくて
自分が持っている本では足りないのであれば、他に本を買い足すとかしないと
とても追いつかないですよ。
特に独学で何とかしようとしているのであれば、
手元にいつも置いておけてすぐに見ることが出来る本が何冊も必要です。
それぞれの本によって得意分野が異なりますからね。
持っている本に載っていないのであれば、載っている本を探しましょうよ。
本を探すのにネットを使ってもいいわけですしね。
どうも断片的な知識だけでプログラミングを進めようとしているみたいなので、
知識をきちんと整理しないと先に進めないと思います。
MFCを使ったフレームワークでどういう実装していくのかを書いてある本が
良いんですけれどね。
MFCプログラミングの入門書って何か良いのありましたかねぇ。
私は実際にプログラミングしながら覚えたので、
体系的に書いてある本を読んだ事が無くて
よく知らないんです。
最近の本でよい物があれば、教えてあげた方が良いかも。
すいませんでした 画像表示することはできました