• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:AxtiveXについて質問させてください。)

VB6のFormでコントロールモジュールの大きさを変えたら、連動コントロールの大きさを変える方法はあるか教えてください

このQ&Aのポイント
  • VB6のFormでコントロールモジュールの大きさを変えた場合、連動するコントロールの大きさも変更する方法について教えてください。
  • 参考記事によると、ダイアログベースのocxを作成し、VB6のFormにコントロールモジュールを貼り付けたときは問題なく表示されるそうですが、コントロールモジュールの大きさを変更した場合に、ダイアログやダイアログ上のコントロールモジュールの大きさも自動的に変更させる方法がわかりません。どのような方法があるでしょうか?
  • GetWindowRect()やGetClientWindowRect()を試したりしましたが、うまくいきませんでした。VBのForm上でコントロールモジュールの大きさを変えた時に連動するコントロールの大きさも変更させる方法があれば、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sygh
  • ベストアンサー率76% (42/55)
回答No.1

リサイズ イベントが発生する(WM_SIZE メッセージが投げられる)ので、WM_SIZE のメッセージ ハンドラ void OnSize(UINT nType, int cx, int cy) の中で、パラメータ cx, cy に応じてダイアログなどをリサイズしてみてください。 メッセージ ハンドラは VC++ 2008 の場合、プロパティ ウィンドウを使って追加します。 なお、CWnd のメンバー関数、SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER) を使えば、位置とZオーダーを変えずにサイズだけ変更できます。

wantsinc
質問者

補足

お返事遅れて申し訳ありません。 sygh様の回答のOnSizeの件ですが私もそれはやってみたのですが、 OnSize内にブレークポイントを設定したところ、1度だけOnSizeに来ましたが、 その後はサイズを変更してもOnSizeに来ませんでした。 ちなみに、私はVB6のプログラミング画面(用語として正しい?)でコントロールの大きさを変えたら 表示されている文字の大きさを変更するようなことをしたいと思っています。 こういうことはできないのでしょうか?それとも私の考え方がおかしいのでしょうか? デバッグは以下のように行っています。 VC++2008でプログラムミングして作成したocxをVB(Puroject.exe)に置き、 VC++からデバッグ(Puroject.exe)を呼び出しています。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sygh
  • ベストアンサー率76% (42/55)
回答No.2

回答No.1の補足です。 ダイアログ派生クラスのOnSize()ではなく、OLEコントロール派生クラスのOnSize()内にブレークポイントを置いてみてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Cwndクラスの派生クラスmCWndクラスのOnDrawについて

    OnDraw関数が呼び出しされていません。 どうすればいいですか? よろしくお願いします。 class mCWnd :public CWnd { public: DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags,CPoint point) { AfxMessageBox("子ウインドウ"); CDC *pDC=GetDC(); pDC->TextOut(0,0,"HELLO"); ReleaseDC(pDC); Invalidate(); } virtual void OnDraw(CDC* pDC) { AfxMessageBox("OnDraw"); pDC->FillSolidRect(CRect(0,0,300,300),RGB(255,255,255)); } }; BEGIN_MESSAGE_MAP(mCWnd, CWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() ------------------------------------------- //***View.cpp (mCWnd cw) void CKoDlg::OnBnClickedButton1() { CRect rect=CRect(50,50,190,250); cw.Create(NULL,"Hello",WS_CHILD|WS_VISIBLE,rect,this,5000,0); // TODO : ここにコントロール通知ハンドラ コードを追加します。 }

  • VB2008によるOCX作成、またはHTMLからのDLL呼び出しは可能でしょうか?

    こんにちは。 はじめての投稿になります。 私は現在、「ファイルを開く」のコモンダイアログボックスを起動できるHTML画面を作りたいと思っております。 その画面ではサーバ側のファイルを閲覧させたいのですが、認証やセキュリティなどの観点から、 ダイアログボックスの起動はクライアント側で動作するようにしたいです。 それにあたって、ダイアログボックスを呼び出すオブジェクトをAxtiveXコントロール(OCX)で作成し、 そのOCXをHTMLから呼び出すことで実現できないかと考えました。 そこで、以下のことを調べております。 (1)無償のVB開発環境を使ってAxtiveXコントロールを作成することができるか? (2)AxtiveXコントロールを作成できないなら、AxtiveX DLLをHTMLから呼び出せるか? ちなみに現在使用している「無償のVB開発環境」は、Visual Studioの Visual Basic 2008 Express Edition です。 (1)に関しては、VB6ではAxtiveXコントロールを作成できたと聞きますが、どうもVB2008では(.Netでは)作成できないようです。(現在までに見つけた情報に、「.Netで作成できる」というものがないため) (2)に関しては、VB2008 Express Edition を使って、ダイアログボックスを呼び出す AxtiveX DLL を作成することには成功しています。 VBのCOMクラスのテンプレートにダイアログボックス起動の関数を記述し、ビルドしてdllを作成。 ↓ 別途VBによるWindowsフォームアプリケーションを作成し、「参照の追加」で上記dllを登録してダイアログボックス起動の関数を呼び出す。 という方法で、ダイアログボックスを呼び出せました。 ですので、HTMLの画面からも同じようにdll呼び出しができないかと思ったのですが、現在のところ方法が見つかりません。 ダイアログボックスを開く機能さえあればよく、ユーザーインターフェースは不要なので AxtiveX DLL でもよいと思ったのですが、HTMLからの呼び出しにはDLLではなくOCXを用いるという情報しか見つけられませんでした。 以上のことから、VB2008ではHTMLからダイアログボックスを呼び出すActiveXを作れないのではないか?と思える状態なのですが、それが可能であるという話がもしありましたら、お教えいただきたく思います。 最低限「クライアント側からのダイアログボックス起動ができるHTML」「ダイアログボックス起動はVBで作成」という条件を満たせればよいので、(1)(2)で実現できなければ別の方法を探すことにします。 最後に 必要かどうかわかりませんが、(2)で試しに作ったダイアログボックス呼び出しのCOMクラスのソースを載せておきます。 ご回答の参考になりますでしょうか。 Imports System.Windows.Forms <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ Public Class ComClass1 Public Const ClassId As String = "2bdd38a4-f946-44e2-af47-5b9cbd2c24d5" Public Const InterfaceId As String = "fcd22890-f4cd-4e2a-b8c0-ae83f290c250" Public Const EventsId As String = "86c74809-966a-47cf-9324-adce776030eb" Public Sub New() MyBase.New() End Sub Public Function subOpenFile(ByVal inFilePass As String) As Boolean subOpenFile = False 'OpenFileDialogクラスのインスタンスを作成 Dim ofd As New OpenFileDialog() If inFilePass = "" Then ofd.InitialDirectory = "C:\" Else ofd.InitialDirectory = inFilePass End If ofd.Filter = "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル(*.*)|*.*" ofd.FilterIndex = 2 ofd.Title = "開くファイルを選択してください" ofd.RestoreDirectory = True ofd.CheckFileExists = True ofd.CheckPathExists = True 'ダイアログを表示 If ofd.ShowDialog() = DialogResult.OK Then Console.WriteLine(ofd.FileName) End If subOpenFile = True End Function End Class (呼び出し側では以下の記述で呼び出しに成功しました) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Test As New COMTest1.ComClass1 Call Test.subOpenFile("C:\WINDOWS") End Sub 以上、よろしくお願いいたします。

  • CFromViewの OnDrawメソッドについて

    MFC初心者です。VC2005でグラフィックスに挑戦しております。 まだよくクラスとか、MFCの作法などしらないのでトンチンカンな質問をしますが、 ドキュメント(で正しいでしょうか?)がCViewクラスの場合、 OnDraw(CDC* pDC)が定義されていたので、直接そこに描画コードを書きましたが、 CFromViewクラス(コントロール可能)の場合、 OnDraw(CDC* pDC)が見当たりませんので、定義にvoid OnDraw(CDC* pDC)を追加し、 以下のようにメソッドを追加して、無理やり表示させました。 この方法は普通でしょうか? void CtestView::OnDraw(CDC* pDC) { CBrush myBrush; CBrush* pOldBrush; myBrush.CreateSolidBrush(RGB(255,0,0)); // ソリッドブラシの作成 pOldBrush = pDC->SelectObject(&myBrush); // myBrushを選択 pDC->Ellipse(60,10,160,110); pDC->SelectObject(pOldBrush); // 元に戻す myBrush.DeleteObject(); // ブラシを削除 } //--------------------------------------------------- 以下クラス定義部 class CtestView : public CFormView { protected: // シリアル化からのみ作成します。 CtestView(); DECLARE_DYNCREATE(CtestView) public: enum{ IDD = IDD_test_FORM }; // 属性 public: CtestDoc* GetDocument() const; // 操作 public: // オーバーライド public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。 // 実装 public: virtual ~CtestView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif void OnDraw(CDC* pDC); /////////////////////////// ←勝手に追加 protected: // 生成された、メッセージ割り当て関数 protected: DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // testView.cpp のデバッグ バージョン inline CtestDoc* CtestView::GetDocument() const { return reinterpret_cast<CtestDoc*>(m_pDocument); } #endif

  • ダイアログの領域全てをエデイトボックスが占めるプログラム

    お世話になります。 現在ダイアログにエディトボックス(IDC_EDIT1)を1つおいて、このエディトボックスがダイアログの全体を占める様なプログラムを作成しています。 以下のようなプログラムでは、サイズ変更をした時に初めてダイアログ内にエディトボックスが動的に占めるのですが、これをプログラムを起動したときから既にエディトボックスがダイアログの全体を占めている状態にしたいのですが、どのようにすればよいでしょうか? 開発環境はVC++ 6.0 MFC WindXPです。 ご教示よろしくお願いします。 プログラム: void CxxxDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください CRect rect; CWnd* pEdit = GetDlgItem( IDC_EDIT1 ); GetClientRect(&rect); if( pEdit != NULL ) { rect=CRect(0,0,cx,cy); pEdit->MoveWindow( &rect, TRUE ); } }

  • C#のカスタムコンポーネント

    初めて投稿します。 C#でカスタムコンポーネント(ユーザコントロール、Windowsフォームコントロールライブラリと呼ばれる?)を作りたいと考えています。 実際に作りたいのは、ツールボックス内のダイアログカテゴリー内にあるような、ダイアログのコントロールを作りたいです。このダイアログ関係のコントロールは、コンテナ上にドロップすると、コンテナ上にオブジェクトが配置されるのではなく、エリアの下にコントロール名が表示されますが、このようなダイアログコントロールを作りたいと思っています。 イメージが伝わるか分かりませんが、通常ユーザコントロールを生成すると、以下のようにスケルトンが作られますが、 public partial class UserControl1 : UserControl これを public partial class UserControl1 : Form のようにして、Formクラスのコントロールを作りたいのですが、作り方がわからず困っています。 いろいろ調べたのですが、この手のダイアログコントロール?に関する情報が見当たらないので、もしご存知の方がいらっしゃったら、書籍でも、URLでも良いので情報ください。 よろしくお願いします。

  • VB .NETに関する書籍について

    現在までVB6でプログラミングをしていましたが、VB.NETに乗り換えてから、まったく使えなくなってしまいました。 Form1をクリックしたらForm2を表示するようにしたくて単純に Form2.show とやってみたところ、 「非共有メンバを参照するには、オブジェクト参照が必要です。」と言われますが、はたして何のことやら??と戸惑っています。 VB6では、コントロール操作やファイルの書込み、条件判断、エラー処理などといったプログラムの基本はわかっていますので、そのまま応用できると思うので、こんな私が参照すべき書籍があれば教えていただきたいと思います。

  • Public 定数が認識されない

    vb2010を使用しています。form1でPublic Const PASS_WORD As String = "12345"と宣言します。form1から呼び出したウィンドウform2では、次のようなコードです。 Public Class form2 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles btnOK.Click Dim f As form1 f = Me.Owner If Me.TextBox1.Text = PASS_WORD Then Me.DialogResult = DialogResult.OK End If End Sub End Class このとき「PASS_WORDは宣言されていません。」というエラーが発生します。form1でPublicで宣言してるので、なぜこのエラーが出るのかわかりません。どなたか御教示いただけると幸いです。

  • ActiveXコントロールでフォームを参照するには?

    VB6SP5を使用してActiveXコントロールを勉強中です。 ActiveXコントロールを作成(OCX化)して、そのコントロールを別のプロジェクトのフォームで使用しようと思っています。 このコントロールの機能は、使用するフォーム上の「ラベル」や「テキストBOX」の情報(Caption、サイズ、位置、色 etc...)を取得して、いろいろと処理を行いたいのですが、取得方法がわかりません。 一応、次のようにコントロールのメソッドの引数でフォームを受け取ろうとしたのですが、下記のコンパイルエラーが出てダメでした。  Public Sub ABC( ByRef frmMain As Form )    :  End Sub --- コンパイルエラー!! -------------------------------------------  "プライベート オブジェクトモジュールを、  パブリック オブジェクトモジュール内で、  パブリック プロシージャの引数または戻り値、  パブリック データメンバ、またはパブリックのユーザー定義型のフィールドとして、  使用することはできません。" ------------------------------------------------------------------ ところが、"As Form" を "As Object" にすると、上手くいきました。  Public Sub ABC( ByRef frmMain As Object )    :  End Sub この違いは何なんでしょうか? この使い方は正しいのでしょうか? もし、別の方法があれば、教えて下さい。

  • Form1上にあるTextBox1を Module1.vbから参照したい

    初歩的なことで、すいません・・・ 以前、覚えていたのですが、ド忘れしてしまいました。 タイトルどおりで、Form1上に配置したTextBox1を、Module1.vb内に書いた関数内で用いるには、TextBox1のみの記述だと、ビルドエラーとなります。 他のモジュールから、Form1上に配置したTextBox1を見るには、どのように指定するのか、ご教授下さい。 よろしくお願いします。 ----------以下だと"TextBox1"のところでエラーとなる---------- <Module1.vb> Sub xxxxx()  If TextBox1.Text = "0" Then   ・・・・  End If End Sub

  • C#でオブジェクトの有無を取得する

    オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。 この書き方の何がまずいのでしょうか? namespace オブジェクト検索 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Control c = Controls["form2"]; if (c != null) { ((TextBox)c).Text += "*"; } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); Application.DoEvents(); } } } ボタン2を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。