2

子ウィンドウ (コントロール)、具体的には GroupBox と PushButton を非表示にする方法がわかりません。2 番目のパラメーターとしてSW_HIDEを指定したShowWindow()が機能すると考えましたが、単に機能しません。それでもSW_SHOWは問題なく動作します。両方のコントロールに正しいウィンドウ ハンドルがあるので、それは問題ではありません。

私がグーグルで検索したところ、コントロールではなくダイアログを非表示にする方法を尋ねている人しか見つかりませんでした。それか、ここでは適用されない MFC ベースのアプリケーションのいずれかです。私は純粋な Windows API を使用しており、 MFC は使用していません

私は何を間違えていますか?

EDIT : 詳細情報: WinApi コントロール用の単純なクラス ラッパーを作成しています。WindowsControl クラスには、他のメソッドとともに、コントロールを表示および非表示にする次のメソッドがあります。

void Show() {
    ShowWindow(this->_hWnd,SW_SHOWNOACTIVATE);
}

void Hide() {
    ShowWindow(this->_hWnd,SW_HIDE);
}

すべてのコントロールは WindowsControl から継承します。

この画像にはウィンドウのレイアウトが含まれているため、私が何をしているのか正確に理解できます: http://i.stack.imgur.com/PHQnH.png

ユーザーが「チップセット」静的コントロール内をクリックすると、特定のタイルの情報が読み込まれます (これは配列に格納されていますが、それは関係ありません)。設定に応じて、左側の [ビットウォールの編集] ボタンが非表示になり、その後ろに空の GroupBox が表示されます。明確にするために、これは私の Windows API ラッパーに問題があるわけではなく、正しい HWND を取得しています。ただし、ShowWindow は、親ではないウィンドウ プロシージャから呼び出すことはできない場合があります (これは奇妙です)。

EDIT2 : Visual Studio 2008 で C++ を使用、MFC なし、WTL なし、CLR なし、.NET なし

EDIT3:簡単になるように、さらに多くのコードを投稿します

static のウィンドウ プロシージャ内で、次のように WN_LBUTTONDOWN を処理します。

case WM_LBUTTONDOWN: {
  ...
  update_tiledata(c, l)


void update_tiledata(GroupBox * c, ListView* l ) {
    ...

   if (chp_copy.Tiles[selectedTile].Pass() == PT_BITWALL) {
          c->Controls(CTL_BTNEDITBIT)->Show();
          c->Controls(CTL_FRPHOLD)->Hide();
   } else {

          c->Controls(CTL_FRPHOLD)->Show();
          c->Controls(CTL_BTNEDITBIT)->Hide();
   }
   update_edits();
}

前に述べたように、省略されたコードはクラスに影響を与えません。正しい HWND を使用して、SW_HIDE を指定した ShowWindow が呼び出されますが、何も起こりません。

4

2 に答える 2

9

ウィンドウまたはダイアログのコントロールは、を使用して非表示にできます

ShowWindow(hControlWin、SW_HIDE);

ダイアログで、を呼び出すことにより、コントロールウィンドウのハンドルを取得できます。

GetDlgItem(hDlg、<CtrlID>);

通常、次のように記述します。

ShowWindow(GetDlgItem(hDlg、2)、SW_HIDE);

より多くの情報といくつかのコードを提供すると便利です:どのようにコントロールを作成しましたか?どの言語、コンパイル、フレームワークを使用しましたか?

于 2011-06-08T08:37:12.210 に答える
1

必要な関数呼び出しは、フォームのボタンを無効にするために以前に使用したEnableWindowだと思います。ただし、最初にウィンドウ (オブジェクト) へのハンドルを取得する必要があるため、EnumChildWindowsを使用してすべてのコントロールを反復処理し、目的のコントロールを見つけることができます。

于 2011-06-08T08:08:50.580 に答える