怎么获得某一个窗口的某一个控件的句柄 本帖最后由 hibiko 于 2012-09-06 14:07:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 起GPIOThread(LPVOID lpParameter) 的时候需要把你的主窗口的this传进去,在GPIOThread(LPVOID lpParameter) 里CWnd*CDlg =(CWnd*)lpParameter;主窗口类 *CfDlg=(主窗口类*)CDlg;CfDlg->m_mm1(m_mm2).你的控件变量.ModifyStyle(0,SS_BITMAP); 问题是m_mm2这个实例,是不是tab窗口中的那个CDialog2的那个实例呢?虽然都是同一个类,但如果不是同一个实例,而是你临时又定义一个的话,是没有用的,因为新定义的窗口还没有创建呢,只是定义了一个实例而已。你可以在进入线程前,取得当前处于运行态的tab窗口中的那个CDialog2的实例传递给线程 是这个实例,是在主窗口里面的定义 extern传进来的 取得当前处于运行态的tab窗口中的那个CDialog2的实例传给线程 就是不知道怎么取得当前处于运行态的tab窗口中的那个CDialog2的实例传给线程上面打错了 PULONG pid; m_hThread= ::CreateThread(0,0,GPIOThread, (LPVOID)this,//主窗口类的this 0, (PULONG)&pid ); 然后怎么在GPIOThread里面调用呢? GPIOThread的PVOID hdcMain 参数转换回 一.给你要设置风格的控件加控件变量如m_stc二.在GPIOThread(LPVOID lpParameter) 里:CWnd* CDlg =(CWnd*)lpParameter;主窗口类名* CfDlg=(主窗口类名*)CDlg;通过主窗口指针找到CDialog1(m_mm1)或CDialog2(m_mm2)子窗口,如下:CfDlg->m_mm1(m_mm2).m_stc.ModifyStyle(0,SS_BITMAP); CfDlg->m_mm1(m_mm2).你的控件变量.ModifyStyle(0,SS_BITMAP);这个你的空间变量 是啥? 首先你要理解MFC的封装。//改成这样就使正常的,这里我默认认为你将this指针通过pdlg传入到线程中CStatic *pStatic = (CStatic *)pdlg->GetDlgItem(IDC_FRONTLIGHT);这段代码你要明白里面的实际操作,也就是CWND是怎么封装GetDlgItem的。如下代码解释了这个封装;CWnd* CWnd::GetDlgItem(int nID) const{ ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID);}因此相同的道理,把第一段代码改成这样也同样有效。//改成这样就使正常的,这里我默认认为你将this指针通过pdlg传入到线程中HWND pSta = ::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);CStatic *pStatic = (CStatic *)CWnd::FromHandle(pSta); http://blog.csdn.net/crazyleeyang/article/details/5601476 现在还是不行 上面一种不会在后面的函数里卡住,但是很奇怪这个线程一下就停止了下面还是会卡住 我不太明白那个this指针 hThread = ::CreateThread (NULL, 0, GPIOThread, (LPVOID)this, 0, (PULONG)&pid);这句话 我是在BOOL CDialog2::OnInitDialog()里面写的 于是this就指向了tab2的那个窗口吗?还有把this写到CreateThread函数的参数里,那么GPIOThread的参数hdcmain又和this是啥关系,如何变成pdlg的? hThread = ::CreateThread (NULL, 0, GPIOThread, (LPVOID)this, 0, (PULONG)&pid);这句话 是在BOOL CDialog2::OnInitDialog()里面写的,那么this传进去转换后CWnd* CWnd =(CWnd*)lpParameter;CDialog2 *pdlg=(CDialog2 *)CWnd ;唉,还是给你写出来吧DWORD WINAPI GPIOThread (LPVOID lpParameter){ //int i; DWORD dwBytesRead; DWORD dwReturn = 0; DWORD dwControlCode; HBITMAP hBitmap; //char buf[4]={0x1, 0x2, 0x4, 0x8};// CDialog2 *pdlg =(CDialog2*)&m_mm2; CWnd* CWnd =(CWnd*)lpParameter; CDialog2 *pdlg=(CDialog2 *)CWnd ; hGPIOEvent = CreateEvent(NULL, TRUE, FALSE, _T("TE6410_GPIO")); SetEvent(hGPIOEvent); while(1) { WaitForSingleObject(hGPIOEvent, INFINITE); dwControlCode = IOCTL_GPN_0_5_SET_INPUT; DeviceIoControl(hGPIO, dwControlCode, NULL, sizeof(DWORD), NULL, 0, &dwReturn, NULL); ReadFile(hGPIO, &key_value, sizeof(DWORD), &dwBytesRead, NULL); printf ("KEYVALUE %x\r\n",key_value); if(key_value &0x01) { //关联图片ID hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_FRONTLIGHT_ON),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR); //获得指向静态控件的指针 } else { //关联图片ID hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_FRONTLIGHT_OFF),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR); } CStatic *pStatic=(CStatic *)::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);//控件ID //设置静态控件的样式,使其可以使用位图,并试位标显示使居中 pStatic->ModifyStyle(0,SS_BITMAP); //设置静态控件显示位图 pStatic->SetBitmap(hBitmap); // TODO: Add your control notification handler code here Sleep(200); } return 0;} 很感谢 现在可以了 你的意思我理解了但是用这个还是不行CStatic *pStatic=(CStatic *)::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);//控件ID这样还是会在modifystyle里面停下来最后用的是这句CStatic *pStatic=(CStatic *)pdlg->GetDlgItem(IDC_FRONTLIGHT);//控件ID这是为啥呢?这两个按封装来说不是一样的吗? 是一样的,停下来的原因估计是你的pdlg->m_hWnd的问题,很可能为NULL 游戏子窗口是DX画的,怎么找其句柄 ScrollBar最大位置和当前位置 vs2010 glut32.lib总是出错 MFC中文件操作的相关! 奇怪 用CRecordSet查询Access数据库后的问题。 在线!!! 线程终止释放资源的问题。 一个文件读取问题 能不能用vc打开一个指定风格窗口,在其中显示一个网页? USB GUID missing function header (old-style formal list?) 问题 MFC 在动态链接库中创建按钮 突然发现单位的网能上csdn了,窃喜。嘿嘿!
CWnd*CDlg =(CWnd*)lpParameter;
主窗口类 *CfDlg=(主窗口类*)CDlg;
CfDlg->m_mm1(m_mm2).你的控件变量.ModifyStyle(0,SS_BITMAP);
是这个实例,是在主窗口里面的定义 extern传进来的 取得当前处于运行态的tab窗口中的那个CDialog2的实例传给线程
m_hThread= ::CreateThread(0,0,GPIOThread,
(LPVOID)this,//主窗口类的this
0,
(PULONG)&pid
);
主窗口类名* CfDlg=(主窗口类名*)CDlg;
通过主窗口指针找到CDialog1(m_mm1)或CDialog2(m_mm2)子窗口,如下:
CfDlg->m_mm1(m_mm2).m_stc.ModifyStyle(0,SS_BITMAP);
CfDlg->m_mm1(m_mm2).你的控件变量.ModifyStyle(0,SS_BITMAP);这个你的空间变量 是啥?
CStatic *pStatic = (CStatic *)pdlg->GetDlgItem(IDC_FRONTLIGHT);
这段代码你要明白里面的实际操作,也就是CWND是怎么封装GetDlgItem的。
如下代码解释了这个封装;CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL)
return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
else
return m_pCtrlCont->GetDlgItem(nID);
}
因此相同的道理,把第一段代码改成这样也同样有效。//改成这样就使正常的,这里我默认认为你将this指针通过pdlg传入到线程中
HWND pSta = ::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);
CStatic *pStatic = (CStatic *)CWnd::FromHandle(pSta);
http://blog.csdn.net/crazyleeyang/article/details/5601476
下面还是会卡住
我不太明白那个this指针
hThread = ::CreateThread (NULL, 0, GPIOThread, (LPVOID)this, 0, (PULONG)&pid);
这句话 我是在BOOL CDialog2::OnInitDialog()里面写的 于是this就指向了tab2的那个窗口吗?
还有把this写到CreateThread函数的参数里,那么GPIOThread的参数hdcmain又和this是啥关系,如何变成pdlg的?
这句话 是在BOOL CDialog2::OnInitDialog()里面写的,那么this传进去转换后CWnd* CWnd =(CWnd*)lpParameter;
CDialog2 *pdlg=(CDialog2 *)CWnd ;
唉,还是给你写出来吧DWORD WINAPI GPIOThread (LPVOID lpParameter)
{
//int i;
DWORD dwBytesRead;
DWORD dwReturn = 0;
DWORD dwControlCode;
HBITMAP hBitmap;
//char buf[4]={0x1, 0x2, 0x4, 0x8};
// CDialog2 *pdlg =(CDialog2*)&m_mm2; CWnd* CWnd =(CWnd*)lpParameter;
CDialog2 *pdlg=(CDialog2 *)CWnd ; hGPIOEvent = CreateEvent(NULL, TRUE, FALSE, _T("TE6410_GPIO"));
SetEvent(hGPIOEvent);
while(1)
{
WaitForSingleObject(hGPIOEvent, INFINITE);
dwControlCode = IOCTL_GPN_0_5_SET_INPUT;
DeviceIoControl(hGPIO,
dwControlCode,
NULL,
sizeof(DWORD),
NULL,
0,
&dwReturn,
NULL);
ReadFile(hGPIO, &key_value, sizeof(DWORD), &dwBytesRead, NULL);
printf ("KEYVALUE %x\r\n",key_value);
if(key_value &0x01)
{
//关联图片ID
hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_FRONTLIGHT_ON),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
//获得指向静态控件的指针
}
else
{
//关联图片ID
hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_FRONTLIGHT_OFF),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
}
CStatic *pStatic=(CStatic *)::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);//控件ID
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pStatic->ModifyStyle(0,SS_BITMAP);
//设置静态控件显示位图
pStatic->SetBitmap(hBitmap);
// TODO: Add your control notification handler code here
Sleep(200);
}
return 0;
}
但是用这个还是不行
CStatic *pStatic=(CStatic *)::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);//控件ID
这样还是会在modifystyle里面停下来
最后用的是这句
CStatic *pStatic=(CStatic *)pdlg->GetDlgItem(IDC_FRONTLIGHT);//控件ID
这是为啥呢?这两个按封装来说不是一样的吗?