100求助:窗体不能隐藏

dinghui96 2007-07-20 01:36:09
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
}
...全文
365 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bs2833172 2007-07-27
  • 打赏
  • 举报
回复
在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()就可以了
oldn123 2007-07-26
  • 打赏
  • 举报
回复
void CGlobalHookDemoDlg::HideWindow(bool b_hide)
{
if(b_hide)
{
SetWindowPos(&wndBottom, 0,0,0,0,SWP_HIDEWINDOW);
long lExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
lExStyle &= ~WS_EX_APPWINDOW; //
lExStyle |= WS_EX_TOOLWINDOW; //
::SetWindowLong(m_hWnd, GWL_EXSTYLE, lExStyle);
ShowWindow(SW_SHOWNA);
}
else
{
SetWindowPos(&wndTop, 0,0,100,100,SWP_SHOWWINDOW);
}
}

给分吧
lmnihf2001 2007-07-25
  • 打赏
  • 举报
回复
窗口默认是隐藏的 所以在创建后会调用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)重新设置属性
kakashi0309 2007-07-25
  • 打赏
  • 举报
回复
用WTL可以实现
oldn123 2007-07-24
  • 打赏
  • 举报
回复
SetWindowPos(....SWP_HIDEWINDOW);
MeridaWarrior 2007-07-22
  • 打赏
  • 举报
回复
把ShowWindow(SW_HIDE);放到OnPaint()函数里面去,不过会闪一下
systemthink 2007-07-22
  • 打赏
  • 举报
回复
另外一种方法就是,把对话框属性的visable属性=FALSE, 不用DoModal而用Create把对话框创建出来,则以后需要显示的时候再调用ShowWindow();=======
=============================
不要帖那麽多代碼,能不能把你的問題描述一下用伪代碼!!
systemthink 2007-07-22
  • 打赏
  • 举报
回复
關注..........
emptyness 2007-07-21
  • 打赏
  • 举报
回复
还没解决吗?
up up up ..
donly_deng 2007-07-20
  • 打赏
  • 举报
回复
另外一种方法就是,把对话框属性的visable属性=FALSE, 不用DoModal而用Create把对话框创建出来,则以后需要显示的时候再调用ShowWindow();
donly_deng 2007-07-20
  • 打赏
  • 举报
回复
用SetWindowPos(...,-100,-100,...);把窗口移走然后,做个定时器在OnTimer里KillTimer和ShowWindow(SW_HIDE);
zhuzhu101011 2007-07-20
  • 打赏
  • 举报
回复
MFC的BUG:
对话框初始化不能隐藏
我喜欢用的方法是在onpaint里面加个静态变量
static int iFirstDialogHide = 1;

if(iFirstDialogHide > 0)

{

iFirstDialogHide --;

ShowWindow(SW_HIDE);

}
else

这样子对话框闪一下就没了
向立天 2007-07-20
  • 打赏
  • 举报
回复
重载OnNcPaint();
void CGPMainDialog::OnNcPaint()
{
static int i = 1;

if(_bIsStartHide)
{
ShowWindow(SW_HIDE);
_bIsStartHide=false;
}else
{
CDialog::OnNcPaint();
}
}
shenjianzong 2007-07-20
  • 打赏
  • 举报
回复
在后面调用movewindow(0,0,0,0); 试下.
sparkkendy 2007-07-20
  • 打赏
  • 举报
回复
ShowWindow(SW_HIDE);改成:ShowWindow(this,SW_HIDE);
jasonshark 2007-07-20
  • 打赏
  • 举报
回复
解决办法,在OnInitDialog中把窗体移出桌面范围
leon7909 2007-07-20
  • 打赏
  • 举报
回复
OnInitDialog()函数是在AfxDlgProc中收到WM_INITDIALOG后呼叫的,而WM_INITDIALOG消息是在生成DIALOG后显示DIALOG之前发送的,所以在OnInitDialog()中呼叫ShowWindow(SW_HIDE)来隐藏DLG显示是行不通的。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧