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控件的指针.

例如:

1
2
3
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()

  • 1
    2
    3
    4
    5
    6
    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应用程序中首先要获得窗口的指针,然后将其转化为句柄

1
2
CWnd* pWnd;
HANDLE hWnd = pWnd->GetSafeHwnd();

2句柄转化为指针

在MFC应用程序中首先获得对话框控件的句柄,然后获得其指针

1
2
3
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 类(子窗)中相关函数实现在主对话框(主窗)中的几个 静态文本框(子窗)中显示路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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图标.
1
2
3
4
5
6
7
8
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
1
2
3
4
5
6
7
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中的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 静态函数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位。如:

1
2
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将文件加入工程就可以了。要想定义类的对象,只要在你的菜单项的相应事件中就可以了。如:

1
2
3
4
5
6

... 
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");` 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 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
#include <windows.h>
#include <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);
}