痔になりやすい生活習慣とは?

MFC の SDI でアプリケーション開発をしています。

当方 “Hello, world!” を学び始めて数ヶ月のビギナーです。

ドキュメント・ビュー構造では

ビュークラスからは GetDocument() 関数を使って,
ドキュメントクラスの public な領域を操作することができます。

ここで質問です。

自分の作った,独自のクラスから,ドキュメントクラスを取得する
には,どうしたらいいのでしょうか?

GetDocument() 関数はビュークラスにしか(?)備わっていないようで,困っています。

ドキュメントクラスの ID でも分かれば GetDlgItem() が使えるかもしれない(?)などと思ったのですが。

初心者につき,変な質問をしているかもしれませんが,ご教授いただけると幸いです。

A 回答 (3件)

一応、AfxGetAppでCWinApp*を持って来て、


GetFirstDocTemplatePosition/GetNextDocTemplateからCDocTemplate*を取得、
CDocTemplateからGetFirstDocPosition/GetNextDocでドキュメントまで到達しますが、
(列挙/検索が入るので)毎回特定のドキュメントが欲しいだけなら向いてません。
# SDIで事実上必ず最初のCDocTemplateとCDocumentが使えるならまだしも…。

独自クラスの役割にもよりますが、CDocumentへの参照をメンバに持つのがよさそうに思います。
もしくは、もしも独自のViewを作ってるなら継承するがよいと思いますけど、
そもそもドキュメントクラスを参照する必要自体が本当にあるのか…
用途に疑念が残ります。
    • good
    • 0
この回答へのお礼

ご回答くださり,ありがとうございます。

> そもそもドキュメントクラスを参照する必要自体が本当にあるのか…

大変,重要な盲点でした。
指摘くださり,ありがとうございます。

クラスの設計について考え直す必要がある,という結論で納得しました。

せっかくドキュメント・ビュー構造を使っているので,熟考しなおそうと思います。
あくまでも直感ではありますが,より良いデザインが思い浮かびそうです。

お礼日時:2006/12/21 23:52

独自のクラスでviewクラスを継承してしまえばよいのではないでしょうか?

    • good
    • 1
この回答へのお礼

ご回答くださり,ありがとうございます。

> 独自のクラスでviewクラスを継承

少し自分には技術的な経験が不足しているようです。
もう少し勉強して,分かることが多くなったときの参考とさせていただきます。

お礼日時:2006/12/21 23:48

メンバ変数でもしてしまえばいいのでは?


独自のクラスに対して、SetDocument()なんてやって
    • good
    • 0
この回答へのお礼

ご回答くださり,ありがとうございます。

お礼日時:2006/12/21 23:47

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

QVC++のエディットボックスの非表示

VC++で、ダイアログを作りました。
エディットボックスを置いているのですが、
このエディットボックスは始めは非表示(入力を受け付けない)にするため、
このエディットボックスのプロパティにある
"Disable"をtrueにして"Visible"もtrueにしました。

そこまではよかったのですが、
「入力」ボタンを押すと、エディットボックスが白く表示され、入力を受け付けるというようにしたいのですが、
エディットボックスのプロパティを変更する関数というのはあるのでしょうか?

いろいろ検索などをしているのですが、方法がわかりません。よろしくお願いします。

Aベストアンサー

以前、CWndクラスを使用してくださいと回答したものです。
説明がたりなくてすみません。
コントロールの親クラスは、CWndなので操作関数が使えます。


ボタン1を押すとテキスト1が活性化
void CAboutDlg::OnBnClickedButton1()
{
CWnd* pWnd = GetDlgItem(IDC_EDIT1);
pWnd->EnableWindow(TRUE);
}
こんな感じです。コントロールIDを指定して、他のコントロールの
オブジェクトハンドルも取得可能です。

QVisualStudio MFC変数が追加できない

MFCでダイアログベースのアプリ作成しています。

以前使っていたプロジェクトに変更を加えるため、
ダイアログにコントロールを追加しました。
そのコントロールに対してメンバ変数を追加しようとしたところ、
「変数の追加」ボタンが使用不可となっており、変数の追加が行えません。
また、クラスビューが表示されなくなったようで、こちらからも追加ができません。

2008を使っています。
解決方法をご教示願います。

Aベストアンサー

ソリューションを閉じてから そのソリューション内にある拡張子が『ncb』『aps』を削除してから再度ソリューションを開いて見ましょう

インテリセンス用のデータベースが壊れてしまうと質問のような現象が発生します
『ncb』ファイルなどは再度ソリューションを開くと自動的に生成されます

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

Q戻り値で構造体を返すことは可能でしょうか?

perlでは以下のように2つの戻り値が可能ですが、C言語では
それができるのでしょうか?
my (ret1, ret2) = test1();

よくやるのは、引数にポインタを渡して、内容を書き換える手を使っていますが、戻り値を複数返せたら、直感的にわかりやすいかなと思いまして・・・

Aベストアンサー

C言語から遠く離れた者ですが、

>>> よくやるのは、引数にポインタを渡して、内容を書き換える手を使っています

これが常識でしょう。これが直感的に理解できるようにC言語を身に付ける必要があるのではないでしょうか。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QCStringArray[2]のコピー

お世話になります。
VC++6.0 MFCで開発しております。

CStringArray Array1[2],Array2[2]がある状態です。
Array1に値がすでに入っている状態で一度で中身を全てコピーする
にはどのようにしたらよいでしょうか?

現在は
Array1[0].Copy(Array2[0]);
Array1[1].Copy(Array2[1]);
とわざわざ二回しているのですが、一度に[0]と[1]の中身をコピーしたいのです。

よろしくお願いします。

Aベストアンサー

一度でコピーするならそれなりの型でやる必要があると思いますよ
C/C++の配列では一度にコピーするような機能はありません

CObArrayでラップして見るぐらいでしょう

CObArray ar1, ar2;
ar1.Add( &Array1[0] );
ar1.Add( &Array1[1] );

ar2.Copy( ar1 );
といった具合でしょう ・・・

QビジュアルC++でボタンの有効/無効

ビジュアルC++でプログラミングをしているのですが、ツールから貼り付けたボタンの有効/無効を操作したのですが、何度やっても成功しません><、


ネットで検索した結果
CWnd* myWnd = GetDlgItem(IDC_MYEDIT);
myWnd->EnableWindow(TRUE);

でできると書いてあるのですが、どのサイトの物を使用してもビルドできませんでした(;ロ;)

どなたか原因がわかるかた、ご教授くださいm(__)m

Aベストアンサー

みているサンプルは
「Windows フォームアプリケーション」
で作成したプロジェクト用のものではありません。

どのタイミングで有効・無効を切り替えるかわかりませんが、
Enabledプロパティで変更できませんか?

this->button1->Enabled = false; // 無効

Control::Enabled プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.enabled.aspx

Qダイアログ間のデータ渡し

開発環境:vista Visual Studio 2012 C言語

メインのダイアログから、他のダイアログにデータを渡したい場合(もしくはその逆)は、どうすればよいのでしょうか。
受け渡しするものを、すべてグローバルにする方法は思いつくのですが、これ以外の方法ではどのようにすればよいのでしょうか。
参考になるサイトやAPIなどを教えてください。

例えば、
アプリケーションで、設定のメニューバーを押すと、ダイアログが出てきて設定をするというイメージです。この場合、ユーザが設定した値をメインのダイアログに渡しているということですよね。

Aベストアンサー

>この値をポインターとして認識させ、構造体に入れる。
>(ここの部分が分からないです。単純にアドレス渡しみたいな感じかなと思いやってみると「二項演算子 '=' : 型 'LPARAM' の右オペランドを扱う演算子が見つかりません」と出てきてしまって。)

普通にキャストするだけです。

static LPSettingData lpSD = NULL;
 case WM_INITDIALOG:
  lpSD = reinterpret_cast<LPSettingData>(lParam);

みたいな感じで。
# DialogBoxParam()で渡してましたな。私の場合。 モーダルダイアログだったので。
# モードレスダイアログの場合はCreateDialogParam()などで渡した構造体変数の寿命に注意する必要があります。
# ローカル変数のような寿命の短いモノを使うとアクセスするときには…なんてコトになりかねませんのでご注意を。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング