C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: CComboBoxの宣言でエラー


(過去ログ 55 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■31316 / inTopicNo.1)  CComboBoxの宣言でエラー
  
□投稿者/ 豆腐 (1回)-(2009/01/20(Tue) 14:30:40)

分類:[C/C++] 

どなたか教えてください。

OS:WindowsXP Professional Edition
環境 :Visual C++ 2003

---------------------------------------------------
【経緯】
Win32プロジェクトを使ってアプリケーションを作成しています。
その中でコンボボックスの使用可/不可を動的に変更しなければならないで、CComboBoxを使う為にafxwin.hをインクルードしました。

#include <stdafx.h>
#include <afxwin.h>

ところがどうしても「WINDOWS.H already include」のエラーになる為、原因を追求するとstdafx.hとwindows.hのインクルードが被っている為のようでした。
試しにafxwin.hをstdafx.hの前にインクルードした所、今度は「CComboBox 定義されていない識別子」というエラーになってしまいます。

#include <afxwin.h>
#include <stdafx.h>

MSDNを見る限りはafxwin.hのインクルードでいけるかと思っていたのですが…
また、stdafx.hはコメントアウトすると「予期せぬEOF」というエラーになってしまい、お手上げ状態です。

稚拙な説明で申し訳ありませんが、どなたか原因・解決法を教えていただけませんでしょうか。

宜しくお願いします。
引用返信 編集キー/
■31320 / inTopicNo.2)  Re[1]: CComboBoxの宣言でエラー
□投稿者/ επιστημη (1545回)-(2009/01/20(Tue) 14:48:21)
επιστημη さんの Web サイト
#include <stdafx.h> だけじゃダメすか? どんなふぅにダメすか?


引用返信 編集キー/
■31321 / inTopicNo.3)  Re[1]: CComboBoxの宣言でエラー
□投稿者/ 774RR (291回)-(2009/01/20(Tue) 14:48:33)
この辺 Microsoft のプリコンパイルヘッダーの仕様が直感的でない部分であるので、
マニュアルを読んでもよく理解できない場合があるというかなんというか。

とりあえず以下のことを覚えておくといい
・ #include <stdafx.h> はまず確実に間違い。
  #include "stdafx.h" なら正しい
・ #include "stdafx.h" は最初の #include にすること。
 この前に何か #include したり #define したりしても無効になってしまう
・afxwin.h などを #include したかったら stdafx.h の中で行うこと

で、本題のほうなんだけど、
既に stdafx.h の中で #include <afxwin.h> されている
(だから2回 #include する必要は無い)
に1票。

でも何か微妙に気になる文言があるので確認。

> Win32プロジェクトを使ってアプリケーションを作成しています。
> ところがどうしても「WINDOWS.H already include」のエラーになる為、
MFC を使う設定なの?
MFC を使わない設定なの?

MFC を使わない設定で作成開始したアプリケーションでは windows.h を使うけれども、
MFC を使う設定で作成開始したアプリケーションでは windows.h は使っちゃダメ。

MFC を使わない設定で作成開始したアプリケーションで、
途中から一部だけ MFC を導入して CComboBox を使おうとしている、のであれば
そりゃ基礎設計の段階でサポートされていない変則方式であるため、まず無理。

引用返信 編集キー/
■31322 / inTopicNo.4)  Re[1]: CComboBoxの宣言でエラー
□投稿者/ 豆腐 (2回)-(2009/01/20(Tue) 14:48:54)
追記※

申し訳ありません、肝心のCComboBoxの宣言が抜けておりました。

void MakeComBoBox()
{
CCBomboBox *cmb;

}

出鼻をくじかれたのでまだこれだけです。

宜しくお願いします。
引用返信 編集キー/
■31326 / inTopicNo.5)  Re[2]: CComboBoxの宣言でエラー
□投稿者/ 豆腐 (3回)-(2009/01/20(Tue) 15:02:50)
No31320 (επιστημη さん) に返信

> #include <stdafx.h> だけじゃダメすか? どんなふぅにダメすか?

お返事ありがとうございます。

「'CComboBox' 定義されていない識別子」というエラーです。
コンパイルも通らない状態です。
MSDNでは「afxwin.h」をインクルードしろと書いてあったのでそれが原因かと思いました。
引用返信 編集キー/
■31328 / inTopicNo.6)  Re[2]: CComboBoxの宣言でエラー
□投稿者/ 豆腐 (4回)-(2009/01/20(Tue) 15:11:40)
No31321 (774RR さん) に返信
> この辺 Microsoft のプリコンパイルヘッダーの仕様が直感的でない部分であるので、
> マニュアルを読んでもよく理解できない場合があるというかなんというか。
> > とりあえず以下のことを覚えておくといい
> ・ #include <stdafx.h> はまず確実に間違い。
>   #include "stdafx.h" なら正しい
> ・ #include "stdafx.h" は最初の #include にすること。
>  この前に何か #include したり #define したりしても無効になってしまう
> ・afxwin.h などを #include したかったら stdafx.h の中で行うこと
> > で、本題のほうなんだけど、
> 既に stdafx.h の中で #include <afxwin.h> されている
> (だから2回 #include する必要は無い)
> に1票。
> > でも何か微妙に気になる文言があるので確認。
> >>Win32プロジェクトを使ってアプリケーションを作成しています。
>>ところがどうしても「WINDOWS.H already include」のエラーになる為、
> MFC を使う設定なの?
> MFC を使わない設定なの?
> > MFC を使わない設定で作成開始したアプリケーションでは windows.h を使うけれども、
> MFC を使う設定で作成開始したアプリケーションでは windows.h は使っちゃダメ。
> > MFC を使わない設定で作成開始したアプリケーションで、
> 途中から一部だけ MFC を導入して CComboBox を使おうとしている、のであれば
> そりゃ基礎設計の段階でサポートされていない変則方式であるため、まず無理。
>


詳しいご説明ありがとうございます。
現状ではMFCは使っていません。
しかしまだ取り掛かったばかりなので必要であれば再設計します。
コンボボックスのスタイルを変更する為にMFC以外の方法があれば教えていただけると助かります。

コンボボックスは下記のように定義しています。

hCombo = CreateWindow("COMBOBOX", "",
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
5, 30, 200, 100, hWnd,
(HMENU)(LPARAM)ID_COMBO, hInstance, NULL);

引用返信 編集キー/
■31334 / inTopicNo.7)  Re[3]: CComboBoxの宣言でエラー
□投稿者/ 774RR (292回)-(2009/01/20(Tue) 15:38:41)
そのコードは典型的 [MFC を使わない] Win32プロジェクトのコードだね
MFC を使わない設定で作成開始したプロジェクトでは windows.h を使う。
そして windows.h を使っている状態では MFC は使えない。

CComboBox は MFC のクラスなので [MFC を使う] プロジェクトでないと使えないよ。

対応策はいくつか考えられるわけだけど
・「MFC を使いたい」→ [MFC を使うプロジェクト] で最初からやり直し
・「MFC はあきらめる」→現状の Win32 プロジェクトのままいく
どっちにする?

MFC をつかわない、として、とりあえず ComboBox の使用可能/不可能、ってのに
具体的にどんな動作になることを期待しているのか読み取れないんだけど
EnableWindow とか?

っていうかいまどき vs2003 なわけ?
vs2008 + C# FormApp のほうが多分手っ取り早い可能性が高い・・・と思う・・・

# 全文引用はやめてね
引用返信 編集キー/
■31339 / inTopicNo.8)  Re[4]: CComboBoxの宣言でエラー
□投稿者/ 豆腐 (5回)-(2009/01/20(Tue) 15:54:47)
No31334 (774RR さん) に返信

> ・「MFC を使いたい」→ [MFC を使うプロジェクト] で最初からやり直し
> ・「MFC はあきらめる」→現状の Win32 プロジェクトのままいく
> どっちにする?
では、できれば使わないやり方を教えて頂けると助かります。
【理由】調べてみると、MFCを使った解決は色々見つかったのですが(現状は躓いてますが)、CComboBoxを使わない方法は中々見つからない為です。あと最初からやり直すのが面倒というのも正直ありますが。。

> 具体的にどんな動作になることを期待しているのか読み取れないんだけど
まず仕様としては、コンボボックスに持たせるリストを、同じフォーム内にある他のコントロールから動的に作成します。
例えば、radiobuttonAで選ばれた値とcheckboxCでtrueになっている値に紐付くデータをmapから呼び出しコンボボックスに与えるといった感じです。
つまり、抽出条件が変わるたびに、コンボボックスを開くと値が変わっているというものです。
また、コンボボックスの初期状態はDISABLEDで、
同じフォーム内にあるradioAとradioBの両方が選択されたタイミングでEnableとするといった感じです。

> > っていうかいまどき vs2003 なわけ?
> vs2008 + C# FormApp のほうが多分手っ取り早い可能性が高い・・・と思う・・・
確かに「いまどき」ですね。。
ただ、まだVC++がよくわかってない段階なので、いまvs2008にしても完成する頃にはvs2010になってるかも。。。
(頻繁に極端なVerアップし過ぎな気がするのは素人の考えかもしれませんが)

> > # 全文引用はやめてね
すいませんでした、以後気をつけます。
引用返信 編集キー/
■31340 / inTopicNo.9)  Re[1]: CComboBoxの宣言でエラー
□投稿者/ とっちゃん (363回)-(2009/01/20(Tue) 15:58:08)
とっちゃん さんの Web サイト
No31316 (豆腐 さん) に返信
> 【経緯】
> Win32プロジェクトを使ってアプリケーションを作成しています。
> その中でコンボボックスの使用可/不可を動的に変更しなければならないで、CComboBoxを使う為にafxwin.hをインクルードしました。

774RRさんがすでに答えてますが...

ウィンドウの使用可・不可なら、EnableWindow APIでいけますよ。
コンボボックスでも、リストボックスでも、エディットでも HWND があるならどんなウィンドウでも使えます。
ってか、コンボだからCComboBoxというのが出てきた背景がわからんので何とも言えませんが、
Nativeじゃないとだめだ!というのなら、MFC使ったほうがいい気がします。

いずれにしても、なぜ「CComboBox」を使おうとしたのか?をきちんと考えてみる必要はありそうです。
HWND では何か困ったんですよね?

その辺をよく考えて、■31334 に書かれている対策を検討してみるとよいと思いますよ。

引用返信 編集キー/
■31347 / inTopicNo.10)  Re[2]: CComboBoxの宣言でエラー
□投稿者/ 豆腐 (6回)-(2009/01/20(Tue) 16:34:41)
No31340 (とっちゃん さん) に返信

> > ウィンドウの使用可・不可なら、EnableWindow APIでいけますよ。
> コンボボックスでも、リストボックスでも、エディットでも HWND があるならどんなウィンドウでも使えます。
> ってか、コンボだからCComboBoxというのが出てきた背景がわからんので何とも言えませんが、
> Nativeじゃないとだめだ!というのなら、MFC使ったほうがいい気がします。
> > いずれにしても、なぜ「CComboBox」を使おうとしたのか?をきちんと考えてみる必要はありそうです。

申し訳ありません、説明が不足していました。
「使用不可の際はコンボボックスの背景色をグレーにする」という事をお伝えするのを忘れていました。
EnableWindowでは実現できない為、CComboBoxを考えました。
引用返信 編集キー/
■31348 / inTopicNo.11)  Re[5]: CComboBoxの宣言でエラー
□投稿者/ 774RR (293回)-(2009/01/20(Tue) 16:43:20)
EnableWindow は「触れなくする」機能もあるわけで、ちゃんとマニュアル読んだ?

っていうかたぶん、マニュアル(MSDN)の読み方がわかっていないんだろう。
MSDN を読む際に EnableWindow が複数個ヒットするんだが、今つかわなきゃならないのは
Win32SDK / API リファレンスの ::EnableWindow なわけだ。
http://msdn.microsoft.com/ja-jp/library/cc410790.aspx

同時にヒットする CWnd::EnableWindow だけ見ちゃうと CWnd* が必要と思っちゃうわけ。
http://msdn.microsoft.com/ja-jp/library/5kbfsahf.aspx

ちなみに CWindow::EnableWindow っつーのも見つかるけどこれは ATL 。
http://msdn.microsoft.com/ja-jp/library/5a6y4t2b.aspx

Win32 Native SDK の流儀
HWND なブツなら "COMBOBOX" だろうが "BUTTON" だろうが ::EnableWindow できる。

MFC の流儀
CWnd なブツなら CComboBox だろうが CButton だろうが CWnd::EnableWindow できる。

ってだけの話なわけで、逆にその辺の理解が怪しいようならこの先はかなり *長い* と思う。

今はまずきっちり入門書読むべきレベルなんぢゃないかなーと思うわけよ。
援助したくないって言ってるわけぢゃなくて、そのほうがたぶん速く理解できるだろうと思う。
引用返信 編集キー/
■31359 / inTopicNo.12)  Re[6]: CComboBoxの宣言でエラー
□投稿者/ 豆腐 (7回)-(2009/01/20(Tue) 17:57:40)
No31348 (774RR さん) に返信

> > 今はまずきっちり入門書読むべきレベルなんぢゃないかなーと思うわけよ。
確かにそうかもしれません。
もう一度基本から勉強してみます。

本題の解決はしませんでしたがためになりました。
色々と有難うございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -