日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC常用函数总结

發布時間:2025/3/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的MFC常用函数总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。