• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ドキュメントビューの扱い)

ドキュメントビューの扱いとDYNAMIC_DOWNCASTについて

MunyaMunyaの回答

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

ご参考になるかどうかわかりませんが?

参考URL:
http://members.fortunecity.com/hirof/mfc/08/08.html
uyama33
質問者

お礼

ありがとうございます。 どうも、 最適化のところを実行速度にすると0になり、 プログラムサイズにすると、15のままです。 原因は他でしょう。 さらに調べてみます。

関連するQ&A

  • MSHTMLにまつわる領域の確保、解放

    C++BuilderXE2です。vc++2010でも同様と思います。 下記のコード(抜粋)でも曲がりなりにも動くようなのですが、pDoc,pBody,strContent で使用する領域の確保、解放が問題ないのか疑問です。 pBody,strContentはpDocの一部を返すだけならば、pDocが確保されておれば、確保は不要となるのですが。 然らばpDocはDocument->QueryInterfaceで確保されているのでしょうか。 これらの関係で、必要十分な記述を教えて下さい。 なお、これらのIEにまつわる操作はMSHTMLというらしいですが、この元となる仕様などの情報場所はわかりませんか。 void TForm1::gethtml(void) { IHTMLDocument2* pDoc; IHTMLElement* pBody; BSTR strContent; if(CppWebBrowser1->Document==NULL) return; if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc))) { pDoc->get_body(&pBody); pBody->get_innerHTML(&strContent); pDoc->close(); pDoc->Release(); Memo1->Lines->Add(AnsiStr(strContent)); // strContentの処理を代表したもの。 } }

  • IEコンポーネント(CWebBrowser2)を編集モードにする方法(VC++6.0)

    MFCAppウィザードで作ったSDIのプログラムで IEコンポーネント(CWebBrowser2)をフォームに表示し それを編集モードにしたいと思っています。 リソースエディタでフォームにコントロールを貼り付けています。 http://www.nitoyon.com/vc/tips/ie_component.htm こちらを参考に、IWebBrowser2のポインタを取得し そこからIHTMLDocument2を取ってデザインモードに したいのですが、うまくIWebBrowser2のポインタを 取得することが出来ません。 CWnd* pIE = (CWnd *)GetDlgItem(IDC_EXPLORER1); if (pIE == NULL) return; // コントロールのハンドルを得る HWND hWnd = pIE->GetSafeHwnd(); // 使えるかどうかチェック if (hWnd != NULL && ::IsWindow(hWnd) != 0) { CComPtr<IUnknown> punkIE; if (AtlAxGetControl(hWnd, &punkIE) == S_OK){//ここで失敗する CComQIPtr<IWebBrowser2> pWB2 = punkIE; if(pWB2 != NULL){ CComPtr<IDispatch> pDisp ; pWB2->get_Document( &pDisp) ; CComQIPtr<IHTMLDocument2> pDoc = pDisp ; pDoc->put_designMode(L"On"); } } }

  • 印刷中に強制終了

    VS2008 C++、Win7Pro 上記環境でソフトを開発しています。 あるプログラム(リリースモード)で印刷中に強制終了し、そのままデバッグ(VS Just-In-Timeデバッガ)すると SetViewportOrg内でthisポインタがNULLの状態で停止します。 発生頻度は100%ではなく、5%から30%程度といったところです。 停止するところは必ず上記SetViewportOrg内で、thisポインタがNULLとなっています。 デバッグモードではこの症状は発生しません。 プリンタは3機種試しましたが、いずれでも発生状況は変わりません。 何かアドバイスをいただけたら助かります。

  • 条件分の際のnullデータの扱いについて

    環境:Oracle9i 9.2.0 テーブル(M_SYOHIN)にinsertするときにトリガーを使用して処理を行っています。 以下の条件文では、NK_SYOSAIの値が'04'以外かつ'06'以外の場合に処理を通すようにしています。 if(:new.NK_SYOSAI <> '04' and :new.NK_SYOSAI <> '06' ) then しかし、NK_SYOSAIの値がnullの場合にも処理が通ってくれません。何故でしょうか? 「NK_SYOSAI is null」を条件に入れたら通るようになりました。 納得がいかず、困っています。 どなたかアドバイスお願い致します。

  • オブジェクト参照がオブジェクト インスタンスに設定されていません  というエラーについて

    タイトルの「オブジェクト参照がオブジェクト インスタンスに設定されていません」についてですが、 このエラーは、 null を参照しようとして例外が発生している エラーだと解釈しているのですが、nullでないのに、このエラーが出る場合はどのように対処すればいいのか教えてください。 下記のような文があるとします。 Dim aaa as String 'aaaは、データベースからデータをとってきています。 If aaa IsNot DBNull.Value Then DropDownList.SelectedItem.Text = aaa.TrimEnd 'ここでエラー End If aaaは、NullではないのでIf文の中に入っていくのですが、DropDownListにデータを入れようとすると、タイトルのようなエラーが発生します。 デバッグでaaaの値を見ても、ちゃんとデータが入っているし、Nullではないのですが、なぜこのようなエラーが出るのかわかりません。 このエラーは他に違う意味があるのでしょうか? また、他に影響している部分があるのでしょうか? どなたか教えてください。 よろしくお願いいたします。

  • MFCのタイマーのつかい方を教えてください

    タイマーのつかい方が今ひとつ分かりません。 MFCでタイピングのゲームを作成しているのですが、 25問を解き、正解だった場合もしくは制限時間を超えてしまった場合、次の問題を表示したいと思っております。 下記がプログラム内容です。 void CProgramView::Loop1(CDC* pDC) { CProgramDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if((m_nRight<26)|(0<m_nRight)) { m_nRight=0; //正解数 m_nQuestion=1; //問題数 } Haikei(pDC); //問題表示領域の枠表示 Tokei(pDC); //時計の秒針が表示される枠表示 Moji(pDC); //問題文表示 OnChar(ch, count,flags); //入力 if(m_fTimer==FALSE) { SetTimer(123,250,NULL); //タイマーをセット if(m_nQuestion<26) //25問以上問題を解いていないケース { m_fTimer = FALSE; } else m_fTimer = TRUE; //全問解いた場合 } Loop0(pDC); //秒針の描画クラス if(m_nx==715) //タイムアウトだった場合 { KillTimer(123); NGPaper(pDC); m_nQuestion++; //問題をカウント m_sAnser.Empty(); //回答文字列をクリア pDoc->GetNextSet(); //次の問題を取得する InvalidateRect(NULL); } if(m_nQuestion<m_nCount) //正解だった場合 { KillTimer(123); //タイマーを切る Tokei(pDC); //秒針の画像を消すために時計の画面を再描画 Right(pDC); //正解した場合の画像を描画 Haikei(pDC); //問題文・回答を消すために問題表示領域の枠を再描画 PartsPaper1(pDC); //正解した場合の壁紙を表示 m_nQuestion++; //問題数をカウント m_sAnser.Empty(); //回答文字列をクリアする pDoc->GetNextSet(); //次の問題を取得する InvalidateRect(NULL); } } そして、この動作を25問、解くまでループさせる関数として以下の関数を作成しました。 void CProgramView::Loop2(CDC* pDC) { if(m_fTimer==FALSE) { Loop1(pDC); } } //タイマーの内容 void CProgramView::OnTimer(UINT nIDEvent) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください if(nIDEvent == 123) { InvalidateRect(NULL); } CView::OnTimer(nIDEvent); } しかし、実際にこのプログラムを実行すると入力し、正解する間は次の問題が表示されるのですが、タイマーが切れません。 そして、制限時間になるとそこまで解いていた問題から凄い勢いで描画が始まり、止まりません。 おそらくタイマーが正常に使えていないという可能性が考えられるのですが・・・。 希望としては、25問を順次解き、解き終わった後は画像を描画し、次の問題を表示したいのですが、どうしたら良いか教えてください。

  • メモリの解放について

    C++でDirectXを用いたゲームを作成しているのですが、プログラムのコンパイルは通るのに、メモリの解放関数が行われると強制終了されエラーメッセージが出力されます。 デバッグをしてみて要因を調べてみましたが、特に強制終了するような問題があるとも思えないのです。(ただ自分の知識不足であると思いますが) ためしにエラーが出ている部分をコメントにしてみたら、そしたらヒープが壊れてるとのエラーメッセージが出るのですがどう対処したらいいでしょうか? ちなみにRELEASEする変数の中身はちゃんと入ってます。 ソース: const int MAXFONT = 16; LPD3DXFONT g_pxfonts[MAXFONT]; LPD3DXSPRITE g_ptextsprite = NULL; int d=0; void DirectGraphics::CleanupD3D(){ //フォント解放 for(d=0; d<MAXFONT; d++){ if(g_pxfonts[d]!=NULL){ g_pxfonts[d]->Release();//エラー } } if(g_ptextsprite) g_ptextsprite->Release();//エラー //メッシュ、テクスチャ解放 for(d=0; d<MAXMODEL; d=d+1){ if(g_models[d].used == TRUE){ if(g_models[d].pmaterials != NULL){ delete[] g_models[d].pmaterials; } if(g_models[d].ptextures != NULL){ for(DWORD j=0; j<g_models[d].nummaterials; j=j+1){ g_models[d].ptextures[j]->Release(); } delete[] g_models[d].ptextures; } if(g_models[d].pmesh != NULL){ g_models[d].pmesh->Release(); } } } if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } エラーの出ているフォントの変数の中身はこちらに入れております。 //ゲーム用のフォントを作成 int DirectGraphics::CreateGameFont(LPCTSTR fontname, int height, UINT weight){ //空いている要素を探す int idx; for(idx=0; idx<MAXFONT; idx=idx+1){ if(g_pxfonts[idx] == NULL) break; } if (idx>=MAXFONT) return -1; //フォントを作成する HRESULT hr = D3DXCreateFont( g_pd3dDevice, -height, 0, weight, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, fontname, &g_pxfonts[idx]); if( FAILED( hr ) ) return -1; return idx; }

  • DirectXを用いたActiveXを用いてVistaで情報が取れない

    ActiveXからDirectXを叩いてOSやCPUなどの情報を 取得しようとしています。 XPでは問題なく情報が取れますが、Vistaでは 情報が取れる項目と取れない項目があります。 この現象について、教えてください。 APIは正常に終了しています。 OS(szOSExLongEnglish) → 正常取得 ベンダー(szSystemManufacturerEnglish) → n/a 型番(szSystemModelEnglish) → n/a CPU(szProcessorEnglish) → (空白) 物理メモリ(szPhysicalMemoryEnglish)  → 正常取得 IEのデフォルトの設定では上記のような状態ですが、 設定を変えて保護モードを外すと正常動作し、 すべての情報が取得できます。 しかし、保護モードが有効の状態で、 情報取得したいです。 以下にコードを書きます。 ※このコードはあるサンプルソースをほとんどそのまま使っています。 //////////////////////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::Init(void) { HRESULT hr; DXDIAG_INIT_PARAMS dxDiagInitParam; m_pDxDiagProvider = NULL; m_pDxDiagRoot = NULL; g_DxDiagInfo = NULL; g_DxSoundInfo = NULL; // COMライブラリを使用できるように初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return false; } hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider); if( FAILED(hr) || m_pDxDiagProvider == NULL) { return false; } // DXDIAG_INIT_PARAMSを初期化 ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; // WHQLを確認するかどうか // ネットを経由するので基本的にはfalseにしておく dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks; dxDiagInitParam.pReserved = NULL; hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) { return false; } hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot ); if( FAILED(hr) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// // DxDiag でSystem情報を取得 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::GetSyatemInfo( void ) { HRESULT hr; IDxDiagContainer* pObject = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; DWORD nCurCount = 0; // "DxDiag_SystemInfo" を取得 if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) ) { return false; } // 情報保存領域の確保 ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo)); if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) ) { SAFE_RELEASE( pObject ); return false; } SAFE_RELEASE( pObject ); return true; } よろしくお願いいたします。

  • eclipse + Doja でのデバッグ方法

    eclipse2.1.2 + Doja3.5でのデバッグ方法について、教えて下さいm(_ _*)m 現状、下記までは進んでいます。 1.[実行]-[実行...]⇒[デバッグモード起動]にチェック⇒[実行] 2.DOS窓開く 3.[実行]-[デバッグ...]⇒[リモートJavaアプリケーション]⇒該当するプロジェクトを選択⇒パラメータの類は変えずに[デバッグ] 4.デバッグパースペクティブになる 5.ブレークポイントが●のままなのでチェックをつけるようにもう一回貼りなおす 6.エミュレータの画面が表示されないし、ブレークポイントでも止まらない …という状況で、この後デバッグをどう進めていいのか、わかりません。 何か不足しているようなこと等あったら、ご指導ください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • visualstudioについて

    visual studio2008 c++ を使用しています. ダイアログ形式でアプリケーションを作成しています. ボタンを押すと画像のようなアプリケーションを起動してenterキーを送るようにしたいのですがうまく出来ません. void CMy6Dlg::OnBnClickedButton1() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 HINSTANCE ret = ShellExecute(m_hWnd, "open", "---Release\\scip_20_gd.exe", NULL, NULL, SW_SHOW); HWND hWnd = ::FindWindowEx(NULL, NULL, NULL, "---Release\scip_20_gd.exe"); ::SendMessage(hWnd,WM_SETFOCUS,0,0); ::SendMessage(hEdit, WM_KEYDOWN, VK_RETURN,0); if (ret <= (HINSTANCE)32) AfxMessageBox("シェル処理ができません.", MB_OK); } よろしくお願いします.