导航:首页 > IDC知识 > mfc通过idc获取hwnd

mfc通过idc获取hwnd

发布时间:2020-11-23 01:58:44

1、MFC窗口句柄

void ReadTime(LPVOID hWnd)
{

char str[50];
SYSTEMTIME a;
sprintf(str,"%u:%u:%u",a.wHour,a.wMinute,a.wSecond);
::SetWindowText(*(HWND*)hWnd,str);
Sleep(1000);}

void CRentimeDlg::OnButton1()
{
HANDLE pthread;
DWORD threadId;
pthread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ReadTime,(LPVOID)&GetDlgItem(IDC_STATIC_TIME)->m_hWnd,0,&threadId);
}

//IDC_STATIC_TIME是你要显示时间的静态文本框专的属控件ID

2、GetDlgItem的用法

CButton* btn = (CButton*)GetDlgItem(IDC_BUTTON_SEND);-SetWindowTextW(_T("hello"));如果想得到其他对话框中的控件,用GetDlgItem(hwnd,IDD);CWnd::GetDlgItem(int nID)这个是一个类成员函数,可使用CWnd* pWnd = GetDlgItem(ID_XXX);而HWND GetDlgItem(HWND hDlg, // handle of dialog boxint nIDDlgItem // identifier of control);是一个sdk的函数两个的主要区别是用的地方不一样一个参数的是在窗口中调用的函数,两个参数的是在平台SDK中调用的你在对话框类里面调用GetDlgItem(IDC_BOARD_SIZE),就是调用的类成员函数CWnd::GetDlgItem获得某个控件的句柄GetDlgItem(IDC_BOARD_SIZE)-m_hWnd就可以了如果要用到第二种用法,要这样::GetDlgItem(this- m_hWnd,IDC_BOARD_SIZE);效果一样的那个IDC_BOARD_SIZE是你某个控件的id,如果HWND GetDlgItem(HWND hDlg, // handle of dialog boxint nIDDlgItem // identifier of control);的话,第一个参数是窗体的句柄,第二个参数是某个控件的ID,和IDC_BOARD_SIZE是一个意思GetDlgItem(IDC_..),GetDlgItem(HWND hWnd,GetDlgItem(IDC_..)是一个非静态方法,意思是你对话框内获取该控件指针,所以这里不需要获取对话框句柄,也就是说你如果在非对话框窗口里面调用这个方法就肯定会出错GetDlgItem(HWND hWnd, IDC_..)是一个静态方法,它是一个让你指定从哪个对话框里获取控件指针举个例子:你调用了上厕所这个函数,如果你在家里的话肯定是在自己家里上厕所,所以不需要知道在哪里上厕所(hwnd)如果你在室外那么上厕所就一定要选一个地方(hwnd)。如果说你上厕所的地方都不是一个房间,那么肯定会报错嘛,因为你在随地大小便,哈哈所以你先搞清楚这两个函数的使用环境区别

3、SetDlgItemText(hwnd,IDC_TIME,strTime);显示不出来,第一个参数设置不对,如何设置啊

对象名.m_hWnd 或者 GetSafeHwnd()

4、HWND hwndCombo1 = GetDlgItem ( hwnd, IDC_COMBO1 );

这个函数就是获得了hwnd句柄所关联的窗口中ID为IDC_COMBO1的窗口的句柄。
获得一个窗口的句柄之后,就可以对它进行很多操作了。呵呵

5、::GetDlgItemText(m_hWnd,IDC_EDIT5,ch1,300);

调用API函数(抄api和mfc函数袭同名 区分方法 加::表示api,)
得到控件ID为 IDC_EDIT5的文本框中的内容存放到 ch1指向的字符数组中长度为300
改api的第一个参数为目标对话框窗口的句柄
再mfc中
m_hWnd 是
CWnd 类的 一个成员变量 对话框xxxDlg派生自CDialog ,CDialog派生自CWnd
故xxxDlg对话框类就从 CWnd继承到了 m_hWnd这个成员变量了, 这个成员变量是用来保存
窗口的句柄滴

6、MFC 线程 SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_BJXX, strTime);

在CreateThread创建的线程来中调用AfxGetApp()就会有问题源。
既然你想在线程中访问m_hWnd,解决方法(1)直接在主线程中定义一个全局的HWND变量保存m_hWnd,这样线程中可直接调用(2)在主线程中定义一个结构体,在结构体中定义一个HWND变量保存m_hWnd,然后把这个结构体类型的指针传递给CreateThread的第四个变量,这样同样也能在线程里通过指针访问到变量。

7、MFC子线程操作界面

1. 参数不对,复调用的是CWnd的成员函数制GetDlgItem
GetDlgItem(hwnd,IDC_PROCESSSHOW)
改为
::GetDlgItem(hwnd,IDC_PROCESSSHOW)->

2. 你是在线程中调用,根据这个结果,你的线程函数应该还是非Static成员, 需要在声明处加上static声明。

修改试试,不行再追问。

8、MFC 对话框问题

#include "stdafx.h"
#include "resource.h"
BOOL CALLBACK dlgFunc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
(wParam)
{
case IDCANCEL:
EndDialog(hwndDlg,IDCANCEL);
break;
case IDC_BUTTON1:
{
int nLEFT=GetDlgItemInt(hwndDlg,IDC_LEFT,NULL,TRUE);
int nRIGHT=GetDlgItemInt(hwndDlg,IDC_RIGHT,NULL,TRUE);
char M[10];
GetDlgItemText(hwndDlg,ID_M,M,9);//字符串要用text接收
switch(M[0])//单个字符判断
{
case '+':
SetDlgItemInt(hwndDlg,IDC_RESULT,nLEFT+nRIGHT,TRUE);
break;
case '-':
SetDlgItemInt(hwndDlg,IDC_RESULT,nLEFT-nRIGHT,TRUE);
break;
case '*':
SetDlgItemInt(hwndDlg,IDC_RESULT,nLEFT*nRIGHT,TRUE);
break;
case '/':
SetDlgItemInt(hwndDlg,IDC_RESULT,nLEFT/nRIGHT,TRUE);
break;
}
return FALSE;
}
break;
}
break;
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,dlgFunc);
return 0;
}

这是一个win32程序,而不是MFC程序。以上代码调试无误。

9、怎么样得到一个IDC_BUTTON的HWND

你既然定义了CMyButton类,抄
就可以子袭类化到IDC_BUTTON1上去。
控件变量会把,定义个IDC_BUTTON1的控件变量,然后在.h文件里头将
CButton m_theButton;修改为:
CMyButton m_theButton;

剩下的工作就可以在 CMyButton里面去做了,重载WindowProc
加:
if ( WM_MOUSEHOVER== message)
{
// 写你自己的处理。
}

这样不需要得到句柄,系统会自动附加的。

与mfc通过idc获取hwnd相关的知识