一个解决方法是使用 Windows LockWindowUpdate 应用程序编程接口 (API) 结合 可用 属性。LockWindowUpdate 函数禁用或重新-启用指定窗口中的绘图。该 *** 作完成后该控件是重新启用,和 LockWindowUpdate API 调用第二次以恢复该控件的绘图。 创建示例项目的步骤在 Visual Basic 中开始一个新的标准 EXE 项目。默认情况下创建 Form1。向 Form1 中添加 文本框 控件。从 工具 菜单中单击 菜单编辑器 并创建一个名为 Form1 上的 mnuPopUp 的菜单。清除 可见 复选框,并添加项,如下所示:标题: 名称
文件: mnuPopup
新建: mnuOne
打开: MnuTwo 下面的代码添加到 Form1 的代码窗口: Private Declare Function LockWindowUpdate Lib "user32" _
(ByVal hwndLock As Long) As Long
Private Sub mnuOne_Click()
Text1Text = "Menu One was clicked"
End Sub
Private Sub mnuTwo_Click()
Text1Text = "Menu two was clicked"
End Sub
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = vbRightButton Then
' Avoid the 'disabled' gray text by locking updates
LockWindowUpdate Text1hWnd
' A disabled TextBox will not display a context menu
Text1Enabled = False
' Give the previous line time to complete
DoEvents
' Display our own context menu
PopupMenu mnuPopup
' Enable the control again
Text1Enabled = True
' Unlock updates
LockWindowUpdate 0&
End If
End Sub
保存并运行该项目。用鼠标右键单击文本 1。显示自定义的菜单。不显示标准的编辑菜单。1在"菜单编辑器窗口"中建立一个将要作为d出式菜单的主菜单项,如你所说的,就是"编辑"主菜单项,此菜单项的标题为"编辑",名称为"EDIT",所包含的菜单项为"剪切","复制","粘贴"建立d出式菜单所需的菜单后,可以把"编辑"的VISIBLE属性设置为FALSE,也可以设置为TRUE,关键看你需要
2为建立好的菜单编写程序代码,要显示d出式菜单,可以使用POPUPMENU方法,大概代码如下:
Private Sub Form_MouseUp(Button as Integer,Shift as Integer,X as Single,Y as Single)
If Button=2 then '检查是否按下的是鼠标右键
PopUpMenu EDIT 'EDIT是"编辑"菜单的控制名,将其激活显示在窗体上
End If
End Sub按Ctrl+E键,d出菜单编辑器。在那里面可以编辑菜单。
标题:等同于Command的Caption属性,就是用来显示菜单上的文字。
名称:等同于Command的Nane属性,指定菜单的名称。
索引:菜单数组的下标。
复选:以复选框的样式显示菜单。
有效:Enabled
可见:Visible
→按钮:选定的菜单项退一级
←按钮:选定的菜单项向上一级
↑按钮:选定的菜单项向上移动
↓按钮:选定的菜单项向下移动
先输入菜单第一项的标题"文件"和名称"file",按你的要求,程序运行时不显示,那么就把它的"可见"勾上。
再输入菜单第二项的标题"打开"和名称"open",因为它是在"文件"菜单的下一级,所以按一下"→按钮"
最后输入菜单第三项的标题"保存"和名称"save",不用按按"→按钮"确定完成菜单的编辑
调出菜单
Private
Sub
Form_MouseDown(Button
As
Integer,
Shift
As
Integer,
X
As
Single,
Y
As
Single)
If
Button
=
2
Then
PopupMenu
file
'1为左键,2为右键
'popupnebu
<菜单>
d出菜单
End
Sub
点击代码窗口中控件下拉列表,选择save
或
open
可以对它们进行事件的编程
283452635用MouseUp事件里的
Button参数
1表示左键
2表示右键
建一个菜单
vbFile
子菜单vbRight:
(右键点击窗体
就会d出
vbFile下的几个子菜单了)
Private
Sub
Form_Load()
vbFileVisible
=
False
End
Sub
Private
Sub
Form_MouseUp(Button
As
Integer,
Shift
As
Integer,
X
As
Single,
Y
As
Single)
Select
Case
Button
Case
1
"点击了左键"
Case
2
"点击了右键"
PopupMenu
vbFile
End
Select
End
Subvoid Menu()
{
system("cls"); /调用系统的清屏命令/
textbackground(BLUE);/将背景设置为蓝色/
textmode(2);
window(1,1,25,80);
clrscr();
textx=3;/光标初始化位置/
texty=2;
gotoxy(1,2);
cprintf("%c",218);/画左上角/
for(i=0;i<78;i++)
cprintf("%c",196); /画水平直线/
cprintf("%c",191);/画右上角/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
cprintf("%c",179); /画垂直线/
gotoxy(80,i);
cprintf("%c",179);
}
cprintf("%c",192); /画左下角/
for(i=0;i<78;i++)
cprintf("%c",196);
cprintf("%c",217); /画右下角/
gotoxy(1,1);
textcolor(7); /设置灰色/
for(i=0;i<80;i++)
cprintf("%c",219);/用符号实现画主菜单的灰色背景区/
Selectitem(); /调用选项函数/
DrawSelectitem(); /画选项/
gettext(2,3,78,23,c); /保存当前文本区域/
}
/定义菜单/
void Selectitem()
{
strcpy(ml[0]name,"File");/下面的具体选项补空格是为了各菜单黑色背景相同/
strcpy(ml[0]str[0],"Open ALT-O");
strcpy(ml[0]str[1],"New ALT-N");
strcpy(ml[0]str[2],"Save Ctrl-S");
strcpy(ml[0]str[3],"Write to ");
strcpy(ml[0]str[4],"Exit ");
ml[0]n=5; /保存菜单的项数/
strcpy(ml[1]name,"Edit");
strcpy(ml[1]str[0],"Cut Ctrl+X");
strcpy(ml[1]str[1],"Copy Ctrl+C");
strcpy(ml[1]str[2],"Paste Ctrl+V");
strcpy(ml[1]str[3],"Find ");
strcpy(ml[1]str[4],"Find&Replace ");
ml[1]n=5;
strcpy(ml[2]name,"Help");/系统帮助/
strcpy(ml[2]str[0],"This System ");
strcpy(ml[2]str[1],"Ver ");
ml[2]n=2;
}
/显示主单名/
void DrawSelectitem()
{
for(i=0;i<3;i++)
RedText(i,1,ml[i]name); /显示主菜单名,且首字母为红色/
}
/正常显示菜单/
void RedText(int x,int y,char z)
{
textbackground(7); /设置背景颜色为浅灰色/
gotoxy(3+x20,y);
for(j=0;z[j];j++)
{
if(j==0)
textcolor(RED);/第一个字母显示红色/
else
textcolor(BLACK); /设置黑色/
cprintf("%c",z[j]); /输出菜单名/
}
}
/显示选中菜单/
void BlackText(int x,int y,char z)
{
textbackground(0); /设置背景颜色为黑色/
textcolor(15); /设置文本颜色为白色/
gotoxy(3+20x,y);/定位坐标/
cputs(z); /输出菜单名字符串/
}
/画边框函数/
void DrawFrame(int l,int u,int r,int d,int tcolor,int bcolor)
{
textbackground(bcolor); /背景颜色/
textcolor(bcolor); /文本颜色/
for(i=l;i<=r;i++) /输出背景区域/
{
for(j=u;j<=d;j++)
{
gotoxy(i,j);
cprintf("%c",219); /输出背景字符/
}
}
textcolor(tcolor);/边框颜色/
for(i=u+1;i<d;i++) /在背景区域内输出边框线/
{
gotoxy(l,i);
cprintf("%c",179); /垂直线/
gotoxy(r,i);
cprintf("%c",179);
}
for(i=l+1;i<r;i++)
{
gotoxy(i,u);
cprintf("%c",196); /水平线/
gotoxy(i,d);
cprintf("%c",196);
}
gotoxy(l,u);
cprintf("%c",218);/左上角/
gotoxy(r,u);
cprintf("%c",191);/右上角/
gotoxy(l,d);
cprintf("%c",192);/左下角/
gotoxy(r,d);
cprintf("%c",217); /右下角/
/ gettext(l+1,u+1,r-1,d-1,save1);//保存边框内区域/
}
/显示具体下拉选择项目/
void DrawMl(int n,charnodeptr L,rownodeptr R,pformateptr P,operationptr C,editptr E)
{
gettext(1,1,80,25,save);/保存被掩盖的地方/
BlackText(n,1,ml[n]name);/反选显示主菜单/
DrawFrame(3+20n-1,2,3+20n+19,3+ml[n]n,0,7);/下拉菜单的边框/
for(i=3;i<3+ml[n]n;i++)/输出所选菜单各选项/
{
if(i==3)
BlackText(n,i,ml[n]str[i-3]);/默认选中第一项/
else
RedText(n,i,ml[n]str[i-3]);/其余各项首字符红色显示/
}
gotoxy(79,1);
MoveMl(n,3,L,R,P,C,E);/菜单选项的控制/
}
/菜单选项的控制,n决定水平项,x决定下拉的选项/
void MoveMl(int n,int x,charnodeptr L,rownodeptr R,pformateptr P,operationptr C,editptr E)
{
int flag=1;
while(flag)
{
gotoxy(79,1);
key=bioskey(0);/接收按键/
gotoxy(79,1);
switch(key)
{
case ESC:/退出循环/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
flag=0;
break;
case LEFT:/移到左边的选项/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
if(n==0)/往左移动越界的话移到最后一个选项/
DrawMl(2,L,R,P,C,E);
else
DrawMl(n-1,L,R,P,C,E);
flag=0;
break;
case RIGHT:/移动右边的选项/
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
if(n==2)/往右移动越界的话移到第一个选项/
DrawMl(0,L,R,P,C,E);
else
DrawMl(n+1,L,R,P,C,E);
flag=0;
break;
case UP:/具体选项往上移动/
RedText(n,x,ml[n]str[x-3]);/输出红色字体/
if(x==3)/移到最上面再按上键,就移到最下面/
x=3+ml[n]n-1;
else
x--;/移动到新的要显示的内容/
BlackText(n,x,ml[n]str[x-3]);/输出黑色字体/
flag=1;
break;
case DOWN:/具体选项往下移动/
RedText(n,x,ml[n]str[x-3]);
if(x==(3+ml[n]n-1))/移动到最底下再按下键就移到最上面/
x=3;
else
x++;/移动到新的要显示的内容/
BlackText(n,x,ml[n]str[x-3]);
flag=1;
break;
case ENTER:
puttext(1,1,80,25,save);/恢复打开菜单前的样子/
Enter(n,x-3,L,R,P,C,E);/菜单选项的具体功能/
flag=0;
break;
}
gotoxy(79,1);
}
}
/菜单选项的具体功能/
void Enter(int m,int n,charnodeptr L,rownodeptr R,pformateptr P,operationptr C,editptr E)
{
switch(m)
{
case 0:switch(n)
{
case 0:Openfile(L,R,P,C,E);break; /打开一个已存在的文件/
case 1:Newfile(L,R,P,C,E);break; /创建一个文件/
case 2:Savefile(L);break; /保存当前 *** 作和文件/
case 3:Writeto(L); /另存为/
case 4:Exit(L); /退出系统/
} break;
case 1: switch(n)
{
case 0: cut(L,R,P,C,E);break; /剪切/
case 1: copy(L,R,P,C,E);break; /复制/
case 2: paste(L,R,P,C,E);break; /粘贴/
case 3:find(L,R,P,C,E);break; /查找/
case 4:replace(L,R,P,C,E);break;/替换/
}break;
case 2:switch(n) /选择了帮助菜单选项/
{
case 0:Help();break;
case 1:Ver();
}
}/结束外switch/
}
//这是部分程序,如果要完整的例子程序,告诉我邮箱,我发给你
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)