掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Comboboxのドロップダウンリストの方向について (ID:37736)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
コンボボックスがドロップダウンされた時に リスト部分のハンドルを捕まえて、無理矢理移動することは可能です。 タイミングによっては、一瞬だけリストが下に見えてしまいますけど。 注意する点としては ・OnDropDownは実際にリストが表示される「前」に起きるが 移動はリストが表示された「後」にやらなくてはいけない ・コンボボックス自体は子ウィンドウだけれど、 リストの部分はどのウィンドウにも属さないオーバーラップウィンドウなので 座標系が異なる。 以下実装例 const MSG_AFTER_DROPPED_DOWN = WM_APP + 1; // リストが表示された後に自分に送るメッセージ type TForm1 = class(TForm) ComboBox1: TComboBox; procedure ComboBox1DropDown(Sender: TObject); private procedure AfterDroppedDown(var msg: TMessage); message MSG_AFTER_DROPPED_DOWN; end; procedure TForm1.ComboBox1DropDown(Sender: TObject); begin // この時点ではまだリストが表示されていないので // 後で処理されるよう、自分自身にメッセージを投げておく PostMessage(Handle, MSG_AFTER_DROPPED_DOWN, 0, 0); end; procedure TForm1.AfterDroppedDown(var msg: TMessage); var info: TComboBoxInfo; hList: HWND; rcList: TRect; ptEdit: TPoint; begin // コンボボックスの情報を取得 info.cbSize := SizeOf(info); GetComboBoxInfo(ComboBox1.Handle, info); // リスト部分のハンドルとサイズを取得 hList := info.hwndList; GetWindowRect(hList, rcList); // エディット部分の座標を取得し、スクリーン座標に変換 ptEdit := Point(info.rcItem.Left, info.rcItem.Top); Windows.ClientToScreen(info.hwndCombo, ptEdit); // 境界線の分を引いておく Dec(ptEdit.X, GetSystemMetrics(SM_CXEDGE)); Dec(ptEdit.Y, GetSystemMetrics(SM_CYEDGE)); // リストをエディット部の上に移動 SetWindowPos(hList, 0, ptEdit.X, ptEdit.Y - rcList.Bottom + rcList.Top, 0, 0, SWP_NOSIZE or SWP_NOZORDER or SWP_NOACTIVATE); end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.