请问用C#编写的MDI程序,为啥我从父窗口通过按钮打开子窗口时,父窗口的按钮会在子窗口中显示?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问用C#编写的MDI程序,为啥我从父窗口通过按钮打开子窗口时,父窗口的按钮会在子窗口中显示?相关的知识,希望对你有一定的参考价值。

程序要怎么写,才能使得父窗口的按钮不会在子窗口中出现啊?
最好有代码,谢谢!!!
我没发现哪里设置错了啊?!
先设置Form1为父窗口,再设置Form2为其子窗口,Form1包含button1和button2两个按钮,button1的click事件打开Form2,问题是Form2打开后,它是出现在Form1的正中间的位置,恰巧Form1的两个按钮也在正中间位置,Form2打开后,Form1的两个按钮就出现在Form2上,挡住了Form2本身的按钮和输入框。。。。。。
请问,现在怎么办?哪位高手帮忙解决一下啊?!很急,谢谢!!!!!!!!!!!!

private void button1_Click(object sender, EventArgs e)

Form2 login = new Form2();
login.MdiParent = this;
login.Location = new Point(212, 184);
login.StartPosition = FormStartPosition.Manual;
login.Show();


还有,高手们,我试过'iori0202'高手提出的使用'showdialogue();'了,报错,提示是不能使用此函数。。。。。。怎么办???

应该不会呀,你是不是那里搞错了! 参考技术A 你是怎么打开的?
Form2 form2 = new Form2();
form2.show();?这样吗?
要子窗口在父窗口上面的话就showdialogue();
这个就是如果子窗口不关闭的话,父窗口是不会有焦点的.

请问在 Dev C++ 里编写的 Windows 程序,为啥原先可以编译的,但修改了之后再改回来就不能编译了呢?

会自动进入到 Makefile.win,指向 $(CC) $(LINKOBJ) -o $(BIN) $(LIBS)

这是我学习的第一个Windows程序:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText
(
hdc,
TEXT("这是我的第一个 Windows 程序!"),
-1,
&rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER
);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default :
return DefWindowProc(hwnd, message, wParam, lParam);



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR LPCmdLine, int nCmdShow)

HWND hwnd;
MSG msg;
WNDCLASS wc;
TCHAR lpszClassName[] = "window";
TCHAR lpszWndName[] = "窗口";

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszClassName = lpszClassName;

if(!RegisterClass(&wc))

MessageBox(NULL, TEXT("窗口注册失败"), TEXT("提示"), MB_OK);
return 0;


hwnd = CreateWindow
(
lpszClassName,
lpszWndName,
WS_TILEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
300,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&msg, NULL, 0, 0))

TranslateMessage(&msg);
DispatchMessage(&msg);


return msg.wParam;


如果我注释掉
wc.lpszClassName = lpszClassName;
再改回来就不行了,编译不过去了;

说明白点,就是你自己编译并运行后那个运行框没关闭,就又再编译。一些编译器不能打开多个运行框,如:Dev 参考技术A 为什么要注释掉这行,所有的窗口类都需要类名称的啊追问

我知道肯定要这一行。
但我想搞清楚:
我注释掉它,那它肯定编译不了;
然后我再改回来。为什么它就一直编译不过去了;

当我重新建立一个项目时,把这代码粘贴上去,又没问题。
我想搞清楚是不是设置的问题还是其它问题;

追答

编译的时候提示什么错误?

追问

cannot open output file window.exe: Permission denied
[Error] ld returned 1 exit status
刚试了试,改多几次之后就过不了了,有时头一两次还能过;

追答

那这个和代码没有关系,只是因为你的程序已经被启动了没关闭吧。。。

追问

可是这是WINDOWS程序,没有可供关闭的窗口啊,难道要重新进入DEV C++
因为当我注释掉那一行的时候,它能编译但不能运行(应该叫运行没看到任何东西);所以没有窗口可供关闭;

追答

。。。你试试看去任务管理找,看有没有相关的进程然后关掉
或者在 WinMain 的 return 之前用 ExitProcess() 强制把当前进程关掉
也就是说,没有窗口可以关闭,但是程序依然在运行,所以才让你去任务管理器,把由错误的代码生成的错误的程序给关掉
GetMessage 函数在出现错误的时候会返回 -1,而不是返回 0;而你这 while 的写法就导致了即便返回 -1 还不能跳出循环,自然你的程序就持续在运行了

本回答被提问者采纳
参考技术B 编译提示什么错误麻烦吧问题描述清楚。追问

cannot open output file window.exe: Permission denied
[Error] ld returned 1 exit status
刚试了试,改多几次之后就过不了了,有时头一两次还能过;

追答

任务管理器吧你程序的进程结束掉,你代码没问题,只是你程序在运行无法重新生成。

以上是关于请问用C#编写的MDI程序,为啥我从父窗口通过按钮打开子窗口时,父窗口的按钮会在子窗口中显示?的主要内容,如果未能解决你的问题,请参考以下文章

MFC/VC 在多文档MDI程序中 子窗口初始最大化显示 如何去掉菜单栏右侧的最小化及向下还原按钮

请问怎样在MDI的命令中关闭子窗体?

请问C#怎样在弹出的messageBox窗口上添加一个textBox控件?如果直接不能实现的话,应该怎样编写这样的控件

C#-MDI-多窗口通信方法总结

c# 如何保持一个MDI子窗口永远最大化?

vb的 mdi窗口的问题