delphi – 我可以以编程方式设置ComboBox下拉列表的位置吗?

前端之家收集整理的这篇文章主要介绍了delphi – 我可以以编程方式设置ComboBox下拉列表的位置吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
普通的Windows ComboBox(csDropDown或csDropDownList样式)将在其下方打开其下拉列表,如果下方没有空格,则在组合上方打开.我可以控制此列表的位置(至少按Y坐标)吗?

解决方法

发布将正确显示下拉列表动画的代码示例,并强制显示ComboBox1上方的下拉列表.这个代码子类ComboBox hwndList:
  1. TForm1 = class(TForm)
  2. ComboBox1: TComboBox;
  3. procedure FormCreate(Sender: TObject);
  4. procedure FormDestroy(Sender: TObject);
  5. private
  6. FComboBoxListDropDown: Boolean;
  7. FComboBoxListWnd: HWND;
  8. FOldComboBoxListWndProc,FNewComboBoxListWndProc: Pointer;
  9. procedure ComboBoxListWndProc(var Message: TMessage);
  10. end;
  11.  
  12. ....
  13.  
  14. procedure TForm1.FormCreate(Sender: TObject);
  15. var
  16. Info: TComboBoxInfo;
  17. begin
  18. ZeroMemory(@Info,SizeOf(Info));
  19. Info.cbSize := SizeOf(Info);
  20. GetComboBoxInfo(ComboBox1.Handle,Info);
  21. FComboBoxListWnd := Info.hwndList;
  22. FNewComboBoxListWndProc := MakeObjectInstance(ComboBoxListWndProc);
  23. FOldComboBoxListWndProc := Pointer(GetWindowLong(FComboBoxListWnd,GWL_WNDPROC));
  24. SetWindowLong(FComboBoxListWnd,GWL_WNDPROC,Integer(FNewComboBoxListWndProc));
  25. end;
  26.  
  27. procedure TForm1.FormDestroy(Sender: TObject);
  28. begin
  29. SetWindowLong(FComboBoxListWnd,Integer(FOldComboBoxListWndProc));
  30. FreeObjectInstance(FNewComboBoxListWndProc);
  31. end;
  32.  
  33. procedure TForm1.ComboBoxListWndProc(var Message: TMessage);
  34. var
  35. R: TRect;
  36. DY: Integer;
  37. begin
  38. if (Message.Msg = WM_MOVE) and not FComboBoxListDropDown then
  39. begin
  40. FComboBoxListDropDown := True;
  41. try
  42. GetWindowRect(FComboBoxListWnd,R);
  43. DY := (R.Bottom - R.Top) + ComboBox1.Height + 1;
  44. // set new Y position for drop-down list: always above ComboBox1
  45. SetWindowPos(FComboBoxListWnd,R.Left,R.Top - DY,SWP_NOOWNERZORDER or SWP_NOZORDER or SWP_NOSIZE or SWP_NOSENDCHANGING);
  46. finally
  47. FComboBoxListDropDown := False;
  48. end;
  49. end;
  50. Message.Result := CallWindowProc(FOldComboBoxListWndProc,FComboBoxListWnd,Message.Msg,Message.WParam,Message.LParam);
  51. end;

笔记:

>我完全同意David和其他人的意见,这对于改变TComboBox的这种特定默认行为是一个坏主意. OP尚未回应为什么他想要这样的行为.>上面的代码是用D5 / XP测试的.

猜你在找的Delphi相关文章