- ベストアンサー
MFCでのウィンドウ生成
http://www7.plala.or.jp/bunpan/htmldata/program/mfc/fol_001/mfc00112.html ここにMFCによるウィンドウ生成方法が載っています。 クラスを定義して、MyCreate() をコールすることで、ベタなウィンドウを作成できますよ。とありますが、引数UINT nIDは何を与えれば良いのでしょうか? ************************* int CxxxWnd::MyCreate( dwStyle, rect, pParentWnd, nID, pContext ); DWORD dwStyle; // (I) 作成するウィンドウのスタイルを指定してね。 const RECT ▭ // (I) 作成するウィンドウのサイズを指定してね。(参照受け渡し) CWnd *pParentWnd; // (I) 親ウィンドウのクラスのオブジェクトのアドレスを指定してね。 UINT nID; // (I) ID を指定します。 CCreateContext *pContext; // (I) ウィンドウの作成コンテキスト。(NULL でいーんじゃん?)
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (5)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
- darksky
- ベストアンサー率66% (38/57)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
- darksky
- ベストアンサー率66% (38/57)
- darksky
- ベストアンサー率66% (38/57)
関連するQ&A
- 親ウィンドウの領域外でも表示されるエディットボックスについて
親ウィンドウの領域外でも表示されるエディットボックスについて VisualStudio2005でMFCアプリを作っています。 親ウィンドウに指定したコントロールの領域外でも 表示されるようなエディットボックスを作りたいのですが、方法はありますか? イメージとしては、ダイアログ上にボタンがあって、 そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。 このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、 ダイアログの下の端でエディットボックスが途切れてしまいます。 ダイアログの下より大きくなっても全体が表示されるようにしたいんです。 このエディットの生成は次のような感じで行っています。 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1); よろしくお願いします。
- ベストアンサー
- C・C++・C#
- マウスポインタの形状
よろしくお願いします。 環境 WIN98 VC++6.0 MFC SDIにて http://www.net24.ne.jp/~kenji/s_swin/swin.htmlにあるウィンドウを生成した場合、 クライアント領域にあるマウスポインタの形が、エッジを触ってウィンドウの大きさを変える上下矢印や左右矢印に変わってしまうことがあります。 マウスポインタがクライアント領域にある時は、常に一般的な形(左上をさす白く太い形)にするにはどうすれば良いのですか? お分かりの方よろしくお願いいたします。 *********************** ウィンドウのスタイル LPCTSTR lpszClassName; CRect rect( 0, 0, 640, 480); HCURSOR hCursor = 0; DWORD dwStyle, dwExStyle; lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, hCursor); dwExStyle = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE; dwStyle = WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU | WS_BORDER | WS_THICKFRAME; CreateEx( dwExStyle, lpszClassName, _T("Test window"), dwStyle, rect, parent, NULL, NULL);
- ベストアンサー
- C・C++・C#
- ダイアログの領域全てをエデイトボックスが占めるプログラム
お世話になります。 現在ダイアログにエディトボックス(IDC_EDIT1)を1つおいて、このエディトボックスがダイアログの全体を占める様なプログラムを作成しています。 以下のようなプログラムでは、サイズ変更をした時に初めてダイアログ内にエディトボックスが動的に占めるのですが、これをプログラムを起動したときから既にエディトボックスがダイアログの全体を占めている状態にしたいのですが、どのようにすればよいでしょうか? 開発環境はVC++ 6.0 MFC WindXPです。 ご教示よろしくお願いします。 プログラム: void CxxxDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください CRect rect; CWnd* pEdit = GetDlgItem( IDC_EDIT1 ); GetClientRect(&rect); if( pEdit != NULL ) { rect=CRect(0,0,cx,cy); pEdit->MoveWindow( &rect, TRUE ); } }
- ベストアンサー
- その他(ソフトウェア)
- VC++ MFC CFrameWndって・・・
こんにちわMFC初心者です MFCアプリケーションウィザードを利用してMFCの画面を作成するとCFrameWndを元にしたCMainFrameクラスが作成されますが、コレはプロジェクト起動時に一番最初にインスタンスが作成されるクラスと考えて良いのでしょうか? また、他のサンプルプログラムでCMainFrameクラス内のメンバとしてCWndクラスを元にしたCChildViewが定義されていますが、この場合はCChildViewはCMainFrameの子フォームになるのですかね? 更にCChildView内部でCImageクラスを元にしたimgOriginalが定義されていますが、これはCChildViewに設置するコントロールですかね?(VBでいうところのピクチャーコントロール見たいなモンですかね?) 目的として、特殊な画像形式を利用する為、CImageクラスを利用して画像表示が出来ないので、特殊な画像形式のファイルからピクセル単位のデータを取得して画像表示をしたいのですが、この時にCDCクラスを利用して画像表示したいのですが、上手く表示されません これは、自分のMFCに対する認識が間違っているのでは無いかと思い皆様に質問させて戴いた次第です 皆様、私の認識に間違いがないかどうか、コメントをお願い致します m(__)m
- 締切済み
- C・C++・C#
- 左ダブルクリックについて
アプリの中から動的に新規にウィンドウを作っています。 新規に作ったウィンドウのクライアント領域を左ダブルクリックした時に、メッセージボックスを出そうとしましたが、何も出てきません。 左クリックであればうまく行きます。 (右でも同様の現象) どうしてこうなるのでしょうか? お分かりの方アドバイスお願いします。 ************************* CMyWnd::CMyWnd( CWnd* parent,int i) { } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { AfxMessageBox("99"); CWnd::OnLButtonDown(nFlags, point); } void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { AfxMessageBox("99"); CWnd::OnLButtonDblClk(nFlags, point); }
- ベストアンサー
- C・C++・C#
- VC++でMFCアプリ作成中です。
MFCの既存のフレームで、「最近使ったファイル」という欄があります。 これを選んだ際に、指定したプログラムでそのファイルを開きたいのですが、うまくいきません。 どうすればよろしいでしょうか? HogeView.cpp ...(省略) /*************************************** OnOpenRecentFileのオーバーライド ***************************************/ BOOL CWinApp::OnOpenRecentFile(UINT nID) { ASSERT_VALID(this); ASSERT(m_pRecentFileList != NULL); ASSERT(nID >= ID_FILE_MRU_FILE1); ASSERT(nID < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize()); int nIndex = nID - ID_FILE_MRU_FILE1; ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0); /* 選んだファイルを表示 */ AfxMessageBox((*m_pRecentFileList)[nIndex]); CHogeView *myview = new CHogeView(); ★ myview->GetDocument()->SetFilePath((*m_pRecentFileList)[nIndex]); AfxMessageBox(myview->GetDocument()->GetFilePath()); myview->ReadFile((*m_pRecentFileList)[nIndex]); TRACE2("MRU オリジナル関数内: open file (%d) '%s'.\n", (nIndex) + 1, (LPCTSTR)(*m_pRecentFileList)[nIndex]); if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL){ m_pRecentFileList->Remove(nIndex); } return TRUE; } /****************************************************************** ファイル読み込み ******************************************************************/ void CHogeViewerView::ReadFile(CString filename){ ...(省略) } コンパイルはできるのですが、どうやら★のところがうまく行かず、 Debug Assertion Failed! とエラーがでます。 何が原因なのでしょうか?
- ベストアンサー
- C・C++・C#
- 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 : ここにコントロール通知ハンドラ コードを追加します。 }
- ベストアンサー
- C・C++・C#
- マルチメディアタイマーの使用方法
お世話になります、fujitomoです。 今回お聞きしたいのはマルチメディアタイマーのプログラムの使用方法についてです。現在下記のようなコードを作成して、マルチメディアタイマーを動作させたいと思っていますが、なぜか処理が固まってしまいます。 プログラムはVisual Studio2005のVisual C++のダイアログベースのプログラムで、CStatic派生クラスをメインダイアログクラスにてサブクラス化した際の動作を示しています。 //CStatic派生のクラスCSampleクラスのヘッダーファイル //CSample.h class CSample : public CStatic { static void CALLBACK TimerProc(UINT uTimerID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2); static UINT TimerID; } //CSample.cpp void CSample::PreSubclassWindow() { TIMECAPS timercaps; MMRESULT mmresult; //分解能を取得 mmresult = timeGetDevCaps(&timercaps,sizeof(TIMECAPS)); if(mmresult != TIMERR_NOERROR){ AfxMessageBox(_T("分解能取得失敗")); return; } else period = timercaps.wPeriodMin; //最小タイマー分解能の設定 mmresult = timeBeginPeriod(period); if(mmresult != TIMERR_NOERROR){ AfxMessageBox(_T("分解能設定失敗")); return; } //タイマー処理の呼び出しの設定と開始 mmresult = ::timeSetEvent(500,period,TimerProc,0,TIME_PERIODIC|TIME_CALLBACK_FUNCTION); if(mmresult == NULL){ AfxMessageBox(_T("タイマー処理失敗")); return; } else TimerID = (UINT)mmresult; } void CALLBACK CSample::TimeProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) { if(uTimerID == TimerID){ ; } } というコードです。自分の予想ではTimerProcにブレークポイントを置いて、デバックを開始すると500msecでTimerProcにとぶと思っているのですが、実際はtimeSetEvent()を呼び出した後にプログラムの動作が止まってしまいます。 これは何が原因なのかわかりますでしょうか? timesetEvent()を使用するのが初めてで、なかなか使い方が分からず初歩的な質問なのかもしれませんが、どうかご意見を宜しくお願い致します。 尚、開発環境は Visual Studio 2005 Windows CE 6.0 です。宜しくお願い致します。
- ベストアンサー
- C・C++・C#
- MFC Timerについて
MFCのTimerの利用方法をいろいろ調べたのですが。 理解できずに困っています。 MFCのダイアログベースで作成し、ボタンを押したら Timer(1秒ごと)でエディットボックスに表示させるというものです。 ・ベースのウィンドウにボタンとエディットボックスを作成しました。 ・次に ボタンをダブルクリックし以下のように書きました。 void CtestDlg::OnBnClickedButton() { int x=0; char buf[10000]; x++; sprintf(buf,"%d",x); (labelの変数名)_edit.SetWindowText(buf); } ・SetTimer(1, 1000, NULL);を用いて ボタンがクリックされたら1秒ごとにxの値をエディットボックスに表示させるようにしたいのですが。 OnTimer(UINT nIDEvent) Close()やKillTimer(1);をもちいらなければならないことはわかったのですが。 作業手順がわかりません。 詳しい 作業手順をおしえてください。 プログラム完成まで 教えていただけるととてもうれしいです。 プログラマーの方よろしくお願いします。
- ベストアンサー
- C・C++・C#
- クラス内にWin32APIのコールバック関数がある場合
Win32APIをC++で作成しようとしているのですが、途中どのようにしたらいいのか分からないのでここで質問させていただきました。 Win32をC++で作成するためクラス内にウィンドウの登録、設定の関数を用意したのはいいのですが、CALLBACK関数を含めて実行しようとするとウィンドウの登録の際に、エラーが起きるようです。 /*////////////////////////////////////////// ウィンドウ・クラスの登録 //////////////////////////////////////////*/ ATOM windCreate::InitApp(void) { (省略) wc.lpfnWndProc = WndProc; //ここでエラー (省略) return RegisterClassEx(&wc); } エラー内容は下記の通りです。 error C2440: '=' : 'LRESULT (__stdcall windCreate::* )(HWND,UINT,WPARAM,LPARAM)' から 'WNDPROC' に変換できません。 クラスの宣言は以下の通りです。 class windCreate{ // WinMain インスタンスハンドルへのアクセス public: HINSTANCE hInst; private: WNDCLASSEX wc; LPSTR szClassName; HWND hWnd; RECT w_rect; SIZE window_size; public: ATOM InitApp(void); BOOL InitInstance(int nCmdLine); //ここがシステムから呼び出されるコールバック関数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ---------(以下省略)--------- }; ウィンドウからのメッセージ受取を行う関数なんですが、どうしたら エラーなく実行できるのでしょうか?
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。 ************************** // ウィンドウを作成します。 check = Create( (LPCTSTR) UNIQUE_WND_CLASS_NAME, (LPCTSTR) NULL, dwStyle, rect, pParentWnd, nID, pContext ); ************************** 教えて頂いたことは分かりましたが、pParentWnd,nID,pContextの nID以外もなにを与えれば良いか良く分かりません。 とりあえず、NULL,NULL,NULLとしましたが、Createではエラーが出たため、 check = CreateEx( dwExStyle, (LPCTSTR) UNIQUE_WND_CLASS_NAME, _T("Test window"), dwStyle, rect, NULL, NULL, NULL); としました。 1.ウィンドウは生成されますが、一瞬で消えてしまいます。 どうしてなのでしょうか? 2.pParentWndとpContextには何を与えれば良いのでしょうか? 以上、2点についてよろしくお願いいたします。