他のView(CListView、CFormView等) にアクセスする方法 (2006.11.18)


1.アプリケーションクラスのパブリックメンバとして操作するビューのポインタ変数を定義、CSsView.hもinclude。
class CSsApp : public CWinApp
{
public:
 CSsApp();
 CSsView *view; // コレ。

2.該当するビューのOnInitialUpdate()辺りに下記を記述。
// includeも必要。
#include "ssDoc.h" // ドキュメントクラスヘッダも必要かも。
#include "ssView.h"

void CSsView::OnInitialUpdate()
{
 CSsApp *ap = (CSsApp *)AfxGetApp();
 ap->view = this; // 1で追加したアプリケーションクラスのメンバに自分のアドレスを書き込み。

以上。使い方は
 CSsApp *ap = (CSsApp *)AfxGetApp(); // ap変数で今後アプリケーションクラスへアクセスする。

 // 該当viewにあるIDC_BUTTON1 にアクセス。
 // apからviewポインタのGetDlgItemメンバで IDC_BUTTON1にアクセス。(変な日本語)
 CButton *v=(CButton *)ap->view->GetDlgItem(IDC_BUTTON1);
 v->SetWindowText("AAA"); // ボタンにAAAと書く。
 v->EnableWindow(FALSE); // ボタンを使用不可にしたり後は何時もの使い方。

 CWnd *cb=(CWnd *)ap->view->GetDlgItem(IDC_EDIT1); // CWnd型でアクセス。非表示に変更。(未確認)
 cb->ShowWindow(SW_HIDE);

 パブリックメンバ関数にもアクセスできます。
 ap->view->test();

応用、
 CDC *cd = v->GetDC(); // ボタンのデバイスコンテキスト取得
 cd->MoveTo(0,0); // ボタンの0,0にペンを移動
 cd->LineTo(10,10); // 10,10の位置まで線を引く
 ReleaseDC(cd); // CDC開放

これでボタンに線が引けます。他の使用法はCDCのメンバを調べて下さい。