none
一个比较底层的问题,关于ComboBox,看看有没有人了解 RRS feed

  • 问题

  • 遇到了一个小问题,如果有人能稍微个提示,不(在的版块发过,但没有人能个回答)

     

     

    问题这样地,在画面上有一些TextBoxComboBox入框,ComboBoxStyle置成Simple,所以看起来子和TextBox

     

    但是用使用中发现,如果是TextBox,鼠点一下,入光就会落在所点的位置;如果是ComboBox,鼠点一下之后,却成所有文本都被中的状变蓝)。所以用提出了疑,明明看起来是一入框,么动作不一

     

    了解决问题,我在ComboBoxOnMouseDown中增加了如下的代,鼠点下之后,首先取消掉选择,然后算鼠点下的位置,通SelectionStartSelectionLength属性,入光的位置,这样看起来作和TextBox就很相像了。

     

          if (e.Button == MouseButtons.Left)
          {
            if (blnNeedCursorReset && this.SelectionStart == 0 && this.Text.Length > 0 && this.SelectionLength == this.Text.Length)
            {
              float tmpWidth = System.Drawing.Graphics.FromHwnd(this.Handle).MeasureString(this.Text, this.Font).Width;
              int i = GetCursorPos(this.Text, e.X);
              if (tmpWidth > this.Width)
              {
                this.SelectionStart = i + 1;
                this.SelectionLength = 0;
              }
              else
              {
                this.SelectionStart = i;
                this.SelectionLength = 0;
              }
    
              blnNeedCursorReset = false;
            }
          }
    


    然后下面才是真正的问题TextBox用鼠点一下之后,如果按住不放直接拖,就可以选择一部分文本;

    而我修改ComboBox,点下之后,入光标虽置到了合适的位置,却无法行拖,只能再点一下之后才能行拖动选择

     

    请问这问题有没有法解决?

    我的想法是置完光位置之后,应该发一个消息告ComboBox  没完,保持鼠按下的状,下面可以拖动选择文本。但是应该发么样的消息呢?

     

    我已做了一个简单Sample,可以从下面地址下

    http://cid-918c1e82d5d4dc7c.office.live.com/self.aspx/.Public/ASampleOfComboBox/ASampleOfComboBox.zip

    画面上三个控件 TextBox, ComboBox1, ComboBox2 其中ComboBox1经过我改造的,鼠击获得焦点的候,其作模TextBox,和原始的ComboBox2不相同。

     

    但是,TextBox,【在文本框中左按下---】可以中一段文字;

    而在ComboBox1中,【在文本框中左按下(行了重位置的作)】,即使拖也不能中文字。必再点一下左才可以。

     

     

     

     

    谢谢

     

    2010年12月21日 8:03

答案

  • 呵呵,我也遇到过这个问题,没搞定。。。

    不过我不是这么处理的,我直接重载textbox控件,自己实现了一个下拉框,这样textbox的功能都有,还有combox功能。

    希望这个是一个思路。。。

     


    family as water
    2010年12月21日 9:00

全部回复

  • 呵呵,我也遇到过这个问题,没搞定。。。

    不过我不是这么处理的,我直接重载textbox控件,自己实现了一个下拉框,这样textbox的功能都有,还有combox功能。

    希望这个是一个思路。。。

     


    family as water
    2010年12月21日 9:00
  • 这个问题是由于 ComboBox 在 Style = Single 的情况下是一个标准 TextBox,而标准的 TextBox 是有一个 SelectionStart 属性的 (Windows 为一个 EM_SETSEL 消息),可以通过设置这个值/发送这个消息,使得每当这个 TextBox 获得焦点时,文本都会被自动选中。解决这个问题的方法是直接把这个设置 SelectionStart 为 -1 且 SelectionLength 为 0。或者直接通过 EM_SETSEL 进行设置。

    那么问题就来了,怎么得到 ComboBox 的那个 Style = Single 的 TextBox 呢?这里需要用到一个 Win32 消息 CBEM_GETEDITCONTROL,这样通过 SendMessage 就可以得到那个 TextBox 的句柄,从而通过 Control.FromHandle 方法创建 TextBox 实例并设置相应的属性。


    Mark Zhou
    2010年12月21日 9:42
  • 唉,悔当初。因为这个ComboBox已经被包装成复杂的自定义控件应用于200多个画面,现在已经不可能替换掉他了...
    2010年12月21日 11:22
  • 谢谢指明方向,我再详细研究一下,如果还不能实现再来请教。
    2010年12月21日 11:42
  • 这个问题是由于 ComboBox 在 Style = Single 的情况下是一个标准 TextBox,而标准的 TextBox 是有一个 SelectionStart 属性的 (Windows 为一个 EM_SETSEL 消息),可以通过设置这个值/发送这个消息,使得每当这个 TextBox 获得焦点时,文本都会被自动选中。解决这个问题的方法是直接把这个设置 SelectionStart 为 -1 且 SelectionLength 为 0。或者直接通过 EM_SETSEL 进行设置。

    那么问题就来了,怎么得到 ComboBox 的那个 Style = Single 的 TextBox 呢?这里需要用到一个 Win32 消息 CBEM_GETEDITCONTROL,这样通过 SendMessage 就可以得到那个 TextBox 的句柄,从而通过 Control.FromHandle 方法创建 TextBox 实例并设置相应的属性。


    Mark Zhou

    你好,我又仔细琢磨了一下,您说的这个解决方式是:ComboBox的文本被自动全选之后,可以通过SelectionStart等属性取消这个全选状态。

    但我的上面的代码实际上已经解决了这个问题。

     

    问题难点在于:即使我取消了这个全选状态,由于鼠标左键按下这个状态不能保持,必须要重新点击一下才能拖动选择文本。

    2010年12月22日 2:32
  • Hi cs.liwei,

    你的问题解决了没。
    如果解决了的话请在此共享出你的解决方案,这将对其他社区成员的类似问题有所帮助。
    谢谢。

    Sincerely,
    Leo Liu


    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月27日 4:53
    版主
  • 你好

    这个问题没有解决。我觉得Stone Z的方案可能是最好的方案了吧,但是要在早期发现才可以。

    我这边因为是到了项目末期,才由最终用户提出,说输入的时候操作性不佳,所以已经很难替换掉所有的控件了。

    暂时只能让用户忍忍了...

     

    2010年12月28日 1:58