当前位置:编程学习 > C#/ASP.NET >>

NET Framework 2.0自定义设计器,键盘方向键控制自定义控件的问题

我在实现自定义设计器中,拖拽后,通过键盘操作控件,采用菜单快捷键方式进行键盘激活操作。可是这种方式只有对齐,剪切,复制,删除等操作,没有移动的操作。

lanq_newReport_tsmiDelete.ShortcutKeys = Keys.Delete;
 

请教,如何操作自定义控件的移动操作,通过Keys.down下移,能不能实现,应该如何实现? --------------------编程问答-------------------- 楼主:看你的需求,貌似很难噢。


不过应该可以实现吧! --------------------编程问答-------------------- 我感觉是挺难
开源项目SharpDevelop_2.2.1.2648_Source中进行重载protected override bool ProcessCmdKey(ref Message msg,Keys keyData)
来处理这个问题

protected override bool ProcessCmdKey(ref Message msg,Keys keyData)
{
int index;
if (base.ProcessCmdKey(ref msg, keyData)) {
return true;
}
bool isInRenameMode = renameTab != null || renameTabItem != null;

switch (keyData) {
case Keys.Home:
if (activeTab.Items.Count > 0 && !isInRenameMode) {
activeTab.ChoosedItem = activeTab.Items[0];
EnsureVisible(activeTab.ChoosedItem);
Refresh();
}
break;
case Keys.End:
if (activeTab.Items.Count > 0 && !isInRenameMode) {
activeTab.ChoosedItem = activeTab.Items[activeTab.Items.Count - 1];
EnsureVisible(activeTab.ChoosedItem);
Refresh();
}
break;
case Keys.PageUp:
if (activeTab.Items.Count > 0 && !isInRenameMode) {
index = Math.Max(0, activeTab.Items.IndexOf(activeTab.ChoosedItem) - scrollBar.LargeChange);
activeTab.ChoosedItem = activeTab.Items[index];
EnsureVisible(activeTab.ChoosedItem);
Refresh();
}
break;
case Keys.PageDown:
if (activeTab.Items.Count > 0 && !isInRenameMode) {
index = Math.Min(activeTab.Items.Count - 1, activeTab.Items.IndexOf(activeTab.ChoosedItem) + scrollBar.LargeChange);
activeTab.ChoosedItem = activeTab.Items[index];
EnsureVisible(activeTab.ChoosedItem);
Refresh();
}
break;
case Keys.Down:
if (activeTab.Items.Count > 0 && !isInRenameMode) {
if (activeTab.ChoosedItem != null) {
activeTab.ChoosedItem = activeTab.Items[Math.Min(activeTab.Items.Count - 1, activeTab.Items.IndexOf(activeTab.ChoosedItem) + 1)];
} else {
activeTab.ChoosedItem = activeTab.Items[0];
}
activeTab.SelectedItem = null;
EnsureVisible(activeTab.ChoosedItem);
Refresh();
}
return true;
case Keys.Up:
if (activeTab.Items.Count > 0 && !isInRenameMode) {
if (activeTab.ChoosedItem != null) {
activeTab.ChoosedItem = activeTab.Items[Math.Max(0, activeTab.Items.IndexOf(activeTab.ChoosedItem) - 1)];
} else {
activeTab.ChoosedItem = activeTab.Items[0];
}
activeTab.SelectedItem = null;
EnsureVisible(activeTab.ChoosedItem);
Refresh();
}
return true;
case Keys.Control | Keys.Up:
ActiveTab = Tabs[Math.Max(0, Tabs.IndexOf(ActiveTab) - 1)];
Refresh();
return true;
case Keys.Control | Keys.Down:
ActiveTab = Tabs[Math.Min(Tabs.Count - 1, Tabs.IndexOf(ActiveTab) + 1)];
Refresh();
return true;
case Keys.Return:
if (renameTab != null) {
renameTab.Name = renameTextBox.Text;
ExitRenameMode();
} else if (renameTabItem != null) {
renameTabItem.Name = renameTextBox.Text;
ExitRenameMode();
}
return true;
case Keys.Escape:
if (renameTab != null) {
if (doAddTab) {
Tabs.RemoveAt(Tabs.Count - 1);
renameTab = null;
renameTextBox.Visible = false;
doAddTab  = false;
Refresh();
} else {
ExitRenameMode();
}
} else if (renameTabItem != null) {
ExitRenameMode();
}
return true;
}
return false;
}


--------------------编程问答-------------------- 怎么没有回答问题的,高手们快来呀 --------------------编程问答-------------------- 几乎没有人可以实现 --------------------编程问答--------------------

/// <summary>
/// 控件设计器
/// </summary>
public class YourControlDesigner : System.Windows.Forms.Design.ControlDesigner
{
public YourControlDesigner()
{
}
 
public override SelectionRules SelectionRules
{
get
{
SelectionRules rules = SelectionRules.Visible | SelectionRules.Moveable | 
SelectionRules.LeftSizeable | SelectionRules.RightSizeable;
return rules;
}
}
}


在设计模式下,在这里来自定义控制。你添加上SelectionRules.Moveable试试看一下。 --------------------编程问答-------------------- 楼上的,谢谢

我试了,不行

我用一个笨方法来实现
我找到这个容器集合,然后找到选中的控件对象,然后修改location来达到移动的目的。
应为在设计状态下,选中的控件上都有一个框圈,这样修改Location后控件是移动了,可是框圈没有移动
有高手给与指点。 --------------------编程问答-------------------- 问题还没解决,还有回答的没有
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,