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);
}