MFCでボタン配置方法

このQ&Aのポイント
  • MFCでのボタン配置方法について説明します。
  • AppWizardを使用してプロジェクトを作成し、ヘッダファイルとcppファイルを編集します。
  • ボタンが表示されるがクリックしても凹まない場合、原因は何でしょうか?
回答を見る
  • ベストアンサー

MFCでのボタン配置

ダイアログではなく、直接Windowにボタンを貼り付けるために、AppWizaerdを使用して、MyAppというプロジェクトをつくり、MyAppクラスのヘッダに CButton mybutton を定義し、cppファイルのInitInstance関数内の m_pMainWnd->UpdateWindow();の下に、以下のように記述したところ、 mybutton.Create(_T("OK"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100), m_pMainWnd, 1); ボタンは表示されるのですが、押しても凹んでくれません。どうしてなのでしょうか?? 環境はWinXP VisualStudio.Net2003です。

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

  • ベストアンサー
  • FAY
  • ベストアンサー率49% (95/193)
回答No.1

凹んでくれないのはm_pMainWnd(おそらくCMainFrame))を親ウィンドウにしているからです。 CMainFrameにON_WM_LBUTTONDOWNのメッセージハンドラを追加してみれば分かるのですが、MainFrameにはマウスのクリック時のメッセージが飛んできません。だからボタンにもクリックされた、という情報がいかないため、押された状態にならないのだと思います。 プロジェクト内のViewクラスを親ウィンドウにしてボタンを作成してみてください。

candlefire
質問者

お礼

ご回答ありがとうございます。 Viewクラスに記述したところ出来ました!!! ずっと悩んでいたので、本当に助かりました! どうもありがとうございました。

関連するQ&A

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

    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(); } としてますがビルドはできますが実行中にエラーがでます。何がおかしいのでしょうか? よろしくお願いします。

  • ダイアログのOKボタンを押してウィンドウを生成する方法は?

    ダイアログのOKボタンを押すとウィンドウが生成する方法を教えてください。 MFCでプログラミングしてメインウィンドウをダイアロボックスにしています //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //メインダイアログ class CMyDlg : public CDialog { public: CMyDlg(CWnd *pParentWnd=NULL); protected: virtual void OnOK(); virtual void OnCancel(); }; #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*/) { Create("MYDLG"); } としています。 ダイアログはできるのですが、ここからウィンドウを生成する方法を教えてください

  • ボタンの配置を変更したい

    VC++でプログラミングしています。 MFC AppWizard(exe) でダイアログベースで造っています。 やりたいことは以下です。 ・設定ファイルに表示位置(座標)が書いてあり、ダイアログの初期化時に 設定ファイルを読んで、指定された位置にボタンを表示する。 私の案としては以下のものがあります。 <案1> 予めボタンを貼り付けて造り、EXE起動時に移動させる。 ただし、移動させる関数があるかは不明。 調べましたが、今のところ見つかっていません。 <案2> CButtonクラスのメンバを使用して、ボタンを表示する。 試しに以下のようなコードでやってみましたが、上手くいきませんでした。 使い方がわからず、試行錯誤しながらやってます。 CButton testButton; void CTestGamenDlg::OnButton1() { RECT Rect; Rect.left = 100; Rect.top = 100; Rect.right = 200; Rect.bottom = 200; testButton.Create("test", BS_PUSHBUTTON, Rect, this, 100); } 案1、2についての指摘、アドバイス、その他の案などありましたら 宜しくお願いします。 また、簡単なサンプルコードがあると助かります。

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

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

  • ボタンの文字の大きさを変更したい

    CreateWindow によるボタンを作成してみたのですが、 ボタンラベルとして貼る以下の "明朝" という文字の大きさを 変えるにはどうすればいいのでしょうか。 hButtonWnd1 = CreateWindow("BUTTON", "明朝",               S_CHILD | WS_VISIBLE | BS_PUSHBUTTON,               20, 20, 100, 30,               hWnd,               (HMENU)ID_MI,               hInst,               NULL);

  • タブコントロールが表示できない

    どうしてタブコントロールがこれでは表示されないのでしょうか m_TabはCTabCtrlです。 <CMainFrame::OnCreate内> ------------------------------------------------------ CRect rcClient; GetClientRect(rcClient); if(!m_Tab.Create(TCS_TABS | TCS_FIXEDWIDTH | WS_CHILD | WS_VISIBLE,rcClient,this,0x1006)) { return -1; } m_Tab.InsertItem( 0, _T("test"));

  • プッシュボタンができなくなってる

    LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) ・・・・・・ hCtrlBx[0]= CreateWindow("BUTTON","ok",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, i_cw,2*i_ch,8*i_cw,2*i_ch,hW,2,((LPCREATESTRUCT)lP)->hInstance,NULL); によってプッシュボタンを作ろうとしたのですが エラー E2034 ok.cpp 134: 'int' 型は 'HMENU__ *' 型に変換できない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) エラー E2342 ok.cpp 134: パラメータ 'hMenu' は HMENU__ * 型として定義されているので int は渡せない(関数 __stdcall WinProcedure(HWND__ *,unsigned int,unsigned int,long) ) となり作れませんでした hWの後の2が0のときはokですが1以上のときはoutです 以前はできたやり方なのにどうしたのでしょう 対処の仕方を教えてください

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

    メインダイアログからウィンドウを生成しています ダイアログの値を 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); } よろしく御願いします

  • Cwndクラスの派生クラスmCWndクラスのOnDrawについて

    OnDraw関数が呼び出しされていません。 どうすればいいですか? よろしくお願いします。 class mCWnd :public CWnd { public: DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags,CPoint point) { AfxMessageBox("子ウインドウ"); CDC *pDC=GetDC(); pDC->TextOut(0,0,"HELLO"); ReleaseDC(pDC); Invalidate(); } virtual void OnDraw(CDC* pDC) { AfxMessageBox("OnDraw"); pDC->FillSolidRect(CRect(0,0,300,300),RGB(255,255,255)); } }; BEGIN_MESSAGE_MAP(mCWnd, CWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() ------------------------------------------- //***View.cpp (mCWnd cw) void CKoDlg::OnBnClickedButton1() { CRect rect=CRect(50,50,190,250); cw.Create(NULL,"Hello",WS_CHILD|WS_VISIBLE,rect,this,5000,0); // TODO : ここにコントロール通知ハンドラ コードを追加します。 }

  • MFCに関する質問です。

    [VisualStudio2010]でMFCを勉強しているVC++初心者です。 (VBは、不足なく記述できるレベルです。) 現在、勉強でダイヤログアプリケーションを作成しており、配置しているボタンコントロールの色を変更しようとしていたのですが、やり方がよくわかりません。 どなたかご教示をお願いいたします。 ※簡単だと思っていたのですが・・・てこずってしまい、困っています。 尚、現時点では・・・ ボタンにはコントロール変数として m_Btn1 としております。 Dlg.cpp の  「// TODO: 初期化をここに追加します。」以降に m_Btn1.??? = 色 と記述しようと思っているのですが・・・???がわかりません。 検索してみましたが・・・やはりわかりません。(記述方法がばらばらで・・・) どなたが、ご教示頂きますようお願い致します。

専門家に質問してみよう