Windows 2000 + VC++6.0で四苦八苦しています。
私自身はC言語はある程度解るのですが、VC++は始めたばかりです。
ごく単純にviewの上にeditboxを置きたいのですが表示されません。だいたいこんな手順
で作ってますがどこかおかしいですか?
・VC++でSDIプロジェクトを新規作成
・CxxxxViewクラスにCEdit型メンバ変数を宣言
・CxxxxViewのCreateの中でCEdit型メンバ変数を作成
・CxxxxViewのOnDrawの中でCEdit型メンバ変数を表示
...という手順を踏んだつもりなんですが、実際に動かしてみるとviewの中は空っぽで
editboxも何もありません。ちなみにソースはこんな風になっています。(恥ずかしいので
私が付け加えたとおぼしき所だけ抜粋しています。また、実際のソースはVCが勝手に作っ
た文は一切削除していません。)
どなたかおわかりになる方、よろしくお願いします。なにか聞き方で至らぬ所があったら
仰ってください。
xxxxView.h
class CxxxxView : public CView
{
...
// ClassWizard は仮想関数のオーバーライドを生成します。
//{{AFX_VIRTUAL(CxxxxView)
public:
virtual void OnDraw(CDC* pDC); // このビューを描画する際にオーバーライドされます。
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD
dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext
= NULL);
//}}AFX_VIRTUAL
public:
CEdit m_editbox;
};
xxxxView.cpp
void CxxxxView::OnDraw(CDC* pDC)
{
// TODO: この場所にネイティブ データ用の描画コードを追加します。
if( m_editbox.GetSafeHwnd() )
{
m_editbox.ShowWindow(SW_SHOW);
}
}
BOOL CxxxxView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD
dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
CRect rectEditbox = CRect( 100, 100, 200, 150 );
m_editbox.Create( WS_CHILD|WS_VISIBLE|ES_LEFT, rectEditbox, this, 2000 );
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd,
nID, pContext);
}
私はこういうことをするときはCreateではなくてInitialUpdate()(つづりが間違っていたら
ごめんなさい)でやっています。
一度試してみてください。
ちなみにOnDrawにはこれに依存するような処理は特に必要なかったような・・・。
m_editbox.Create( WS_CHILD|WS_VISIBLE|ES_LEFT, rectEditbox, this, 2000 );
CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd,
の順番では、Viewが出来る前にEditBoxを作ろうとして失敗しているのでは?
ちなみに私は OnCreate()で作ることが多いです。
リソースエディタ 使って ビューにエディットboxを作成して
クラスウィザードで関数の処理内容記述するのが
簡単ではないですか
>VC++は始めたばかりです
どのくらいの期間やっているのかわかりませんが
動的にエディットBOX使いたいのなら私の方法は向いてません
静的使用の場合だけお勧めいたします
アドバイス、ありがとうございます。
はおさん、
生憎InitialUpdate()というのは見つからなかったのですが、OnInitialUpdate()というの
があったので、これを作り、editboxの作成・表示をそこに移動させてみました。
void CxxxxView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
m_editbox.Create( WS_CHILD|WS_VISIBLE|ES_LEFT, CRect( 100, 100, 200, 150 ),
this, 2000 );
m_editbox.ShowWindow(SW_SHOW);
}
Wandererさん、
VC++が勝手に作ったソースに
return CWnd::Create( 省略 );
と1行で書かれてあったので、CWnd::Create()より先にeditboxを作成するものだと思いこ
んでいました。そこで、以下のようにしてみました。
BOOL CxxxxView::Create( 省略 )
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
BOOL bRet=CWnd::Create( 省略 );
m_editbox.Create( WS_CHILD|WS_VISIBLE|ES_LEFT, CRect( 100, 100, 200, 150 ),
this, 2000 );
m_editbox.ShowWindow(SW_SHOW);
return bRet;
}
また、OnCreate()も試してみました。
int CxxxxView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: この位置に固有の作成用コードを追加してください
m_editbox.Create( WS_CHILD|WS_VISIBLE|ES_LEFT, CRect( 100, 100, 200, 150 ),
this, 2000 );
m_editbox.ShowWindow(SW_SHOW);
return 0;
}
結果はどれも変わらず、真っ白なviewが表示されるだけでした。私のソースは何かおかし
いのでしょうか。
アドバイス、ありがとうございます。
woodさん、
「リソースエディタ 使って ビューにエディットboxを作成して」というのがよく理解
できません。リソースエディタではダイアログは作れるようですが、ビューを作成する方
法が見あたりません。それとも一旦ダイアログを作って、それをビューに貼り付ける、と
いう事でしょうか。
それから自己レスになりますが、「画面全体が真っ白」という状態が「白地に白の
editboxを置いているのか?」と疑って、以下のようにしてみました。
void CxxxxView::OnDraw(CDC* pDC)
{
CxxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CRect rect;
GetClientRect( &rect );
pDC->FillSolidRect( &rect, RGB(0,0,0) );
}
すると、黒地にくっきりと白い四角が見えてきました。はおさんのアドバイス、Wanderer
さんの2種類のアドバイスどれでも同じ結果が得られました。
...しかし。なぜ「黒地に白い四角」なんでしょう? editboxといったらなんというか、い
かにもそれっぽい枠というか3Dっぽい影というか...がつきものだと思うのですが、どう
やったら「枠付きのeditbox」を作れるのでしょう?
スタイルにWS_BORDERを入れてみては・・・?
リソースビュー→リソース→ダイアログ→「右クリック」→「挿入」→
リソースのタイプ→ダイアログ→「IDD_FORMVIEW」でビューを作成
作成したビューへ「エディットボックス コントロール」を貼り付ける
APPWIZARDで「ダイアログベース」でない「SDI」Appなどを生成
したときは、リソースビューに「IDD_アプリケーション名_FORM」など
あるはずですけど
リソースエディタの使い方覚えておくと後々便利かも?
viewを作成するときにデフォルトのCViewではなくCFormViewを選択するとリソースエディタを
使えますが。
また、CViewでもOnCreate関数の中でCreateを使ってうまくいったことがあります。
Create ではなく CreateEx を使うという手もありますよ。
m_editbox.CreateEx(WS_EX_CLIENTEDGE, EDIT, NULL, WS_CHILD|WS_VISIBLE, CRect(
100, 100, 200, 150 ), this, 2000);
これで枠が3Dになります。
アドバイス、ありがとうございます。
sugarさん、
m_editbox.Create( WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, CRect( 100, 100, 200,
150 ), this, 2000 );
としてみました。枠が表示されました。
woodさん、
IDD_FORMVIEWを使うことで簡単にeditboxを作ることができました。ですが、appwizardで
SDIを生成してもresource viewに「IDD_アプリケーション名_FORMなど」はあり
ませんでした。なにか設定が必要なのでしょうか。リソースエディタの使い方に関しては
今後勉強していきたいと思います。
それから、とりあえず現状ではwidget(?)の最大数が実行時まで決まらないようなものは
考えていないので、formviewを利用していいのだと思います。
アイススケーターさん、
SDIのプロジェクトを新規作成する時に基本クラスの選択肢を見落としていたようです。
ここでCFormViewを選択すると、woodさんの仰る「IDD_アプリケーション名
_FORMなど」が出てきました。
へたれさん、
CreateExを使って、無事枠が表示されました。
数多くのアドバイス、非常に参考になりました。皆さんありがとうございました。今後も
何か問題にぶつかった際は頼りにさせていただくかもしれませんが、その時はよろしくお
願いします。