• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CFrameWnd とCFormView2)

CFrameWnd とCFormView2のコーディングでの試行錯誤とタスクバーの非表示について

このQ&Aのポイント
  • CFrameWndとCFormViewを使ったコーディングの試行錯誤について述べています。CFrameWnd::LoadFrameは成功しましたが、CFrameWnd::Createはうまくいかなかったようです。
  • また、CFrameWndをタスクバーで非表示にする方法についても疑問を投げかけています。ShowWindow(SW_SHOW)を使用するとタスクバーに表示されてしまうため、ダイアログベースにする必要があるかどうかを尋ねています。
  • 質問文章の中では具体的な解決策は示されていませんが、CFrameWndとCFormView2のコーディングとタスクバーの非表示に関する問題を詳しく調査してみることができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>>CFrameWnd::Create()の場合、NULLを指定するのも可能>です。NULLで上手くいきましたか? >いえNULLにすると「ハンドルされていない例外・・・」が>でてしまいます。 うーん、NULLでだめなのはダイアログベースだからかな? 実際に試してないんでわからないですが・・・ クラス名は自分で登録したクラス名を指定して、CCreateContext*の引数、NULLにした場合フレームウィンドウだけは表示されませんか? あと、MFCの場合はいざとなったらMFCのフレームワーク自体もデバッグすればたいてい原因は解ると思います。 >LoadFrame時の方ですが以下のようなメッセージがアウトプットウィンドウにでてしまいます。 ASSERTダイアログが出てこないんでしたら気にしないでいいですよ。MFCの内部処理で例外ハンドラを使うような処理をしてるだけですから。 ワーニングの方は、Docがある前提でフレームワークが組まれているからでしょうけど気持ち悪いですけどね。

sha-girl
質問者

お礼

>クラス名は自分で登録したクラス名を指定して、CCreateContext*の引数、NULLにした場合フレームウィンドウだけは表示されませんか? それらを含めて色々と試してみましたが無理でした。(なにかすごい基本的な事を見落としているのかもしれませんが・・) フレームウインドウもでません。 「ハンドルされていない例外はXXX.exeにあります:0xC0000005: Access Violation。」 _AFX_INLINE CStringData* CString::GetData() const { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; } の部分でとまっています。 taka_tetsuには色々とお世話になり感謝しております。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>クラス名の事はあまりよくわかっていないのですが >先にAfxRegisterWndClassでクラス名を >登録しておく必要があるということですね? そうです。 CFrameWnd::Create()の場合、NULLを指定するのも可能です。NULLで上手くいきましたか? >Windows のクラス名を示す NULL で終わる文字列へのポインタ。 >クラス名には、AfxRegisterWndClass グローバル関数または >Windows 関数の RegisterClass で登録された任意の >名称を指定できます。NULL のときは、既定の >組み込み CFrameWnd 属性が使われます。

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_cframewnd.3a3a.create
sha-girl
質問者

お礼

度々のご回答有難うございます。m(__)m >CFrameWnd::Create()の場合、NULLを指定するのも可能です。NULLで上手くいきましたか? いえNULLにすると「ハンドルされていない例外・・・」がでてしまいます。 LoadFrame時の方ですが以下のようなメッセージがアウトプットウィンドウにでてしまいます。 「例外処理 (初回) は XXX.exe (KERNEL32.DLL) にあります: 0xE06D7363: Microsoft C++ Exception」 warningでno documentなんちゃらとでていたので m_pDoc = (CBackAppleDoc*)RUNTIME_CLASS(CBackAppleDoc)->CreateObject(); con.m_pCurrentDoc = m_pDoc; を追加したのですがwarningはなくなりますが「例外・・・」は やはりでてしまいます。ウインドウ自体は何事もなく表示されるのですが・・・ これらの処理はMFCでダイアログボックスベースのウィザードで作成し そのダイアログ自体をツールウインドウにして非表示にし、 OnInitDialogの中で処理を行っています。

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>CFrameWnd::Createの方はうまくいきませんでした。 "MyClass"って自分で登録しましたか? >ShowWindow(SW_SHOW);の時点でタスクバーにでてしまいます。 LoadFrameやCreateの引数の CWnd* pParentWnd にNULLを指定しているからです。 非表示にしてあるの親ウィンドウのCWnd*を渡してください。

sha-girl
質問者

お礼

taka_tetsuさんの回答には恐縮です。 ご指摘の通りAfxGetApp()->m_pMainWndを指定してやる事で解決致しました。 ご回答、誠に有難うございました。 クラス名の事はあまりよくわかっていないのですが 先にAfxRegisterWndClassでクラス名を 登録しておく必要があるということですね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • メインダイアログのデータをウィンドウに反映させたい

    メインダイアログからウィンドウを生成しています ダイアログの値を GetDlgItemText()関数で取るまではいいのですが それから、値をウィンドウに反映できません。 メンバ値を遣うと思うのですが、どうすればいいのでしょうか? プログラムを添付します ///////////////////////////////////////////////////////// // dlg.rc #include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYDLG DIALOG DISCARDABLE 0, 0, 134, 80 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ダイアログからウィンドウ" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,15,55,50,14 PUSHBUTTON "キャンセル",IDCANCEL,65,55,50,14 EDITTEXT IDC_EDIT1,15,10,100,35,ES_AUTOHSCROLL END ////////////////////////////////////////////////// // resource.h #define IDC_EDIT1 1000 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif //////////////////////////////////////////////////////// // dlg.h //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //ウィンドウ class CMyWindow : public CFrameWnd { private: CString MyMainStr; protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; //メインダイアログ class CMyDlg : public CDialog { public: CString m_MyStr; CMyDlg(CWnd *pParentWnd=NULL); CMyWindow* m_pMyWnd; protected: virtual void OnOK(); virtual void OnCancel(); }; ///////////////////////////////////////////// // DlgWnd.cpp #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/):m_pMyWnd(NULL) //イニシャライザでポインタをNULLに初期化 { Create("MYDLG"); } BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() void CMyDlg::OnOK() { GetDlgItemText(IDC_EDIT1, m_MyStr); const RECT rc = {10, 10, 320, 240}; m_pMyWnd = new CMyWindow(); m_pMyWnd->Create( NULL, "ダイアログから起動", WS_OVERLAPPEDWINDOW, rc, this,NULL); m_pMyWnd->ShowWindow(SW_SHOW); } void CMyDlg::OnCancel() { DestroyWindow(); } void CMyWindow::OnPaint() { CPaintDC dc(this); CMyDlg dlg; MyMainStr = dlg.m_MyStr; dc.TextOut(0, 0, MyMainStr); } よろしく御願いします

  • 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関係は何も使っていません。

  • オーバーライドとオーバーロードについて

    1.CTestDlgクラスを作成 class CTestDlg : public CDialog { // コンストラクション public: BOOL Create(CWnd *pWnd); CWnd * m_pParent; CTestDlg(CWnd* pParent = NULL); // 標準のコンストラクタ・ ・ 2.メンバ関数の定義 BOOL CTestDlg::Create(CWnd *pWnd) { m_pParent = pWnd; BOOL bret = CDialog::Create( CTestDlg::IDD, m_pParent); if( bret == TRUE) { this->ShowWindow( SW_SHOW); } return bret; 以上のような場合において、 1.Create(CWnd *pWnd)は、引数が異なるため virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); をオーバーライドしたとは言わず、オーバーロードしたということで良いのでしょうか? 2.オーバーロードしたということであれば、 Create(CWnd *pWnd)と virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); の両方の関数が使えると思っていたのですが、後者方は引数が異なるとエラーが出て使えませんでした。 どうしてなのでしょうか? 以上、2点についてご教授ください。

  • チャイルドダイアログボックスでマウスクリックが効かない

    チャイルドウィンドウタイプのモードレスダイアログを表示すると  マウスでエディットボックス(など)をクリックしてもフォーカスが移動しない という現象がおきています。(tabキーではOK) 数年前に一度作ったときの記憶を頼りに作っているのですが、下記以外に設定などが必要になるのでしょうか? …というか、このやり方で問題ないのでしょうか?… ◎環境 WindowsXP Visual C++ 6.0 & MFC アプリケーションの種類…SDI ◎やったこと 1.ダイアログリソースを追加 リソースのプロパティ  「一般」タブ   ID…「IDD_DIALOGA」  「スタイル」タブ   スタイル…チャイルド   境界線…ダイアログ枠   その他…すべてoff  「その他のスタイル」タブ   可視のみon  「拡張スタイル」、「その他の拡張スタイル」タブ   すべてoff  このダイアログにいくつかのボタンやエディットボックスを配置 2.親windowのヘッダファイルに追加したもの private: dialogA *pDlg; 3.親windowのソースファイルに追加したもの BOOL CModlessDialogApp::InitInstance() にコードを追加 …… // フレームをリソースからロードして作成します pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); //↓↓ここから追加↓↓ pDlg = NULL; pDlg = new dialogA(); if(pDlg) { pDlg->Create(IDD_DIALOGA); pDlg->ShowWindow(SW_SHOWNA /*SW_SHOW|SW_RESTORE*/); } //↑↑ここまで追加↑↑ // メイン ウィンドウが初期化されたので、表示と更新を行います。 pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); …… スタイルを「オーバーラップ」「ポップアップ」にするとマウスクリックでフォーカスが移動します。

  • 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();が原因でちらついていることまでは分かっているのですが、 なぜちらつくのか?ということと、対処方法もしくは別の方法はないのか? 別の方法があればどういったことなのか?ということが知りたいです。 初心者(小学生並み)にもわかるように教えていただければ幸いです。 宜しくお願いします。

  • 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; }

  • ウィンドウにボタンを配置するには?

    VC++6.0、WinXPです CMainFrame::CMainFrame() { CButton myButton1; myButton1.Create( _T("Button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100),this, 100); myButton1.ShowWindow(SW_SHOW); myButton1.UpdateData(); } としてますがビルドはできますが実行中にエラーがでます。何がおかしいのでしょうか? よろしくお願いします。

  • DirectXでのゲーム作り error C2065: 'MsgProc'の解決法

    DirectXについて学びたくなり「15歳から始めるDirectX9 3Dゲームプログラミング」という本を使って勉強しています。 しかしウインドウを作り×ボタンを押したら終了というプログラムの所でエラーがでています。 どうかエラーの原因を教えてください。 #include<windows.h> #include<tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst,LPSTR lpCmd, int nCmd){     WNDCLASSEX wc = {sizeof  (WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,hInst,NULL,NULL,NULL,NULL,_T("My Window"),NULL};     RegisterClassEx(&wc);     HWND hWnd = CreateWindow(_T("BUTTON"),_T("ウインド名"),WS_OVERLAPPEDWINDOW,100,100,300,300,NULL,NULL,hInst,NULL);     ShowWindow(hWnd,SW_SHOWDEFAULT);     MSG msg;     ZeroMemory(&msg,sizeof(msg));     while(msg.message!=WM_QUIT){         if(PeekMessage(&msg,NULL,0L,0L,PM_REMOVE)){             TranslateMessage(&msg);             DispatchMessage(&msg);         }     }     UnregisterClass(_T("My Window"),hInst);     return 0; } エラー内容は : error C2065: 'MsgProc' : 定義されていない識別子です。 です。 環境は Microsoft Visual Studio 8 Microsoft DirectX SDK (March 2008) で、環境設定はきちんとできていると思います。 どうかお願いします。

  • ウィンドウ非表示のちらつきを無くすには

    <環境> WIN98 VC++6.0 MFC SDIにて 起動時に下記にてウィンドウを非表示にしていますが、最初に一瞬表示されてから、消えます。 何事も無かったかのように、こっそりと非表示にするにはどうすればよいですか? BOOL CAbcApp::InitInstance() { 省略 //m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->ShowWindow(SW_HIDE); m_pMainWnd->UpdateWindow(); return TRUE; }

  • ウィンドウ枠をいちいち作るのがめんどくさい

    ウィンドウの作成の部分を書き出してみました。 BOOL InitInstance(HINSTANCE hInst,int nCmdShow) { HWND hWnd; hWnd=CreateWindow(szClassName, TEXT("文字列を表示する"); WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hwnd,nCmdShow); UpdateWindow(hWnd); return TRUE; } 毎回やるのはめんどくさいのでコピー&ペーストでもいいでしょうか? または、覚えた方がいいのでしょうか?