none
ModelessDialogを初めから表示する RRS feed

  • 質問

  • お世話になっています。WindowsXpH VS6.0 C++ MFC開発環境です
    現状 制作のKolamDesigner.exeフあィるを起動して MenuからParameterDailogが表示され、それから各種描画制御用変数を入力しています。
    これをexeファイルを起動すると同時に表示したいのですが どのようにすればよいでしょうか?
    // KolamDesigner.cpp : Defines the class behaviors for the application.
    において

    /////////////////////////////////////////////////////////////////////////////
    // CKolamDesignerApp initialization

    BOOL CKolamDesignerApp::InitInstance()
    {
    AfxEnableControlContainer();

    // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need.

    #ifdef _AFXDLL
    Enable3dControls(); // Call this when using MFC in a shared DLL
    #else
    Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif

    // Change the registry key under which our settings are stored.
    // TODO: You should modify this string to be something appropriate
    // such as the name of your company or organization.
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));


    // To create the main window, this code creates a new frame window
    // object and then sets it as the application's main window object.
    CMainFrame* pFrame = new CMainFrame;
    m_pMainWnd = pFrame;

    // create and load the frame with its resources
    pFrame->LoadFrame(IDR_MAINFRAME,
    WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
    NULL);


    // The one and only window has been initialized, so show and update it.
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();

    return TRUE;
    }
    // MainFrm.cpp : implementation of the CMainFrame class
    において 以下のコードです
    /////////////////////////////////////////////////////////////////////////////
    // CMainFrame construction/destruction

    CMainFrame::CMainFrame()
    {
    // TODO: add member initialization code here
    }

    CMainFrame::~CMainFrame()
    {
    }

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
    // create a view to occupy the client area of the frame
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
    CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
    TRACE0("Failed to create view window\n");
    return -1;
    }else{
    // create a parameter dialog #t.yoshino
    if (!m_wndView.m_wndParam.Create(&m_wndView) )
    {
    TRACE0("Failed to create parameter window\n");
    return -1;
    }
    }
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    }

    if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
     sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
    }

    // TODO: Delete these three lines if you don't want the toolbar to
    //  be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

    return 0;
    }

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    if( !CFrameWnd::PreCreateWindow(cs) )
    return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
    cs.lpszClass = AfxRegisterWndClass(0);
    return TRUE;
    }

    /////////////////////////////////////////////////////////////////////////////
    // CMainFrame diagnostics

    #ifdef _DEBUG
    void CMainFrame::AssertValid() const
    {
    CFrameWnd::AssertValid();
    }

    void CMainFrame::Dump(CDumpContext& dc) const
    {
    CFrameWnd::Dump(dc);
    }

    #endif //_DEBUG

    /////////////////////////////////////////////////////////////////////////////
    // CMainFrame message handlers
    void CMainFrame::OnSetFocus(CWnd* pOldWnd)
    {
    // forward focus to the view window
    m_wndView.SetFocus();
    }

    BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
    {
    // let the view have first crack at the command
    if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
    return TRUE;

    // otherwise, do default handling
    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    }
    十分な情報でないかもしれません。
    よろしく おねがいします
    2009年11月14日 23:34

回答

  • たとえば、
    BOOL CKolamDesignerApp::InitInstance()
    {
    
    // …
    
    // The one and only window has been initialized, so show and update it.
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    
    // CChildView::OnParameterSet()を呼び出す
    pFrame->PostMessage(WM_COMMAND, /*CChildView::OnParameterSet()のコマンドID*/);
    
    return TRUE;
    }
    

    で、いけるのではないでしょうか。
    2009年11月15日 9:39
  • コマンドIDの役割
    #define ID_PARAMETER_SET                32771
    これ(アドレス値でしょうか)を読み出し、それに従う処理(これがクラスのオブジェクトとかな)が
    始めると。

    コマンドIDはアドレス値ではありません。
    コマンド一つ一つに割り振った識別番号です。

    WM_COMMANDというメッセージはWindowsプログラミングに欠かせないものですから、
    想像とか推測とかしていないで、ちゃんとヘルプで調べるようにしてください。

    ついでに。
    pFrame->PostMessage(WM_COMMAND, ID_PARAMETER_SET); とすると、
    なぜ、CChildView::OnParameterSet()が呼び出されるのか?
    ということをデバッガで追いながら調べるというようなことは、
    MFCでのWindowsプログラミングの学習において極めて重要です。

    そういうことをしないから、何度も何度も同じようなことを質問しなければならない羽目になっている
    ということを自覚してほしいです。

    また、MSDNの以下のページのリンクは全部目を通しても絶対に罰はあたりません。
    参考までに。(と書いても読まない気もしないでもないですが…)
    メッセージの処理とマップ (MFC)
    2009年11月16日 1:05
  • 参考になった記事に対して回答としてマークするのがここのルールのようです。
    http://social.msdn.microsoft.com/Forums/ja-JP/help#258
    2009年12月1日 0:32

すべての返信

  • ソースを載せて丸投げするのではなく、
    目的の動作のためにどういうことをご自分で考えられて、
    どういうことを試したが、
    どういう風にうまくいかなかったのか、
    というようなことを書いたほうがいいのではないでしょうか。
    2009年11月15日 0:55
  • やっと得た現状は MenuのParameterSetの呼び出し
    void CChildView::OnParameterSet() 
    {
    CRect rectParent;
    GetWindowRect(&rectParent);
    // 子ウィンドウの位置を得る
    CRect rectChild;
    m_wndParam.GetWindowRect(&rectChild);
    // 親の右端から子の幅分オフセットさせた位置に配置
    long width = rectChild.right - rectChild.left;
    rectChild.right = rectParent.right;
    rectChild.left = rectChild.right - width;
    // 親ウィンドウの中ほどの高さに配置 
    long parentHeight = rectParent.bottom - rectParent.top;
    long childHeight = rectChild.bottom - rectChild.top;
    rectChild.top = rectParent.top + parentHeight / 4;
    rectChild.bottom = rectChild.top + childHeight;
    // ここまで
    m_wndParam.MoveWindow(&rectChild);
    m_wndParam.BringWindowToTop();  // 前に持ってくる
    m_wndParam.ShowWindow(SW_SHOW); // 表示

    } //endof OnParameterSet

    この OnParameterSet() を起動の直後に 呼び出せばとかんがえているのですが
    すぐに表示される説明が得られず 尋ねています。
    どなたか よろしく
    2009年11月15日 6:10
  • たとえば、
    BOOL CKolamDesignerApp::InitInstance()
    {
    
    // …
    
    // The one and only window has been initialized, so show and update it.
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    
    // CChildView::OnParameterSet()を呼び出す
    pFrame->PostMessage(WM_COMMAND, /*CChildView::OnParameterSet()のコマンドID*/);
    
    return TRUE;
    }
    

    で、いけるのではないでしょうか。
    2009年11月15日 9:39
  • たいへんありがとうございました。
    こういう風にするのかと すこしずつわかってきました。
    コマンドIDの役割
    #define ID_PARAMETER_SET                32771
    これ(アドレス値でしょうか)を読み出し、それに従う処理(これがクラスのオブジェクトとかな)が
    始めると。

    さっそく入れて 期待どうりに起動時にModelessDialogが表示 動作も正常確認しました
    ありがとうございます

    2009年11月15日 22:35
  • コマンドIDの役割
    #define ID_PARAMETER_SET                32771
    これ(アドレス値でしょうか)を読み出し、それに従う処理(これがクラスのオブジェクトとかな)が
    始めると。

    コマンドIDはアドレス値ではありません。
    コマンド一つ一つに割り振った識別番号です。

    WM_COMMANDというメッセージはWindowsプログラミングに欠かせないものですから、
    想像とか推測とかしていないで、ちゃんとヘルプで調べるようにしてください。

    ついでに。
    pFrame->PostMessage(WM_COMMAND, ID_PARAMETER_SET); とすると、
    なぜ、CChildView::OnParameterSet()が呼び出されるのか?
    ということをデバッガで追いながら調べるというようなことは、
    MFCでのWindowsプログラミングの学習において極めて重要です。

    そういうことをしないから、何度も何度も同じようなことを質問しなければならない羽目になっている
    ということを自覚してほしいです。

    また、MSDNの以下のページのリンクは全部目を通しても絶対に罰はあたりません。
    参考までに。(と書いても読まない気もしないでもないですが…)
    メッセージの処理とマップ (MFC)
    2009年11月16日 1:05
  • ありがとうございました
    Helpをみるのに CD2枚を頻繁に入れ替えてみないといけないので ついつい横着しています。
    その割りには なかなか理解できる説明が得られないので
    こちらを頼っています
    はい Webの解説は 便利ですので それはよくよく読まねばと心してますが
    どうも いまひとつです
    MSDNのページを目をとおすように心がけます
    ありがとうございました

    • 回答としてマーク Shonan Hannya 2009年11月16日 5:05
    • 回答としてマークされていない Shonan Hannya 2009年12月3日 0:00
    2009年11月16日 5:04
  • 参考になった記事に対して回答としてマークするのがここのルールのようです。
    http://social.msdn.microsoft.com/Forums/ja-JP/help#258
    2009年12月1日 0:32
  • 遅くなりました
    http://rcpt.yousendit.com/784951956/104560351d13a5a784c6afeebb5a3b54
    と結実しています
    投票のクリックと 回答としてのマークと同一視していました。
    改めて 御礼を申し上げと 遅まきながら回答評価をしました。
    今後もよろしく 助言ください

    2009年12月3日 0:12