C言語(SDK)で、記述されたソースコードを
C++(MFC)で記述したいのですが、

ダイアログベースでSDKだとEnableWindowなどの
処理が増えて、バグの要因となってしまい自分自身で
最後は状態が分からなくなってしまうことがあります、
それで、MFCにして処理を減らそうと思いました。

基本的にはXXXDlg.cppに書きますが、
関数だけのファイルをMFCとして書き換えたいのですが、
メンバを使うことができません。
XXXDlg.hをincludeしたのですが、駄目でした。
どのようにしたらよろしいのでしょうか?

A 回答 (2件)

こんにちは。

itohhといいます。

>関数がたくさん作ってあるので、
>取りあえずはそのまま暮らすメンバにして
>使ってみようと思うのですが、
>駄目なやり方でしょうか?

出来ますが...
あんまり、お奨めは出来ません。
(一つのクラスにPublicのメンバ関数としておいて、そのクラスのobjectを作成(newを使用)して使用する)

なぜなら、ぜんぜん、クラス設計がデタラメになってしまう可能性があるからです。
まずは、クラスのことを勉強されることをお奨めします、それから、既存の関数をどのように生かすかを考えた方が良いのではないでしょうか?
    • good
    • 0

 MFCに移植って事は、どちらの事を指しているのでしょうか?



1)MFCを使用したプログラムに生Cのソースを移植したい。

2)プログラムをクラス化したい。

---
1の場合には、すべての関数を、ダイアログのメンバ関数として新規に作り直して、組込み直せばOKです。
しかし、処理の軽減には繋がらないと思います。クラスCE設計を行って、作り直すつもりで居ないと、処理が繁雑になるだけです。

2の場合には、頑張って下さい。設計からのやり直しが必要になります。

この回答への補足

(1)と(2)の両方をしたいのです。

関数がたくさん作ってあるので、
取りあえずはそのまま暮らすメンバにして
使ってみようと思うのですが、
駄目なやり方でしょうか?

補足日時:2001/05/24 17:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVC++ MFC エラーコード C2248 private メンバ (クラス 'CObject'で…

VC++ MFC エラーコード C2248


現在、ダイアログAにあるコンボボックス(IDC_COMBO1)に単語を登録、削除する処理をしています。

ダイアログAには他に[登録]ボタン(IDC_BUTTON1)と[削除]ボタン(IDC_BUTTON2)があります。

IDC_COMBO1 を CComboBox m_combo;

として

// [登録]ボタン押下時
void CADlg::OnBnClickedButton1()
{
CString Txt, old;
int ret = 0, count = 0, i;

m_combo.GetWindowText(Txt);

if ( strcmp(Txt, "") == 0 ) {
AfxMessageBox( _T("語句を入力してください"));
return;
}
// コンボボックスのリスト数取得
count = m_combo.GetCount();

for(i = 0; i < count; i++){
// IDC_COMBO1に登録済みの語句を順番に調べていく
m_combo.GetLBText(i, old);

// 既に登録済みの名前があった場合
if (oldFile == Txt){
ret = MessageBox( _T("上書きしますか?"), _T("語句登録"), MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 );
}
}

if ( ret == IDYES ) {
return;

} else if ( ret == IDNO ) {
// 後ほど説明します
CBDlg dlg;
dlg.DoModal();
m_combo1.AddString(NewName);// extern CString NewName;←グローバル変数(Bダイアログから)
return;
}

// 登録されていない語句の場合
m_combo.AddString(Txt);
}

上記の登録の方、エラーなくコンパイルがとおり、コンボボックスにもちゃんと格納されています。

削除の方もエラーなくちゃんとコンボボックスから削除されます。


次に
>else if ( ret == IDNO )
の部分なのですが

[いいえ]ボタン(IDNO)が押された場合にはダイアログBが表示されます。

ダイアログBには語句を入力するエディットボックスIDC_EDIT1、[登録]ボタン(IDC_TOUROKU)、[取り消し]ボタン(IDC_TORIKESI)があります。

IDC_EDIT1 を CEdit m_ed1;

として

ここのBダイアログでもAダイアログ中のコンボボックスに格納されている語句が入力された場合はメッセージボックスを表示したいのです。


そこで


void CBDlg::OnBnClickedTouroku()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
int rup, cnt, ret;
CString oldf;
CADlg cad;

CComboBox cfdn = cad.m_combo;

m_ed1.GetWindowText(NewName);// CString NewName;←グローバル変数

// Aダイアログ中のコンボボックスリスト数の取得
cnt = cfdn.GetCount();

for(rup = 0; rup < cnt; rup++){

// Aダイアログのコンボボックス中に登録されている語句取得
cfdn.GetLBText(rup, oldf);

if (oldf == NewName){
ret = MessageBox( _T("本当に上書きしてもいいですか?"), _T("環境設定"), MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 );
}
}

if(ret == IDOK){
OnOK();
}
else{
return;
}
}

としました。

ここでコンパイルすると

1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(1820) : error C2248: 'CObject::CObject' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。
1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(558) : 'CObject::CObject' の宣言を確認してください。
1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(529) : 'CObject' の宣言を確認してください。
1> コンパイラでのこの診断により関数 'CCmdTarget::CCmdTarget(const CCmdTarget &)' が生成されました。

のようにエラーがでます。

調べてみると

CComboBox cfdn = cad.m_combo;

が原因のようです。

ググってみたりしたのですが解消法がわからず質問させていただきました。

よろしくお願いします。

VC++ MFC エラーコード C2248


現在、ダイアログAにあるコンボボックス(IDC_COMBO1)に単語を登録、削除する処理をしています。

ダイアログAには他に[登録]ボタン(IDC_BUTTON1)と[削除]ボタン(IDC_BUTTON2)があります。

IDC_COMBO1 を CComboBox m_combo;

として

// [登録]ボタン押下時
void CADlg::OnBnClickedButton1()
{
CString Txt, old;
int ret = 0, count = 0, i;

m_combo.GetWindowText(Txt);

if ( strcmp(Txt, "") == 0 ) {
AfxMessageBox( _T("語句を入力してください"));
...続きを読む

Aベストアンサー

 こんにちは。補足頂きました。
 大変、すんません、CBDlgクラスのコンストラクタ内でCDialog(CBDlg::IDD, pADlg)を呼び出していませんでした。

CBDlgのソースファイルで、
/////////////////////////////////////////////////////////////////////////////
// CBDlg ダイアログ
CBDlg::CBDlg(CADlg* pADlg) : CDialog(CBDlg::IDD, pADlg), m_pADlg(pDlg)
{
//{{AFX_DATA_INIT(CBDlg)
// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
//}}AFX_DATA_INIT
}

 の様にして、DoModal()で動作しませんか。
 「Debug Libraly」のメッセージボックスが表示されるのは、此れが原因でした(当方の方でも確認)。

QMFC・ダイアログベースで、ダイアログの変更内容が反映されない・・・

初めて質問させていただきます。よろしくお願いします。

当方、VisualStdio2005内のC++2005で、
ダイアログベースにてツールを開発していました。

ある日、ダイアログ上に多くのEditコントロールを作成(追加)することになり、
ダイアログリソースをVC内のリソースエディタにて、
テキスト形式でコントロールを追加していきました。

そのときは、テキストでの変更内容がダイアログにも反映されていたのですが、
その後はダイアログにツールボックスでのコントロールの追加やサイズ変更など、
見た目には反映されてもビルド後に反映されなくなってしまいました。

クリーン後のリビルドでも、問題は解決しません。

原因と対策をご存知の方、いらっしゃいましたらご教授いただけませんでしょうか。

よろしくお願いします。

Aベストアンサー

VC2005は初心者です。VC6.0は仕事で使っていました。

私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。

回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか?

以下、回答です。

ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?変更対象のダイアログとビルド後の実行したダイアログが違っているなんてことがあったりします。

上記のような間違いがなければ、Editコントロールを1つだけにしてビルド&実行してみてください。それで問題があれば、Editコントロールの書き方に問題があるかも?(いや、その場合はコンパイルでエラーになるはずだけど)。問題がなければ、Editコントロールを1つずつ増やしてビルド&実行する。ある程度増やしたら、思い切って半分くらい増やしてみたりしてもいいと思います。

VC2005は初心者です。VC6.0は仕事で使っていました。

私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。

回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか?

以下、回答です。

ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?...続きを読む

QDirectX9.0SDK(2005August)でのcppファイルの追加について・・・

こんばんは、このたびはDirectX9.0のSDK(2005August)をインストールし、早速開発しています。

そこで分からないことがあるので質問させていただきます。

大きなプログラムを作るときって、機能ごとにファイルに分けますよね。で、プログラムを分けるときって、~.cppと~.hをセットみたいに作りますよね?
普段はこれでプログラムの分割もできるのですが

今回、SDKについているCommonフォルダ内のファイルを使ったサンプルに、自分で作ったプログラムを追加していった結果、コンパイル時にcppファイルで必ず「プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。」というエラーが発生してしまいます。(なぜかメイン関数のあるcppファイルではそのエラーは出ないのですが・・・)

この原因と解決法について、どなたかご存知でしたら回答をお願いいたしますm(_ _)m
分かりづらい質問ですみません^^;

Aベストアンサー

そのcppファイルの一番上にstdafx.hを追加してみてください。
多分それで直ります。

プロジェクトの設定の中で「プリコンパイル済ヘッダを使用する」といった項目がオンになっています。
それが原因です。
小規模なプログラムだとわかりませんが大規模な例えば市販のゲーム等は
フルコンパイルすると1時間以上かかったりします。
とくにC++のコンパイルはヘッダの解析に時間がかかるのです。
そこでヘッダをコンパイルしやすい形で保持しておき、何度も解析されるのを
避けるようにする仕組みで使われているわけです。

http://japan.linux.com/desktop/03/12/03/1327232.shtml

QVisual C++ Toolkitでcppをコンパイルすると・・

最近質問が多くてすみません。
一応調べてみましたが、同じような質問が既存ならば警告お願いします。

#include <iostream>
int main(){
return 0;
}

これだけのファイルを、例えばtest.cppとして保存します。そして
cl test.cpp
とすると、ぶわーっと警告(warning)がでて、しかしtest.exeができあがります。
警告内容がかなり長いので、そのうちの1つを載せます。
C:\Program Files\Microsoft Visual C++ Toolkit 2003\include\stdexcept(39) : see reference to class template instantiat
ion 'std::basic_string<_Elem,_Traits,_Ax>' being compiled
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]

意味がわかりません!!
ちなみに、bccでは警告なしにコンパイルできます。

最近質問が多くてすみません。
一応調べてみましたが、同じような質問が既存ならば警告お願いします。

#include <iostream>
int main(){
return 0;
}

これだけのファイルを、例えばtest.cppとして保存します。そして
cl test.cpp
とすると、ぶわーっと警告(warning)がでて、しかしtest.exeができあがります。
警告内容がかなり長いので、そのうちの1つを載せます。
C:\Program Files\Microsoft Visual C++ Toolkit 2003\include\stdexcept(39) : see reference to class template instantiat
ion '...続きを読む

Aベストアンサー

-GX を指定して下さい。と書かれていませんか?

cl -GX test.cpp

QVC++ .Net2003 SDKプログラムからMFCプログラムへの移行

VC++ C初心者です
自社開発した画像形式の画像を表示するViewerを作成する事になり
SDKで開発を進めていましたが、MFCの方が開発効率が
良さそうなので、必要な部分(ファイルからPixcel単位のRGB値を読み書きする処理)を部品化してヘッダファイル・CPPファイルにまとめてMFCフォームへ移行を始めました

開発環境は
VC++ .Net2003です

上司からMFCベースの簡易Viewer「SimpleImage」(多分マイクロソフトのHPから拾って来たソースと思います)
を受け取り、元プログラムの主要な部分を関数にまとめて移行を始めたのですが、

ビルドでエラーが2つ発生して、先に進めなくなりました

〓エラー(1)〓
SimpleImage fatal error LNK1120: 外部参照 1 が未解決です。

〓エラー(2)〓
SimpleImage error LNK2019: 未解決の外部シンボル
"class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >
__cdecl GetUseFicFileName(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >)
" (?GetUseFicFileName@@YA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V12@@Z) が関数 "
public: void __thiscall CChildView::OnFileOpenimage(void)" (?OnFileOpenimage@CChildView@@QAEXXZ) で参照されました。







移行先のメインCPP内部で「私が作ったファイル
(以後、"abc.h"・"abc.cpp"と呼びます)includeを追記してビルドする処までは、問題無かった(ビルドが出来た)のですが、


メインのCPPファイル内で"abc.h"に記載された関数を呼び出そうとすると上記2つのエラーが出力され、先に進めない状況です


多分、ライブラリ等の参照先が上手に行なえていないのかと思っているのですが、初心者で原因が
まるで特定できないので質問させて戴きました


皆様!助言お願いしますm(__)m

VC++ C初心者です
自社開発した画像形式の画像を表示するViewerを作成する事になり
SDKで開発を進めていましたが、MFCの方が開発効率が
良さそうなので、必要な部分(ファイルからPixcel単位のRGB値を読み書きする処理)を部品化してヘッダファイル・CPPファイルにまとめてMFCフォームへ移行を始めました

開発環境は
VC++ .Net2003です

上司からMFCベースの簡易Viewer「SimpleImage」(多分マイクロソフトのHPから拾って来たソースと思います)
を受け取り、元プログラムの主要な部分を関数にまとめて移行...続きを読む

Aベストアンサー

>#include <atlstr.h>

おそらく不要でしょう。


MFCでは、デフォルトでstdafx.hというプリコンパイル済みヘッダを使用しています。
このため、ウィザードで作成分を含む各ソースでは、
#include "stdafx.h"
と、インクルードする必要があります。

個別のcppファイルでライブラリ等のヘッダをインクルードは基本的に行いません。ライブラリのヘッダを追加したい場合はstdafx.hに追記していきます。


人気Q&Aランキング

おすすめ情報