MFC动态生成控件问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 08:06:21
我建立一个线程,来生成一个控件:
UINT CreateLEDNode( LPVOID lpParam ) //建立控件的线程
{
CSliderCtrl *p_CSliderCtrl = new CSliderCtrl();
p_CSliderCtrl -> Create( TBS_VERT | TBS_NOTICKS, CRect( 45, 130, 70, 230 ), AfxGetMainWnd(), 1004 ); //创建滑动控件

p_CSliderCtrl -> SetRange( 0, 100, TRUE );
p_CSliderCtrl -> SetPos( 50 ); //初始化滑动控件的位置
p_NodeCSliderCtrl -> ShowWindow( SW_SHOWNA ); //在对话框上显示控件
return 0;
}

问题出在,我用showwindow()无法让滑动控件显示在窗口上,谁能告诉我怎么解决吗?
p_NodeCSliderCtrl -> ShowWindow( SW_SHOWNA ); //在对话框上显示控件

这个打错了,应该是:

p_CSliderCtrl -> ShowWindow( SW_SHOWNA ); //在对话框上显示控件

SW_SHOWNA没错的,请查看MSDN:
SW_SHOWNA
Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated.

我把这段程序不放在线程里,放在主窗口调用就能显示控件。

很遗憾地告诉你,在新线程中是无法正常创建并显示控件的,至少一般方法行不通。我用了好多手段,最后能显示,但程序运行就死,后来想想是因为线程无法实现控件窗口的消息循环,所以你的思想根本无法实现,除非使用消息钩子(不一定能成功)。
不知道你用的debug还是release,你的程序难道没有断言错误?我用显示断言错误,是AfxGetMainWnd()是空句柄。还有,坐标也要重新计算,在线程中的坐标并不是对话框的相对坐标。另外,线程返回后这些代码已经被回收了。下面的能帮你实现在对话框上显示。

线程函数:需要在创建线程的时候传入对话框指针。在对话框类中声明并初始化必要的变量。
DWORD WINAPI ThreadProc ( LPVOID lpParameter)
{
CsliderDlg *pDlg = (CsliderDlg *)lpParameter;
// CSliderCtrl *pDlg->m_pSliderCtrl = new CSliderCtrl();
pDlg->m_pSliderCtrl = new CSliderCtrl();
pDlg->m_pSliderCtrl -> Create( TBS_VERT | TBS_NOTICKS, CRect( 45, 130, 70, 230 ), (CWnd *)lpParameter, 1004 ); //创建滑动控件
CRect rect;
GetClientRect(pDlg->m_hWnd,&rect);
::MoveWindow(pDlg->m_pSliderCtrl->m_hWnd,rect.left+20,rect.top+20,100,100,1);

pDlg->m_pSliderCtrl -> SetRange( 0, 100, TRUE );
pDlg->m_pSliderCtrl -> SetPos( 50 ); //初始化滑动控件的位置
pDlg->m_pSliderCtrl -> ShowWindow( SW_SHO