隐藏主窗口,哎,可惜藏不住,怎么办? 对于Dialog,在你的APP里把DoModal去掉。用Create的方法生成窗口,ShowWindow(SW_HIDE);如果用DoModal,肯定是要出来的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 假如程序本身是一个对话框应用程序的话,主窗口并不是用DoModal建立的,在主窗口对应的CPP文件中的OnInitDialog()中(假如没有的话用ClassWizard加入)直接增加ShowWindow (SW_HIDE);,前面不需要AfxGetMainWnd()->。 To xiaozuo你应该看一看对话框应用程序的APP类的InitInstance.没有CMyDialog dlg,dlg.DoModal,哪里能跑出个对话框来。OnInitDialog()跟窗口的显示与否根本就不搭界 小弟觉得,仅是在initialDialog里面加好像不行反倒是在OnPain()里加比较好。 小弟觉得,仅是在initialDialog里面加好像不行反倒是在OnPain()里加比较好。 小弟觉得,仅是在initialDialog里面加不行反倒是在OnPain()里加ShowWindow(SW_HIDE)比较好。 小弟觉得,仅是在initialDialog里面加不行反倒是在OnPain()里加ShowWindow(SW_HIDE)比较好。 对不起,昨晚上发错了,是用的SW_HIDE,可是加在OnInitDialog()里还是不行。请高手再讲讲:1.前面加AfxGetMainWnd()和不加在实现机制和实现结果上有什么不同?2.程序本身是由APP WIZARD创建的对话框应用程序,不知如何隐藏主窗口(就一个对话框)。谢谢xiaoyuer,你的方法是可行的,不过启动时屏幕要闪一下,不知有没有更好的方法。 1 AfxGetMainWnd一般用在有嵌套窗口的情况下,可以获得程序的主窗口,如果不加,那么可能操作的对象是嵌套窗口的子窗口。就这个区别。2 我已经回答过这个问题了,不知你有没有试一试. ShowWindow(SW_SHOWNORMAL);是通常窗口大小,用SW_HID应该没问题或干脆用::CloseWindow()函数 to vcbear:除了去掉dlg.Domodal()外还应该把后面的return FALSE改为return TRUE;否则的话程序会马上退出的 To vcbear:我按你说的试过了,不过Create之后,闪一下就没有了,整个应用程序都结束了。 To xiaoyuer:我改成TRUE,还是退出,不知又是什么问题? 我的Dialog是主窗口。vcbear,xiaoyuer,两位仁兄不如将 InitInstance 里的代码贴上来,小弟好学习一下。另外,Create 之后,OnInitDialog 里的代码还执行吗? ...CMy31Dlg* dlg;dlg=new CMy31Dlg;m_pMainWnd =dlg;dlg->Create(IDD_MY31_DIALOG,NULL);//Sleep(3000);dlg->ShowWindow(SW_HIDE);return TRUE;但是这样还是在Create()会闪一下,我以前也是这样后来干脆将主窗口改成了启动画面,比如金山词霸那样的。如果你是创建托盘图标的话,不妨一试 在Dlg资源编辑器里把visible属性取掉。在Dlg类的某个地方,PostQuitMessage(WM_QUIT),以退出程序 CDlgBaseDlg *pdlg = new CDlgBaseDlg; pdlg->Create(IDD_DLGBASE_DIALOG,NULL); //m_pMainWnd = pdlg; //pdlg->ShowWindow (SW_HIDE); MSG Msg; while(GetMessage(&Msg ,pdlg->m_hWnd ,0,0)) { if(Msg.message == WM_CLOSE|Msg.message ==WM_QUIT) { PostQuitMessage(WM_QUIT); break; } TranslateMessage(&Msg); DispatchMessage(&Msg); } return false; 抱歉pdlg->ShowWindow(SW_HIDE)的 注释应该取掉。这样做不会闪的。 我想大概是vcbear先生误会了我的意思,我的本意是说关于对话框的cpp文件的OnInitDialog()中不存在DoModal,当然在对话框的CWinApp文件中的InitInstance()中是有DoModal的,不然对话框就不会出来了。在OnInitDialog()使用无修饰的ShowWindow(SW_HIDE)肯定可以隐藏对话框,问题是隐藏后必须马上调用你需要做的函数,比如OnOK()。我的ExeShell中就使用这种方法: ShowWindow(SW_HIDE); OnOK(); //调用设定功能 if((Radio&RADIO(4))==0) exit(0); //在非特技启动时立即退出 CDialog::OnOK(); //在特技启动时还要进行延时其中OnOk()使用ClassWizard加入的,并且屏蔽了其中的CDialog::OnOK(),执行完任务后可以用CDialog::OnOK()结束程序。 在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)里cs.style = WS_POPUP; //使主窗口不可见cs.dwExStyle |= WS_EX_TOOLWINDOW; //不显示任务按钮试试吧 :) 下面这个方法我试过是可行的,不过有点麻烦。先在对话框中加一个按钮,ID号是IDC_BUTTON1,visible属性可以设为FALSE,这样以后对显示不会有影响。在其消息处理函数中加入下面一条语句:ShowWindow(SW_HIDE);把对话框的visible属性设为FALSE,然后在OnInitDialog函数中加入下面四句:long style = GetWindowLong( m_hWnd, GWL_STYLE );style |= WS_VISIBLE;SetWindowLong( m_hWnd, GWL_STYLE, style );PostMessage( WM_COMMAND, IDC_BUTTON1 ); 我是用Delphi的,但我想在VC中也一样,不用象上面说的那么麻烦。你在一个TTimer里定义隐藏主窗口(普通隐藏窗口的方法就行)然后使关闭Timer即可。我在delphi里试过了,没问题。 void CreateHiddenWindow(HINSTANCE hInstance){ WNDCLASS wc; MSG msg; HWND hwnd; memset(&wc, 0x00, sizeof(WNDCLASS)); wc.lpfnWndProc = HiddenWndProc; wc.hInstance = hInstance; wc.lpszClassName = kHiddenWindow; RegisterClass(&wc); hwnd = CreateWindow(kHiddenWindow, kHiddenWindow, WS_POPUP, 0, 0, 100, 100, NULL, NULL, hInstance, NULL); if(hwnd) { while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } }} 简单的方法:在OnInitDialog结束时,设置定时器,在OnTimer中设置HIDE显示属性。直接在OnInitDialog中做是不行的。 WSAAsyncSelect TCP 客户端奇怪问题 如何播放多个wav ? 在Dialog Bar添加了按钮,如何在view下响应它 设置了背景和字体的多行编辑框的刷新问题 大半年了,没来了,改行了,散分…… 英文系统的中文对话框 谁来跟我解释一下迭带因子是什么东西? 急,一个关于VARIANT作为参数的小问题? 怎么样刷新一个窗口地客户区 如何让我的程序窗口始终在最前面 推荐一个编程书籍下载的好站!!!!! 一个菜鸟的问题,一个杞人忧天的问题!
你应该看一看对话框应用程序的APP类的InitInstance.
没有CMyDialog dlg,
dlg.DoModal,哪里能跑出个对话框来。OnInitDialog()跟
窗口的显示与否根本就不搭界
反倒是在OnPain()里加比较好。
反倒是在OnPain()里加比较好。
反倒是在OnPain()里加ShowWindow(SW_HIDE)比较好。
反倒是在OnPain()里加ShowWindow(SW_HIDE)比较好。
请高手再讲讲:1.前面加AfxGetMainWnd()和不加在实现机制和实现结果上有什么不同?
2.程序本身是由APP WIZARD创建的对话框应用程序,不知如何隐藏主窗口(就一个对话框)。谢谢xiaoyuer,你的方法是可行的,不过启动时屏幕要闪一下,不知有没有更好的方法。
那么可能操作的对象是嵌套窗口的子窗口。就这个区别。2 我已经回答过这个问题了,不知你有没有试一试.
是通常窗口大小,用SW_HID应该没问题
或干脆用::CloseWindow()函数
除了去掉dlg.Domodal()外
还应该把后面的return FALSE改为return TRUE;
否则的话程序会马上退出的
我按你说的试过了,不过Create之后,闪一下就没有了,整个应用程序都结束了。
我改成TRUE,还是退出,不知又是什么问题?
CMy31Dlg* dlg;
dlg=new CMy31Dlg;
m_pMainWnd =dlg;
dlg->Create(IDD_MY31_DIALOG,NULL);
//Sleep(3000);
dlg->ShowWindow(SW_HIDE);
return TRUE;但是这样还是在Create()会闪一下,我以前也是这样
后来干脆将主窗口改成了启动画面,比如金山词霸那样的。
如果你是创建托盘图标的话,不妨一试
在Dlg类的某个地方,PostQuitMessage(WM_QUIT),以退出程序
CDlgBaseDlg *pdlg = new CDlgBaseDlg;
pdlg->Create(IDD_DLGBASE_DIALOG,NULL); //m_pMainWnd = pdlg;
//pdlg->ShowWindow (SW_HIDE);
MSG Msg;
while(GetMessage(&Msg ,pdlg->m_hWnd ,0,0))
{
if(Msg.message == WM_CLOSE|Msg.message ==WM_QUIT)
{
PostQuitMessage(WM_QUIT);
break;
}
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return false;
pdlg->ShowWindow(SW_HIDE)的 注释应该取掉。这样做不会闪的。
在OnInitDialog()使用无修饰的ShowWindow(SW_HIDE)肯定可以隐藏对话框,问题是隐藏后必须马上调用你需要做的函数,比如OnOK()。我的ExeShell中就使用这种方法:
ShowWindow(SW_HIDE);
OnOK(); //调用设定功能
if((Radio&RADIO(4))==0) exit(0); //在非特技启动时立即退出
CDialog::OnOK(); //在特技启动时还要进行延时
其中OnOk()使用ClassWizard加入的,并且屏蔽了其中的CDialog::OnOK(),执行完任务后可以用CDialog::OnOK()结束程序。
cs.dwExStyle |= WS_EX_TOOLWINDOW; //不显示任务按钮试试吧 :)
这样以后对显示不会有影响。在其消息处理函数中加入下面一条语句:ShowWindow(SW_HIDE);把对话框的visible属性设为FALSE,然后在OnInitDialog函数中加入下面四句:
long style = GetWindowLong( m_hWnd, GWL_STYLE );
style |= WS_VISIBLE;
SetWindowLong( m_hWnd, GWL_STYLE, style );
PostMessage( WM_COMMAND, IDC_BUTTON1 );
你在一个TTimer里定义隐藏主窗口(普通隐藏窗口的方法就行)然后使关闭Timer即可。
我在delphi里试过了,没问题。
{
WNDCLASS wc;
MSG msg;
HWND hwnd; memset(&wc, 0x00, sizeof(WNDCLASS)); wc.lpfnWndProc = HiddenWndProc;
wc.hInstance = hInstance;
wc.lpszClassName = kHiddenWindow; RegisterClass(&wc);
hwnd = CreateWindow(kHiddenWindow,
kHiddenWindow,
WS_POPUP,
0,
0,
100,
100,
NULL,
NULL,
hInstance,
NULL); if(hwnd)
{
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
在OnInitDialog结束时,设置定时器,在OnTimer中设置HIDE显示属性。
直接在OnInitDialog中做是不行的。