MFC常用函数总结
1、MFC編輯框、靜態文本框相關的常用函數
《1》GetDlgItemText(ID ,str)
作用:從對話框中獲取文本
第一個參數為要獲取的編輯框(或者靜態文本框、單選按鈕等可以顯示內容的控件)的ID,第二個參數為字符串(Cstring?類型)的變量,獲取的文本存儲在str中。
《2》SetDlgItemText(ID,str)
作用:將字符串顯示在控件中
第一個參數為要顯示的編輯框(或者靜態文本框、單選按鈕、組合框等可以顯示內容的控件)的ID,第二個參數為字符串(Cstring?類型)的變量,顯示的文本存儲在str中。如果要顯示的變量的類型不是Cstring,則通過Format函數強制轉換。
通常還要加一個UpDateData(FALSE)。
《3》UINT nID=GetCheckedRadioButton(IDC1, IDC2);
作用:獲取單選框的選項的ID
第一個參數為該組合框中第一個單選按鈕的ID,第二個參數為該組合框中最后一個按鈕的ID。
《4》CheckRadioButton(IDC1, IDC2, IDC3);
作用:初始化單選按鈕
第一個參數為該組合框中第一個單選按鈕的ID,第二個參數為該組合框中最后一個按鈕的ID,第三個參數為為缺省選項的ID。
《5》m_scrollBar.SetScrollRange(0, 500) ;
作用:設置水平滾動條的取值范圍,m_scrollBar為水平滾動條的控制類型的變量,0為設置最小值,500為設置的最大值。
《6》m_nAmount = m_slider.GetPos() ;
作用:獲取滑塊的當前位置。
《7》m_slider.SetRange(0,1000) ;
作用://設置滑塊取值范圍
第一個參數為設置的最小值,第二個參數為設置的最大值。
《8》double Volum = atof(strCtrl);
作用:將字符串strCtl轉換成浮點型的Volum
《9》int Volum = atof(strCtrl);
作用:將字符串strCtl轉換成整型的Volum
《10》MessageBox(str) ;(局部函數)
作用:輸出字符串str
《11》AfxMessageBox(str) ;(全局函數)
作用:輸出字符串str
《12》tempt = m_time2.Format("%H:%m:%S") ;
作用:將時間轉化成字符型(時、分、秒)
m_time2為日歷時間選取器的變量,tempt為CString型變量
《13》tempt = m_time.Format("%Y-%m-%d") ;//將時間轉化成字符型
作用:將時間轉化成字符型(年、月、日)
m_time2為日歷時間選取器的變量,tempt為CString型變量
《14》m_time = CTime::GetCurrentTime();
作用:獲取系統當前時間
m_time為Ctime類型的變量。
《15》m_list.AddString(str);
功能:將Cstrig類型的變量的內容顯示在列表框中(或者組合框中)。
m_str為ClistBox類型的變量(或者是CcomboBox類型的變量)。
《16》m_time = CTime(2012 ,5 ,28 ,0 ,0 ,0) ;
功能:初始化日期
m_time為Ctime類型的變量
《17》str.TrimLeft();
功能:去掉Cstring類型變量的左邊的空格
《18》str.TrimRight();
功能:去掉Cstring類型變量的右邊的空格
《19》str.IsEmpty();
功能:判斷Cstring類型的變量str是否為空,如果為空則返回1,否則返回零。
《20》int nIndex=m_list.FindString(int k,str);
功能:列表框中查找與str匹配的列表項,m_list為ClistBox類型變量。
從第k個位置開始查找,若為-1,則從頭至尾查找。
函數原型:
int FindString(int nStartAfter,LPCTSTR lpszItem) const;
int FindStringExact(int nIndexStart,LPCTSTR lpszFind) const;
其中,FindStringExact的查找精度最高
《21》m_list.ResetContent() ;
功能:清空列表框中的內容
m_list為ClistBox類型變量。
《22》m_listSearch.DeleteString(int? nIndex);
功能:刪除列表框中的第nIndex條記錄。
m_listSearch為ClistBox類型變量。
《23》GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(FALSE);
功能:是ID為IDC_BUTTON_DELETE的按鈕灰選。
《24》GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(TRUE);
功能:是ID為IDC_BUTTON_DELETE的按鈕還原。
《25》str.Left(length);
功能:獲取字符串str左邊長度為length的值。
《26》int length = str.GetLength() ;
功能:獲取字符串str的長度
《27》dlg.DoModal() ;
功能:建立一個對話框
dlg為該對話框的類的對象。
《28》CDialog::OnCancel() ;
功能:關閉窗口
《29》CMenu* pSysMenu=GetMenu();
功能:獲取程序菜單指針
《30》int nCount=pSysMenu->GetMenuItemCount();
功能:獲取項層菜單項的項數
《31》int nIndex=m_ListBox.GetCurSel();
功能:獲取指針在列表框中的位置
m_ListBox為ClistBox類型變量。
《32》GetWindowText(str) ;
功能:獲取當前窗口的標題
Str為Cstring?類型的變量
?
《33》GetDlgItem(IDC_CLICKHERE)->SetFocus();
將光標設置在控件IDC_CLICKHERE處,若是在打開某個對話框時候做此設置,則將該語句加到消息處理函數OnInitDialog的return語句前,并且將最后的語句 return TRUE;?該為 return FALSE;
GetDlgItem(IDC_CLICKHERE)->SetFocus();也可寫成m_strit.SetFocus();
其中m_strit為該控件對應的變量。
?
《34》GetDlgItem(IDC_STATIC_NUMBER1)
功能:獲取ID為IDC_STATIC_NUMBER1控件的指針.
例如:
CString str ;
GetDlgItem(IDC_STATIC_NUMBER1)->GetWindowText(str) ;//此句等價于
GetDlgItemText(IDC_STATIC_NUMBER1,str);
?
《35》int? num1 = GetDlgItemInt(IDC_EDIT1);
功能:獲取ID為IDC_EDIT1控件的文本并且轉化成整形的值,如果文本中含有非數字字符則轉化失敗.
?
《36》SetDlgItemInt(IDC_EDIT3,num3) ;
功能:將整數num3顯示在ID為IDC_EDIT3的編輯框中.
?
《37》::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
注意:在函數前面加上作用域分節符表示調用的是全局函數.
功能:取ID為IDC_EDIT1控件的文本,獲取的最大長度為10,并且將獲取的內容存儲在ch1中.相當于GetDlgItemText(IDC_EDIT1,ch1,10);
說明:第一個參數為對應控件的句柄,第二個參數為消息名稱,第三個參數為獲取文本的最大長度,第四個參數為存儲文本的緩沖區,此處ch1為字符數組,即?char ch1[10];第四個參數的類型必須強制轉換成LPARAM.
此函數有多種調用方式,其功能是相同的。列舉如下:
(1) ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
(2) GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
(3) m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
(4) ::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
其中m_edit1是IDC_EDIT1控件的類別為Control,類型為CEdit的變量.
?
《38》::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,0,(LPARAM)ch3);
功能:將緩沖區ch3的內容顯示在D為IDC_EDIT1控件上.其作用相當于SetDlgItemText(IDC_EDIT1,ch1);
說明:第一個參數為對應控件的句柄,第二個參數為消息名稱,第三個參數用不上,故設置為零,第四個參數為要顯示的文本內容,?第四個參數的類型必須強制轉換成LPARAM.
?
《39》SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);
功能等價于::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
?
《40》SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);
功能等價于::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,0,(LPARAM)ch3);
2、常用函數(比較全)
WinExec()
ExitWindowsEx()
GlobalMemoryStatus()
GetSystemInfo()
GetSystemDirectory()
GetWindowsDirectory()
GetTaskmanWindow() //user32.dll中 獲取任務欄窗口句柄
?
OpenProcessToken()打開一個進程的訪問令牌
GetCurrentProcess()獲取本進程句柄
LookupPrivilegeValue()修改進程權限
AdjustTokenProvileges()通知WindowsNT修改本進程權利
?
CreateRectRgn()
CreateEllipticRgnIndirect()
PtInRegion()
CommandToIndex()ID號轉換為索引值
?
菜單類:
DrawMenuBar()重畫菜單
SetDefaultItem()設置默認菜單項
CheckMenuItem()設置菜單項Check狀態
CreatePopupMenu()創建彈出菜單
?
窗口類:
MoveWindow()
Invalidate()使窗口無效,窗口無效時會進行窗口重繪
GetParent()獲得窗口的父窗口句柄
BringWindowToTop()把窗口放到頂部
SetWindowPos()
DeferWindowPos()
SetActiveWindow()激活頂層窗口
Set/GetForegroundWindow()設置/獲取前臺窗口,返回句柄
Set/GetWindowLong()改變窗口屬性
GetNextWindow()獲取下一個窗口句柄
GetWindow()獲取窗口句柄
FromHandle()通過句柄獲取指針
AfxGetInstanceHandle()獲取程序當前實例句柄
AfxRegisterWndClass()
Set/GetClassLong()
Set/GetWindowLong()
GetWindowRect()獲取窗口在屏幕中的Rect
?
對話框:
GetDlgItem()
Set/GetDlgItemText()
Set/GetDlgItemInt()
Set/GetDlgItem()
SendDlgItemMessage()
SetFocus()文本編輯框Edit控件若要響應回車按鍵消息,必須設置為多行類型
GetNextDlgTabItem()獲取下一個有TABStop屬性的控件句柄
OnCtlColor()WM_CTLCOLOR窗口繪制消息響應函數
GetDlgCtrlID()
SetButtonText()設置按鈕文本CreateRectRgn
GetStartPosition()
GetNextPathName()
SetHorizontalExtent()
SHBrowseForFolder()
?
屬性表單:
SetWizardMode()
SetWizardButtons()
OnSetActive()
?
工具欄:
RecalcLayout()
ShowControlBar()
?
狀態欄:
CommandToIndex()根據ID號獲取索引值
SetMessageText()
GetMessageBar()
GetDescendantWindow()
?
圖形類
OnEraseBkgnd()
CButton::DrawItem()
SetBkMode()設置文字背景
SetTextColor()
SetBkColor()
SetROP2()
SetClipRtn()
DrawText()
BeginPath()
EndPath()
BeginPaint()
EndPaint()
GetTextExtend()
SetWorldTransform()
GetDeviceCaps()
Set/GetViewportOrg()
Set/GetWindowOrg()
DPtoLP()將設備坐標點轉換為邏輯坐標點
LPtoDP()將邏輯坐標點轉換為設備坐標點
?
DeleteMetaFile()
CopyMetaFile()
GetMetaFile()
GetEnhMetaFile()
?
void CView::OnPaint()
{
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
?
文件操作:
EncryptFile()
CreateFile()
ReadFile()
WriteFile()
SetFilePointer()
::WriteProfileString()向win.ini寫入相關信息
::GetProfileString()從win.ini獲取相關信息
CWinApp::WriteProfileString()向注冊表中寫入相關信息
CWinApp::GetProfileString()從注冊表中獲取相關信息
::WritePrivateProfileString()
RegCreateKeyEx()創建注冊表項
RegCloseKey()關閉注冊表項
RegOpenKeyEx()打開注冊表項
RegSetValueEx()寫入注冊表項
RegQueryValueEx()讀取注冊表項
RegEnumKeyEx()
RegDeleteKey()
?
文檔視圖:
?
?
鉤子:
SetWindowsHookEx()
CallNextHookEx()
UnhookWindowsHookEx()
GetCurrentThreadID()
GetModuleHandle()
?
動態庫:
#pragma data_seg()
#pragma comment(linker,"/section:XXX,RWS") R可讀W可寫S共享
?
SEGMENTS
XXX READ WRITE SHARED
?
MAKEINTRESOURCE()
GetProcAddress()獲取函數地址
LoadLibrary()加載Dll
FreeLibrary()減少Dll的引用計數
?
多線程:
CreateThread()
CloseHandle()
?
互斥:
CreateMutex()
ReleaseMutex()
WaitForSingleObject()
?
事件:
CreateEvent()
SetEvent()設置有信號狀態
ResetEvent()設置無信號狀態
?
臨界區:
EnterCriticalSection()
InitializeCriticalSection()
LeaveCriticalSection()
DeleteCriticalSection()
?
異步套接字:
WSAAsyncSelect()為一個套接字請求網絡消息通知
WSAEnumProtocols()檢索可用的網絡通信協議
WSASocket()
?
剪貼板:
OpenClipboard()打開剪貼板
CloseClipboard()關閉剪貼板
EmptyClipboard()清空剪貼板
SetClipboardData()
GetClipboardData()
GlobalAlloc()
GlobalLock()
GlobalUnlock()
IsClipboardFormatAvailable()
?
匿名管道:
CreatePipe()
CreateProcess()
CreateFile()
ReadFile()
WriteFile()
?
命名管道:
CreateNamedPipe()
ConnectNamedPipe()
WaitNamedPipe()
CreateFile()
ReadFile()
WriteFile()
?
郵槽:
CreateMailslot()
?
多媒體:
mciSendCommand()<mmsystem.h>
?
窗口、控件的指針和句柄的相互轉化
?
1指針轉化為句柄
?
在MFC應用程序中首先要獲得窗口的指針,然后將其轉化為句柄
?
CWnd* pWnd;
?
HANDLE hWnd = pWnd->GetSafeHwnd();
?
2句柄轉化為指針
?
在MFC應用程序中首先獲得對話框控件的句柄,然后獲得其指針
?
HANDLE hWnd;
?
GetDlgItem(IDC_xxx,&hWnd);
?
CWnd * pWnd = FromHandle(hWnd);
?
?
獲得程序窗口指針的辦法
?
1獲得主框架窗口指針(任何時候都可以用,只要是MFC程序中)
?
CWnd* pWnd = AfxGetMainWnd();
?
2獲得對話框中控件指針
?
CWnd* pWnd = GetDlgItem(IDC_xxx);
?
3獲得對話框中某控件的句柄
?
HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);
?
4獲得GDI對象的句柄
?
HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle();
?
1. 如何獲取應用程序的 實例句柄? AfxGetInstanceHandle()
?? ? 應用程序的 實例句柄保存在CWinAppIm_hInstance 中,可以這么調用 AfxGetInstancdHandle獲得句柄.
?? ? ? Example: HANDLE hInstance=AfxGetInstanceHandle();
?
2. 如何通過代碼獲得應用程序主窗口的 指針? AfxGetMainWnd ? GetSafeHwnd() AfxGetAppName() ? AfxGetThread
?? ?主窗口的 指針保存在CWinThread::m_pMainWnd中,調用 AfxGetMainWnd實現。?
?
?? 【例】 ? ?AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.?
?
?? 【例】此例的主窗口是對話框,下面的代碼是在另外一個CFileTreeCtrl 類(子窗)中相關函數實現在主對話框(主窗)中的幾個 靜態文本框(子窗)中顯示路徑:
?? ? ? ? ? ? CWnd* m_pCWnd= AfxGetMainWnd(); //得到主窗口指針,通過主窗指針訪問其他子窗資源
?? ? ? ? ? ? //方法一
?? ? ? ? ? ? m_pCWnd->SetDlgItemText(IDC_STATIC_path,"CWnd* "+m_sCurPath); //在主窗中的子窗(ID:IDC_STATIC_path)中顯示字符串
?? ? ? ? ? ? m_pCWnd->SetDlgItemText(IDC_STATIC_who,"路徑顯示由FileTreeCtrl類完成:");
?? ? ? ? ? ? //方法二
?? ? ? ? ? ? m_pCWnd->SendMessage(STN_CLICKED); //向主窗口發送一個消息,顯示任務由主窗完成。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//在主窗的.cpp中有:ON_MESSAGE(STN_CLICKED, OnSTATICpath3)相關描述?
?
?? ? ? ? ? ?//有的函數必須通過窗口的 句柄 來訪問,我們可以使用下面的方法三
?? ? ? ? ? ?//CWnd::GetSafeHwnd?
?? ? ? ? ? ?//Returns the window handle for a window
?? ? ? ? ? ?//HWND GetSafeHwnd( ) const;
?? ? ? ? ? ?HWND m_hWnd_tree =GetSafeHwnd();//【注】此處得到的只是當前窗口(FileTree類)的句柄
?? ? ? ? ? ?HWND m_hWnd = m_pCWnd->GetSafeHwnd();// 這里才是主窗口的句柄(由主窗指針得到主窗的句柄)
?
?? ? ? ? ? ?//BOOL SetWindowText( HWND hWnd, LPCTSTR lpString )
?? ? ? ? ? ?::SetWindowText(m_hWnd,"ok2222");//修改主窗口標題
?? ? ? ? ? ?::SetDlgItemText(m_hWnd,IDC_STATIC_path2,"HWND: "+m_sCurPath);?
?
?? 【另】AfxGetThread
?? ? ? CWinThread* AfxGetThread( );
?? ? ? Return Value:Pointer to the currently executing thread.?
?
3. 如何在程序中獲得其他程序的 圖標? AfxGetInstanceHandle()?
?
?? HINSTANCE AfxGetInstanceHandle( );
?? ?Return Value
?? ? ?An HINSTANCE to the current instance of the application. If called from within a DLL linked with the USRDLL version of MFC, an HINSTANCE to the DLL is returned.
?? ?Remarks
?? ? ?This function allows you to retrieve the instance handle of the current application. AfxGetInstanceHandle always returns the HINSTANCE of your executable file (.EXE) unless it is called from within a DLL linked with the USRDLL version of MFC. In this case, it returns an HINSTANCE to the DLL.
?
?? ? ?兩種方法:
?? ? ? ? (1) SDK函數 SHGetFileInfo 或使用 ExtractIcon獲得圖標資源的 handle(句柄),
?? ? ? ? (2) SDK函數 SHGetFileInfo獲得有關文件的 很多信息,如大小圖標,屬性,類型等.
?
?? ? ? ? ? Example(1): 在程序窗口左上角顯示 NotePad圖標.
?? ? ? ? ? ?void CSampleView: OnDraw(CDC * pDC)
?? ? ? ? ? ? ?{
?? ? ? ? ? ? ? ? if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
?? ? ? ? ? ? ? ? ? ? ?&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
?? ? ? ? ? ? ? ? ? ?{
?? ? ? ? ? ? ? ? ? ? ?pDC ->DrawIcon(10,10,stFileInfo.hIcon);
?? ? ? ? ? ? ? ? ? ?}
?? ? ? ? ? ? ? }
?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ? ? ?Example(2):同樣功能,Use ExtractIcon Function
?? ? ? ? ? void CSampleView:: OnDraw(CDC *pDC)
?? ? ? ? ? ? ? {
?? ? ? ? ? ? ? ? HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
?? ? ? ? ? ? ? ? ?("NotePad.exe"),0);
?
?? ? ? ? ? ? ? ? if (hIcon &&hIcon!=(HICON)-1)
?? ? ? ? ? ? ? ? ? ?pDC->DrawIcon(10,10,hIcon);
?? ? ? ? ? ? ? }
?? ?【說明】關于如何得到系統文件的正確路徑,象win.ini system32.ini等的路徑,各種系統中具體的路徑是不一樣的。如:
?? ? ? ? ? ?獲得notepad.exe的路徑正規上來說用GetWindowsDirectory 函數得到;
?? ? ? ? ? ?如果是調用 win95下的畫筆,應該用訪問注冊表的方法獲得其路徑;
?? ? ? ? ? ?要作成一個比較考究的程序,考慮應該全面點.
?
?? ?【另】
?? ? ? ? ? ? ? ? HINSTANCE AfxGetResourceHandle( );
?? ? ? ? ? ? ? ? Return Value:An HINSTANCE handle where the default resources of the application are loaded.?
?
4. ? ?有關取得桌面句柄 GetDesktopWindow()?
?
MSDN中的例子:?
?
// 靜態函數CWnd:: GetDesktopWindow 返回桌面窗口的指針。下例說明了MFC
void CFrameWnd::BeginModalState ()
{
?? //first count all windows that need to be disabled
?? UINT nCount=0;
?? HWND hWnd=:: GetWindow (:: GetDesktopWindow (), GW_CHILD);
?? while (hWnd!=NULL)
?? {
?? ? if (:: IsWindowEnabled (hwnd) &&
?? ? ? ? CWnd::FromHandlePermanent (hWnd)!=NULL &&
?? ? ? ? AfxIsDescendant (pParent->m_hWnd, hWnd) &&
?? ? ? ? :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0) == 0)
?? ? {
?? ? ? ?++nCount;
?? ? }
?? ? hWnd=:: GetWindow (hWnd, GW_HWNDNEXT);
?? }
}?
?
//用戶的問題:下面程序取的不是同一程序的句柄,但是GetModuleFileName返回的結果一樣請問為什莫?
?
HWND ChWnd;//子窗口句柄?
HWND hwDesktop=::GetDesktopWindow();//取得桌面句柄?
ChWnd=::GetWindow(hwDesktop,GW_CHILD);//取得桌面子句柄?
CString csTitle,csClass,csTm,mLookstring;?
char szBuffer[255];?
while(ChWnd!=NULL)//循環取子句柄的同級句柄?
{?
?? ? if(::IsWindowVisible(ChWnd))//判斷是否為可顯示窗口?
?? ? {?
?? ? ? ? ?::GetWindowText(ChWnd,csTitle.GetBuffer(255),254);?
?? ? ? ? ?::GetClassName(ChWnd,csClass.GetBuffer(255),254);?
?? ? ? ? ?csTitle.ReleaseBuffer();//標題?
?? ? ? ? ?csClass.ReleaseBuffer();//類名?
?? ? ? ? ?csTm.Format("%08X:",ChWnd);?
?? ? ? ? ?if(csTitle=="")?
?? ? ? ? ?{?
?? ? ? ? ? ? ? ?mLookstring=csTm+csClass;?
?? ? ? ? ?}else?
?? ? ? ? ?{?
?? ? ? ? ? ? ? ?mLookstring=csTm+csTitle;?
?? ? ? ? ?}?
?? ? ? ? ?//這里的窗口句柄不是同一個程序吧?(問題所在!)可是為什莫結果一樣?
?? ? ? ? ?HINSTANCE hInstance = (HINSTANCE)::GetWindowLong(ChWnd,DWL_USER);?
?? ? ? ? ?::GetModuleFileName(hInstance, szBuffer, sizeof(szBuffer));?
?? ? ? ? ?MessageBox(szBuffer,mLookstring);?
?? ? }?
?? ? ChWnd=::GetWindow(ChWnd,GW_HWNDNEXT);?
}?
?
回答:?
?
問題在于Win32下GetWindowLong(ChWnd,DWL_USER)總是返回當前程序運行的hInstance,所以你得到的文件名總是一個。所以你要用枚舉所有"進程的程序名"來獲得程序名。?
?
?
=== 再談句柄與指針的區別?
?
許多開始學習VC的朋友,最多聽說的兩個詞莫過于指針和句柄了。?
但是,確經常搞不清他們之間的區別。?
首先,句柄是一個窗口的標志,也就是所有從CWND類繼承下來的,多有句柄這個成員。?
他能做的,也就是唯一代表一個桌面上的窗口罷了。而指針是一個地址,如果它指向了一個內存中的對象,那么就可以對它進行任意操作了,當然,并不局限于自己的應用程序,你如果能夠獲得別的應用程序的某個對象的指針,也可以進行操作。然而,如果要獲得指針,首先,必須找到那個窗口的句柄,然后用函數FromHandle就可以得到他的指針了。?
?
=== ? 問題1:?
?
如何在自定義的消息中發送一個字符串?例如:?
SendMessage(MyWnd,WM_USERDEFINED, 0,0)?
如何將字符串Buffer寫入wParam或lParam??
?
你可以把字符串的地址傳遞過去,因為地址正好是32位。如:?
char s[256];?
SendMessage(MyWnd,WM_USERDEFINED, (WPARAM) s,0)?
接收方只需要將wParam賦給一個char*就可以了。但此方法只能使用于在一個進程內部傳遞數據。?
?
?
=== ? 問題2:?
1.在VC應用程序框架中,如何加入自己做的類,如何定義這個類的對象,我想在鼠標點擊某個菜單項的時候才生成這個對象,做得到嗎?(這個類的構造函數是帶參數的)。?
2.消息發送函數:?
?? PostMessage(HWND handle,WM_MYMESSAGE,?
?? ? ? ? ? ? ? WPARAM wParam,LPARAM lParam)?
?? 中:?
第一個參數如何獲得?
如果我的消息是在自己的應用程序中生成的,想發給應用程序的窗口讓它顯示某些數據(用TextOut函數),能做到嗎?
(也可以說是這樣的問題:用Appwizard生成應用程序框架,在生成的類(如CView)中如何得到窗口的句柄,并放在PostMessage函數中。)?
3.wParam,lParam,在消息響應函數中如何用?vc是怎樣保證這兩個數傳到函數中的?問題比較多,謝謝!?
水平: 剛入門?
?
回答:?
?
1、這個問題是肯定的。你可以使用ClassWizard定義類,也可以手工輸入。如果類定義已經在某個文件中,只要使用Project|Add files將文件加入工程就可以了。要想定義類的對象,只要在你的菜單項的相應事件中就可以了。如:?
{?
...?
MyClass myObject("Hello");?
myObject.MyMethod();?
...?
}?
2、在你自己的程序中傳遞消息當然沒有任何問題,只要你知道要調用的窗口類是從CWnd繼承來的,你就可以使用GetSafeHwnd函數獲得窗口句柄。不過一般在自己的同一個程序中有時不愿意使用自定義消息,因為太麻煩。你完全可以給要調用的類添加一個成員函數,只要想顯示數據,直接調用這個成員函數不就可以了?何必使用PostMessage呢?一般只有在程序間調用,才愿意使用自定義消息。這時,你通常可以使用FindWindow獲得窗口句柄(QA000251 "如何利用FindWindow()函數查找程序")。?
3、對于MFC已經定義了消息處理函數的消息,MFC會自動把wParam和lParam映射為更容易使用的方式。如OnMouseMove( UINT nFlags, CPoint point )。對于MFC不能自動處理的函數,如你使用ON_MESSAGE定義消息函數,則MFC會把wParam和lParam原原本本的傳遞給你的函數,不做任何處理。?
?
=== ? 一個未公開的Win32 API函數:GetTaskmanWindow ? ()?
?
?? ? 下例中還用到: GetProcAddress ? ? GetParent(hWnd)
?? ? ? ? ? ? ? ? ? ? HMODULE hUser32 = GetModuleHandle("user32");?
?
download
?
// getaskmanwnd.cpp (Windows NT/2000)
//
// 利用一個未公開的Win32 API函數:GetTaskmanWindow,
// 對Windows的任務欄進行操作(顯示/隱藏)。這個函數返回擁有任務欄按鈕的窗口句柄。
//
// This example will show you how you can obtain a handle to the
// Windows Taskbar window.
//
// (c)1999 Ashot Oganesyan K, SmartLine, Inc
// mailto:ashot@aha.ru, http://www.protect-me.com, http://www.codepile.com
?
#i nclude <windows.h>
#i nclude <stdio.h>
?
?
// User32!GetTaskmanWindow (NT specific!)
//
// This function returns a handle to the window that ownes the taskbar buttons
//
// HWND GetTaskmanWindow()
//
typedef HWND (WINAPI *PROCGETTASKMANWND)(void);
?
?
PROCGETTASKMANWND GetTaskmanWindow;
?
?
void main(int argc, char* argv[])
{
if (argc<2)
{
printf("Usage:\n\ngetaskmanwnd.exe S|H\n");
return;
}
?
HMODULE hUser32 = GetModuleHandle("user32");
if (!hUser32)
return;
?
GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow");?
if (!GetTaskmanWindow)
return;
?
HWND hWnd = GetTaskmanWindow();
?
if (!hWnd)
return;
?
if (*argv[1]=="H" || *argv[1]=="h")
ShowWindow(GetParent(hWnd),SW_HIDE);
else
ShowWindow(GetParent(hWnd),SW_SHOW);
?
}
轉載于:https://www.cnblogs.com/jiu0821/p/4606639.html
總結
- 上一篇: 当你学不进去的时候,试试“普瑞马法则”
- 下一篇: OCulus Rift 游戏开发六原则