对话框学习经验摘记

在应用程序的开发中,对话框用于与用户交流互动,故对话框的操作必不可少。现将经验总结如下。


1.菜单名称的中文显示。需要在资源视图中选择相应菜单项,设置属性为中文即可。


2.创建模态对话框需要调用CDialo类的成员函数:DoModal.

此 成员函数用来显示一个 模态对话框。其返回值对应于用来关闭对话框的控件的ID。此函数返回后,Windows响应这个对话框,所有的属性页都会被销毁。而这些对象本身仍然存在。通常,你将在DoModal返回IDOK之后从CPropertyPage对象检取数据。要显示一个 非模态对话框,请调用Create来代替此函数,但在Create之后,需要调用ShowWindwo()才能显示对话框。


3.在MFC中,将A类的相关成员变量或函数用到B类时,需要在B类的程序文件(CPP)中加入A类的头文件(H)。


4. PostNcDestroy函数。

CWnd::PostNcDestroy

virtual void PostNcDestroy( );

在窗口被销毁以后,缺省的OnNcDestroy成员函数调用这个函数。派生类可以利用这个函数来执行自定义的清除工作,比如删除指针。


5. VS调试程序_ASSERTE(_CrtIsValidHeapPointer(pUserData))崩溃的原因以及解决方法 .
具体说,我的问题其实就是在DLL中申请了一块内存,在EXE中删除这块内存。但是这两个PE(exe、dll都是PE文件)在初始化时分配的堆栈句柄是不一样的,所以就出错了。

问题原因清楚了,其实就是要我们注意,在谁的堆栈上分配的内存,就在谁的堆栈上释放。

方案一:在DLL里面申请的内存,就在DLL里面释放,不要由其他模块去释放;(为了区分第二条,这个前提是exe 和 dll都使用mtd方式编译)

方案二:让所有的PE共享一个堆栈句柄,所有的模块都采用的mdd方式编译;

(上面说的是Debug选项下),原因在于,采用mdd编译时,所有的模块都会共享同一个msvcr*.dll,堆栈句柄作为静态变量保存在里面,所以所有的模块都是同一个堆栈上申请、释放内存,不管哪个模块都可以释放其他模块申请的内存了。而采用mtd编译时,所有模块都相当于有自己独立的一个mscvr*.dll(相当于把msvcr*.dll中需要的代码都打包到自己里面去了),因此每个模块在加载的时候都有自己独立的堆栈,这时去删除其他模块申请的内存,堆栈检测该指针肯定就是无效的了。


6.fatal error LNK1168.

原来是在之前的debug之后,这个进程并没有完全被终止,可以到任务管理器中查找到相应的进程(这里为OgreExample),然后结束所有的这个进程。重新debug就不再会出现这个问题了。


7.      CButton类的Create()函数. BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

lpszCaption是按钮上显示的文本;dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:

窗口风格:·WS_CHILD 子窗口,必须有   ·WS_VISIBLE 窗口可见,一般都有  ·WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用
  ·WS_TABSTOP 可用Tab键选择      ·WS_GROUP 成组,用于成组的单选按钮中的第一个按钮

按钮风格:·BS_PUSHBUTTON 下压式按钮,也即普通按钮    ·BS_AUTORADIOBUTTON 含自动选中状态的单选按钮
  ·BS_RADIOBUTTON 单选按钮,不常用                            ·BS_AUTOCHECKBOX 含自动选中状态的复选按钮
  ·BS_CHECKBOX 复选按钮,不常用                                ·BS_AUTO3STATE 含自动选中状态的三态复选按钮
  ·BS_3STATE 三态复选按钮,不常用
 
  以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。

  ·BS_BITMAP 按钮上将显示位图
  ·BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮


  ·rect指定按钮的大小和位置;
  ·pParentWnd指示拥有按钮的父窗口,不能为NULL;


  ·nID指定与按钮关联的ID号,用上一步创建的ID号。


8.MFC中的操作主要是基于类进行的,故障进行控件操作时,也要建立相应的控件类。


9.CWnd 类对象都有一个成员变量m_hWnd,用来保存与窗口对象相关联的窗口句柄。如果窗口对象没有与任何窗口相关联,则此句柄为NULL,


10.CWnd::GetDlgItem。返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。

void CWnd::GetDlgItem( int nID, HWND *phWnd) const;
说明——参数 nID:接收消息的控件的标识;参数phWnd:子类窗口的指针;返回值:标识所标记的控件(或子类窗口)的指针;


11.GetWindowText。该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。如果指定的窗口是一个控件,则拷贝控件的文本。但是,GetWindowText不能接收其他应用程序中控件的文本。
函数原型:Int GetWindowText(HWND hWnd,LPTSTR lpString,Int nMaxCount);
hWnd:带文本的窗口或控件的句柄。IpString:指向接收文本的 缓冲区的 指针。
nMaxCount:指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断。

12.SetWindowText函数。Windows API宏,在WinUser.h中根据是否已定义Unicode被分别定义为SetWindowTextW和SetWindowTextA,这两个函数改变指定窗口的 标题栏的文本内容(如果窗口有标题栏)。如果指定窗口是一个控件,则改变控件的文本内容。然而,SetWindowText函数不改变在其他应用程序中的控件的文本内容。

BOOLSetWindowText( HWNDhwnd, LPCTSTRlpString);
hWnd要改变文本内容的窗口或 控件的 句柄。
lpString指向一个空结束的字符串的 指针,该字符串将作为窗口或控件的新文本。

13.一般情况下,静态文本是不能向父窗口发送事件信息的,但可以通过更改其STYLE选项进行更改。


14.C语言中atoi函数可以将数字组成的字符串转换成相应的数字。itoa(num, char,dex)函数则可以将数字转换成文本。


15.GetDlgItemText函数可以综合GetDlgItem与GetWindowText两个函数的功能。而SetDlgItemText函数类似。


16.GetDlgItemInt获取控件中里面字符串并转换成int类型返回·
函数原型:UINT GetDlgItemInt(HWND hDlg,int nlDDlgltem,BOOL ★IpTranslated,BOOL bSigned);
参数:
hDlg:指向含有利益控制的对话框的句柄。
nlDDlgltem:指定文本将被转变的控制的对话项目标识符。
IpTranslated:指向一个Boolean 变量的 指针。该 变量保存函数成功/失败的值。TRUE表示成功,FALSE表示失败。此参数为可选的。它可以为NULL。在这种情况下,函数不返回关于成功和失败的信息。
bSigned:指定函数足否在开始时为一个最小的消息检测文本,且如果发现一个消息整型值,则返回它。TRUE指定应该这样做,FALSE指定不应该这样做。
返回值:如果 函数调用成功则由IPTranslated指向的变量被设置为TRUE,且返回值为控制文本的转变值。


17.通过MFC中添加类的成员变量可以更方便的实行相关的操作。


18.SendMessage()。该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的 消息队列后立即返回。
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。


19. 类CRect是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替。结构RECT表示一个矩形的位置和尺寸,其定义为:

 typedef struct tagRECT{ LONG left; LONG top;LONG right;LONG bottom;} RECT;

其中 left、top分别表示矩形左上角顶点的横坐标和纵坐标,right、bottom分别表示矩形右下角顶点的横坐标和纵坐标。由于CRect提供了一些成员函数和重载运算符,使得CRect的操作更加方便。

操作函数

Width 计算CRect的宽度
Height 计算CRect的高度
Size 计算CRect的大小
TopLeft 返回CRect的左上角点
BottomRight 返回CRect的右下角点
CenterPoint 返回CRect的中心点
IsRectEmpty 确定CRect是否是空的。如果CRect的宽度和/或高度为0,则它是空的
IsRectNull 确定CRect的top,bottom,left,和right是否都等于0
PtInRect 确定指定的点是否在CRect之内
SetRect 设置CRect的尺寸
SetRectEmpty 设置CRect为一个空的矩形(所有的坐标都等于0)
CopyRect 将一个源矩形的尺寸拷贝到CRect
EqualRect 确定CRect是否等于给定的矩形
InflateRect 增加CRect的宽度和高度
DeflateRect 减少CRect的宽度和高度
NormalizeRect 使CRect的高度和宽度返回规范
OffsetRect 将CRect移动到指定的偏移
SubtractRect 从一个矩形区域中减去一个矩形
IntersectRect 设置CRect等于两个矩形的交集
UnionRect 设置CRect等于两个矩形的并集


20.SetWindowPos函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。

BOOL SetWindowPos(HWND hWnd, const CWnd* pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags);

hWnd窗口句柄。
hWndlnsertAfter在z序中的位于被置位的窗口前的 窗口句柄。该参数必须为一个窗口句柄,或下列值之一:
  • HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
  • HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
  • HWND_TOP:将窗口置于Z序的顶部。
  • HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
查看该参数的使用方法,请看说明部分。
x以客户坐标指定窗口新位置的左边界。
Y以客户坐标指定窗口新位置的顶边界。
cx以像素指定窗口的新的宽度。
cy以像素指定窗口的新的高度。
uFlags窗口尺寸和定位的标志。该参数可以是下列值的组合:
  1. SWP_ ASYNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。
  2. SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。
  3. SWP_DRAWFRAME:在窗口周围画一个边框(定义在 窗口类描述中)。
  4. SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。
  5. SWP_HIDEWINDOW;隐藏窗口。
  6. SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。
  7. SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。
  8. SWP_NOMOVE:维持当前位置(忽略X和Y参数)。
  9. SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。
  10. SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。
  11. SWP_NOREPOSITION:与SWP_NOOWNERZORDER标志相同。
  12. SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
  13. SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。
  14. SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。
  15. SWP_SHOWWINDOW:显示窗口。


21.SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
 
LONGSetWindowLong( HWND  hWnd, //handletowindow int   nlndex, //offsetofvaluetoset LONG  dwNewLong //newvalue );

hWnd 窗口句柄及间接给出的窗口所属的类。

nlndex 指定将设定的大于等于0的偏移值。有效值的范围从0到额外类的存储空间的字节数减4:例如若指定了12或多于12个字节的额外窗口存储空间,则应设索引位8来访问第三个4字节,同样设置0访问第一个4字节,4访问第二个4字节。要设置其他任何值,可以指定下面值之一:

常量
常量值
意义
GWL_EXSTYLE
-20
设定一个新的扩展风格。
GWL_HINSTANCE
-6
设置一个新的应用程序实例句柄。
GWL_ID
-12
设置一个新的窗口 标识符。
GWL_STYLE
-16
设定一个新的窗口风格。
GWL_USERDATA
-21
设置与窗口有关的32位值。每个窗口均有一个由创建该窗口的应用程序使用的32位值。
GWL_WNDPROC
-4
为窗口过程设定一个新的地址。
GWL_HWNDPARENT -8 改变子窗口的父窗口,应使用SetParent函数。
当hWnd参数标识了一个对话框时,也可使用下列值:
常量
常量值
意义
DWL_DLGPROC
DWLP_MSGRESULT + sizeof(LRESULT) (值:4)
设置对话框过程的新地址。
DWL_MSGRESULT
0
设置在对话框过程中处理的消息的 返回值。
DWL_USER
DWLP_DLGPROC + sizeof(DLGPROC) (值:8)
设置的应用程序私有的新的额外信息,例如一个句柄或 指针。

dwNewLong 指定的替换值。

dwNewLong中可以使用以下一些列表控件的专用风格:
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT
这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:
大图标显示,小图标显示,列表显示,详细报表显示
LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
LVS_SINGLESEL 同时只能选中列表中一项 [1]  

如果函数成功,返回值是指定的32位整数的原来的值。如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。如果指定32位整数的原来的值为0,并且函数成功,则返回值为0,但是函数并不清除最后的错误信息,这就很难判断函数是否成功。这时,就应在调用SetWindowLong之前调用SetLastError(0)函数来清除最后的错误信息。这样,如果函数失败就会返回0,并且GetLastError。也返回一个非零值。



22.add windows message and events handler. 添加windows消息响应函数 .



23.WNDPRO,窗口过程函数。
Windows操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过 GetMessage等方法最终将消息提交到 窗口过程WndProc[英文全称windows process] )指向一个应用程序定义的窗口过程的 指针。

LRESULT  CALLBACK WndProc(  //WndProc名称可自由定义
     HWND  hwnd,
     UINT  uMsg,
     WPARAM  wParam,
     LPARAM  lParam
);

每个窗口会有一个称为窗口过程的 回调函数( WndProc),它带有四个参数,分别为:
窗口句柄(Window Handle) HWND,
消息ID(Message ID) UINT,
和两个消息参数(wParam, lParam)WPARAM、LPARAM,
WndProc的第一个参数hWnd就是当前接收消息的窗口句柄,第二个参数就是被传送过来的消息,第三、第四个参数都是附加在消息上的数据,这和MSG结构体是一样的。


23.SetFocus()。该函数对指定的窗口设置键盘焦点。该窗口必须与调用线程的 消息队列相关。
函数原型:HWND SetFocus(HWND hWnd)。
参数:
hWnd:接收键盘输入的窗口 指针。若该参数为NULL,则击键被忽略。
返回值:若 函数调用成功,则返回原先拥有键盘焦点的 窗口句柄。若hWnd参数无效或窗口未与调用线程的消息队列相关,则返回值为NULL。若想要获得更多错误信息,可以调用GetLastError函数。


24.GetNextWindow()。该函数返回z序中的前一个或后一个窗口的句柄。下一窗口在指定窗口的下面,前一窗口则在上面。如果指定的窗口是顶端窗口,该函数返回下一个(或前一个)顶端窗口的句柄。如果指定的窗口是顶层窗口,函数返回下一个(或前一个)顶层窗口的句柄。如果函数是子窗口,则函数搜索下一个或前一个子窗口的句柄。
函数原型:HWND GetNextWindow(HWND hWnd,UNIT wCmd)
hWnd:一个窗口的句柄。 窗口句柄在wCmd参数的基础上获得的相对于这个窗口的句柄。
wCmd:指明窗口返回的是前一窗口的句柄还是后一窗口的句柄。该参数可以是下列两个值之一:
GW_HWNDNEXT:返回在给定窗口的下面窗口的句柄。
GW_HWNDPREV:返回在给定窗口的上面窗口的句柄。
GW_HWNDFIRST = 0;
GW_HWNDLAST = 1;
GW_HWNDNEXT = 2;
GW_HWNDPREV = 3;
GW_OWNER = 4;
GW_CHILD = 5;
返回值:如果函数成功,返回值是前一窗口(或后一窗口)的句柄。如果前后窗口不存在,则返回值为NULL。若想获得更多 错误信息,请调用GetLastError函数。



25.



你可能感兴趣的:(对话框学习经验摘记)