首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

100窗体不能隐藏

2012-01-31 
100求助:窗体不能隐藏BOOLCPlcCommDlg::OnInitDialog(){CDialog::OnInitDialog()//AddAbout... menuite

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()就可以了

热点排行