導航:首頁 > 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相關的知識