• 締切済み

SPREADとCDialogのCREATE

システムを開発中で困った事が起きているので質問してみました。 開発環境は.NET2008でC++、MFCアプリケーションのプロジェクトです。 SPREADのバージョンは3.0.0.52(SPR32X30.ocx)です。 簡潔に言うと、SPREADを貼ったダイアログが出力出来ません。 1.SPREADを貼る前(m_dlgはCDialog *m_dlgとして親Dialogで定義) m_dlg->Create(ID, this);(この時ちゃんとm_hWndに値が入る) m_dlg->ShowWindow(SW_SHOW); で問題なく出力されます。 2.SPREADをm_dlgに貼った場合 m_dlg->Create(ID, this); は通るには通るのですが、m_hWndがNULLのままなので、 m_dlg->ShowWindow(SW_SHOW); でハンドルが無いので落ちてしまう。 この2つを比較すると、後者は dlgcore.cppの311行目 hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate, pParentWnd->GetSafeHwnd(), AfxDlgProc); で値が取れていないようです。 他の.Net2008プロジェクトでは問題なく使えていますが、今回問題となっているプロジェクトは、 「VC6から.Net2008に置換」 しています。 何か悪影響があるのでしょうか? 因みに、置換する前はSPREAD関係は何も使っていません。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

このコントロールって ActiveX版ですよね 動作保障を『グレープシティー』さんはしていないようですが ・・・ ビルド > プロジェクトのクリーンで出力ファイル系を削除 ソリューションを閉じて ncb、ilkファイルを削除 で リビルドしてみるとか RCファイルを VC6からそのまま持ってきて WinDiffなどで差異を検証しながら入れ替えてみるとか だめ元で『グレープシティ』さんに聞いてみるとか かなぁ ・・・

MO_2008
質問者

補足

ご回答有難うございます。 一応グレープシティにメールはしてみたのですが、 案の定 「3.0Jは既にサポート外です」 と飛んできました… ncb、ilkファイルを削除(略 の方法もダメでした。 う~んどうしたものか…

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

このコントロールって『グレープシティ』さんのでしょうか? そうならば開発用のライセンスがないと開発用途では使えませんよ きちんとコントロールの開発環境を整えましょう

MO_2008
質問者

補足

ご回答有難うございます。 勿論ライセンス登録は行っています。 ですので、他の新規.Net2008プロジェクトでは正常に動作しています。

関連するQ&A

  • OnDestroy() について

    環境 WIN98 VC++6.0 MFC SDIにて アプリ起動と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } <質問1> このような場合に、CInputクラスに以下のようにOnDestroy()を追加しましたが、 ダイアログを閉じた時もアプリ終了時にもメッセージが飛んできません。 どうしてなのですか? void CInput::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("789"); } <質問2> 更に、以下のように新規にダイアログバーを追加したところ、メッセージが飛ぶようになりました。 どうしてなのでしょうか? int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR, WS_VISIBLE , CG_ID_VIEW_MYDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); return -1; // 作成に失敗 } dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; }

  • 非表示のメインウィンドウを表示させるには?

    環境 WIN98 VC++6.0 MFC SDIにて タスクトレイに常駐するアプリにおいて 1.起動時にメインウィンドウを非表示にしています。 2.起動時と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } 3.このような場合に、ダイアログのボタン押し下げにて、メインウィンドウを表示させるには、どうすれば良いでしょうか? 以下のようにしてみましたが、不正な処理で落ちてしまいます。 void CInput::OnButton1() { CWnd* mywnd = (CWnd*)GetParent(); mywnd->ShowWindow(SW_SHOW); }

  • 他のプロセスの描画領域を再描画

    他のプロセスの描画領域を再描画 対象となる他のプロセスのウインドウハンドルやデバイスコンテキストは利用可能のようですが再描画の方法をShowWindow(hWnd, SW_HIDE);ShowWindow(hWnd, SW_SHOW);としているために真っ白な状態が見えたりするのでそれを避ける方法を教えてください。

  • windowを常に手前にしたい。

    すみません。教えてください。 [環境] windows2000 visual c++6.0 [内容] 親ウインドウから子ウインドウを呼び出して、常に子ウインドウを手前にし、かつ常にアクティブにしたいのですが、うまくいきません。 [ソース] 親ウインドウ : : : CSysCp02Dlg2* frm02Dlg; frm02Dlg = new CSysCp02Dlg2(); frm02Dlg->Create(IDD_SYSCP02_DIALOG,NULL); frm02Dlg->ShowWindow(SW_SHOW); : : (裏で処理をする) :  delete frm02Dlg; (処理の終了) [ソース]子ウインドウ : : :  this->SetActiveWindow();  this->SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); : : : イメージ的には、DoModalで子ウインドウを表示し、裏の親ウインドウで処理をしたいのです。(もちろんDoModalでは無理なので、Createをしていますが....) どなたかご存知の方いらっしゃいましたら、ご教授お願いいたします。

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • ダイアログをアクティブにするには?

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて ダイアログを非表示から dlg->ShowWindow(SW_SHOW);にて 表示にしましたが、アクティブ状態になっていません。 アクティブにするにはどうすれば良いですか?

  • CTreeCtrlのCreate関数でエラーになります。

    Visual C++ .NET Win32 プロジェクト で、アプリケーションを作成しようと思っています。 #include<afxwin.h> #include<afxcmn.h> // マルチスレッド CTreeCtrl *m_TreeCtrl; LRESULT CALLBACK int WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: m_TreeCtrl=new CTreeCtrl; m_TreeCtrl->Create(WS_VISIBLE | WS_TABSTOP | WS_CHILD | WS_BORDER | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_DISABLEDRAGDROP, CRect(10, 10, 300, 100), CWnd::FromHandle(hWnd), 10000); break; case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: HDC hDC; PAINTSTRUCT Paint; hDC=BeginPaint(hWnd,&Paint); EndPaint(hWnd,&Paint); } return DefWindowProc(hWnd,message,wParam,lParam); } ・・・ と記述すると、エラーになります。 解決方法を教えてください。

  • CFrameWnd とCFormView2

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=880746の続きです。 試行錯誤でCFrameWnd とCFormViewを使ったコーディングをしてみました CFrameWnd::LoadFrameを使った方はうまくいったのですがCFrameWnd::Createの方はうまくいきませんでした。 //LoadFrame CCreateContext con; memset(&con,0,sizeof(CCreateContext)); con.m_pNewViewClass = RUNTIME_CLASS(CXXXView); m_pMainFrame = new CMainFrame; m_pMainFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,NULL, &con ); m_pMainFrame->ShowWindow(SW_SHOW); //Create・・・うまくいかない(何故?) m_pContext = new CCreateContext; memset(m_pContext,0,sizeof(CCreateContext)); m_pContext->m_pNewViewClass = RUNTIME_CLASS(CXXXView); m_pMainFrame->Create("MyClass","MyWindow",WS_OVERLAPPEDWINDOW,CRect(0,0,10,10),NULL,NULL,0,m_pContext); m_pMainFrame->ShowWindow(SW_SHOW); ところでLoadFrameでうまくいったのは良いのですが 一つ疑問が、、、CFrameWndをタスクバーでは非表示で 表示することって無理でしょうか? ShowWindow(SW_SHOW);の時点でタスクバーにでてしまいます。 タスクバーに表示させないにはダイアログベースにする必要があるのでしょうか? 宜しくお願いいたします。

  • ウィンドウハンドルの取得方法について

    よろしくお願いします。 WIN98 VC++6.0 MFC にて 色々勉強しておりますが、今だにウィンドウハンドルの取得方法が良く分かりません。 SDKのサンプルを見ると、なるほどそうするのか。と思いますが、MFCになると分からなくなります。 たとえば、 ウィザードのデフォルトに従いダイアログベースでのプロジェクトを作成し、ボタン1と2を配置します。 以下のコードでボタン1を非表示にできます。 void CPppDlg::OnButton2() { CWnd* pButton1 = GetDlgItem (IDC_BUTTON1); pButton1->ShowWindow(SW_HIDE); } このコードにおいて、 1.SDKの BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); を用いて引数が2個の形式に書きかえることは可能でしょうか? 2.可能であれば、具体的にはどう記述すれば良いのでしょうか?

  • MFCタブコントロールのグラデーション描画

    現在、VC++2010・MFC環境でMFCのタブコントロールのウィンドウ部(?)をグラデーション描画にしたいと考えています。 完成予想としては、Excelのメニュー(?)みたいな感じでグラデーションがかかるような感じにしたいのですが、現在、グラデーションの描画は何とか(たぶん無理やり)できましたが、タブを切替たり、ダイアログ自体が非アクティブ/アクティブを繰り返すとちらついてしまいます。 ソースは以下のようになっています。 ----------------------------------------------------------------- void CTabGradDlg::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: ここにコントロール通知ハンドラー コードを追加します。 int sel = m_xcTab.GetCurSel(); m_edit1.ShowWindow(SW_HIDE); m_edit2.ShowWindow(SW_HIDE); m_button1.ShowWindow(SW_HIDE); m_button2.ShowWindow(SW_HIDE); switch(sel) { case 0: m_edit1.ShowWindow(SW_SHOW); m_button1.ShowWindow(SW_SHOW); break; case 1: m_edit2.ShowWindow(SW_SHOW); m_button2.ShowWindow(SW_SHOW); break; } Invalidate(); *pResult = 0; } void CTabGradDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialogEx::OnActivate(nState, pWndOther, bMinimized); // TODO: ここにメッセージ ハンドラー コードを追加します。 switch( nState ) { case WA_INACTIVE : // 非アクティブ break; case WA_ACTIVE : // (マウスをクリックする以外の方法) アクティブ case WA_CLICKACTIVE : // (マウス クリック)アクティブ Invalidate(); break; } } ----------------------------------------------------------------- Invalidate();が原因でちらついていることまでは分かっているのですが、 なぜちらつくのか?ということと、対処方法もしくは別の方法はないのか? 別の方法があればどういったことなのか?ということが知りたいです。 初心者(小学生並み)にもわかるように教えていただければ幸いです。 宜しくお願いします。

専門家に質問してみよう