100求助:窗体不能隐藏
BOOL CPlcCommDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About... " menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu-> AppendMenu(MF_SEPARATOR);
pSysMenu-> AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application 's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
//ShowWindow(SW_HIDE);
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = this-> m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE;
nid.uCallbackMessage = MYWM_NOTIFYICON;
nid.hIcon = this-> m_hIcon;
sprintf(nid.szTip, "PLC通讯中。 ");
Shell_NotifyIcon(NIM_ADD, &nid);
m_tab.InsertItem(0, "读出PLC ");
m_tab.InsertItem(1, "写入PLC ");
CRect rct;
m_tab.GetWindowRect(&rct);
m_list1.MoveWindow(rct.left,rct.top, rct.right-5, rct.bottom-62);
m_list2.MoveWindow(rct.left,rct.top, rct.right-5, rct.bottom-62);
m_list2.ShowWindow(SW_HIDE);
g_blShutDown = false;
//读取系统设定
if(!ReadSysSetting(SysSettings)){
CString str = "读取系统设定信息失败,无法与PLC通讯。 ";
m_list1.InsertString(0, str);
return false;
}
if(g_bytCommMode == TCPIP){//TCP/IP
strTaitle.Format( "PLC IP: %s; PORT: %d ", g_szPlcAddress, g_intPort);
SetWindowText(strTaitle);
UpdateData(false);
LoadWinSock();
//启动读线程
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&GetPlcDataThread, &m_list1, 0, 0);
if(g_bytToPlc==1){//启动写线程
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&SetPlcDataThread, &m_list2, 0, 0);
}
}
ShowWindow(SW_HIDE);
return TRUE; // return TRUE unless you set the focus to a control
}
[解决办法]
OnInitDialog()函数是在AfxDlgProc中收到WM_INITDIALOG后呼叫的,而WM_INITDIALOG消息是在生成DIALOG后显示DIALOG之前发送的,所以在OnInitDialog()中呼叫ShowWindow(SW_HIDE)来隐藏DLG显示是行不通的。
[解决办法]
重载OnNcPaint();
void CGPMainDialog::OnNcPaint()
{
static int i = 1;
if(_bIsStartHide)
{
ShowWindow(SW_HIDE);
_bIsStartHide=false;
}else
{
CDialog::OnNcPaint();
}
}
[解决办法]
MFC的BUG:
对话框初始化不能隐藏
我喜欢用的方法是在onpaint里面加个静态变量
static int iFirstDialogHide = 1;
if(iFirstDialogHide > 0)
{
iFirstDialogHide --;
ShowWindow(SW_HIDE);
}
else
这样子对话框闪一下就没了
[解决办法]
另外一种方法就是,把对话框属性的visable属性=FALSE, 不用DoModal而用Create把对话框创建出来,则以后需要显示的时候再调用ShowWindow();
[解决办法]
还没解决吗?
up up up ..
[解决办法]
窗口默认是隐藏的 所以在创建后会调用ShowWindow(TRUE)显示
对话框默认会在创建后根据窗口属性WS_VISIBLE 调用ShowWindow(TRUE)
而你的ShowWindow(FALSE)在这个ShowWindow(TRUE)前面 所以是无效的
所以一开始只要把对话框的WS_VISIBLE属性去掉就行了
也可以在窗口在显示后调用ShowWindow(TRUE)这样会闪一下
不想闪的话就应该提前修改窗口属性去掉WS_VISIBLE 可以在资源属性里改
也可以调用
LONG style=GetClassLong(GetSafeHwnd,GCL_STYLE);
获得窗口属性再通过与WS_VISIBLE的反做与运算去掉WS_VISIBLE属性
style&=~WS_VISIBLE;
再SetClassLong(GetSafeHwnd(),GCL_STYLE,style)重新设置属性
[解决办法]
在InitInstance()里将
CMainProcDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
//对话框的代码
}
这段放入一个线程函数去执行就可以在对话框的任何地方调用ShowWindow(SH_HIDE)都可以把对话框隐藏起来,在InitInstance()里调用WaitForSingleObject()就可以了