2010年4月30日
CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
可以用构造函数提供的方式使用CFileDialog,也可以从CFileDialog派生出自己的对话类并编写一个构造函数来适应你的需要。每种情况下,对话框都与标准MFC对话框一样工作。因为它们都是CCommonDialog类的派生类。
要使用CFileDialog,先用CFileDialog构造函数构造一个对象,当创建了一个对话框后,可以设置或修改m_ofn结构中的任何值,以初始化对话框控件的值或状态。m_ofn结构是OPENFILENAME类型的。要了解更多信息,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。
初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。DoModal返回不论是用户选择了OK(IDOK)还是取消(IDCANCEL)按钮。
当DoModal返回IDOK,可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。
CFileDIalog包含许多保护成员,使你可以处理常用的共享冲突、文件名合法性检查、列表框改变通知。这些保护成员对许多应用来说用处不大,因为缺省处理是自动的。对这些函数来说,消息映射入口是不必要的,因为它们是标准虚函数。
可以使用Windows CommDlgExtendError函数判断在初始化对话框时是否是发生了错误,并获取关于错误的更多信息。
析构一个CFileDialog对象是自动,无须调用CDialog::EndDialog。
要使用户选用多个文件,可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表,这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现,要在创建了CFileDialog之后调用DoModal之前进行此操作。另外,必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile。
CFileDialog依赖于Windows3.1及以后版本中的COMMDLG.DLL。
如果从CFileDialog中派生出一个新类,可用消息映射处理。要扩展消息处理,从CWnd中派生一个类,向新类中加入一个消息映射并为新消息提供成员函数,无须提供一个钩子函数来定制对话框。
要定制对话框,从CFileDialog中派生一个对象,提供一个定制对话模板,从扩展控件中加入一个消息映射,处理通知消息。任意未处理的消息将传递给基类。
无须定制钩子函数。
#include <afxdlgs.h>
CFileDialog类的成员
2010年4月23日
//支持序列化类,必须继承自CObject类
class CShape :public CObject
{
public:
DECLARE_SERIAL(CShape)
CShape();
CShape(CPoint& BeginPoint,CPoint& EndPoint);
virtual void Draw(CDC* pDC){};
virtual void Serialize(CArchive& ar);
virtual ~CShape();
public:
//得到起点信息
CPoint GetBeginPoint() const
{ return m_Begin; }
//得到止点信息
CPoint GetEndPoint() const
{ return m_End; }
//得到笔颜色
COLORREF GetPenColor() const
{ return m_crPenColor; }
//得到笔宽度
int GetPenWidth() const
{ return m_nPenWidth; }
//设置笔信息
void SetPen( int nPenStyle, int nPenWidth, COLORREF crPenColor);
//设置起止点信息
void SetPoint(CPoint& BeginPoint,CPoint& EndPoint);
//设置刷子
virtual void SetBrush(COLORREF brushcolor){};
//取得名称
CString GetName()
{
return m_ShapeName;
}
protected:
//笔的信息
int m_nPenStyle;
int m_nPenWidth;
COLORREF m_crPenColor;
//起止点信息
CPoint m_Begin;
CPoint m_End;
//Name
CString m_ShapeName;
};
2010年4月22日
双缓存, 位图, 工厂类
设置窗口的宽度
设置窗口的高度
在CFrame 框架类中
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx = 300; //窗口的宽度
cs.cy = 300; //窗口的高度
//cs.lpszName = "cr06"; //尝试修改标题 却修改不成功
cs.style &= ~FWS_ADDTOTITLE;
return TRUE;
}
Single document
单文档窗口的类型
是以下两种类型的联合
WS_OVERLAPPEDWINDOW
FWS_ADDTOTITLE 用来通知框架将文档的标题做为窗口的标题
如果用户希望窗口的标题是自己自定义类型,那么去掉FWS_ADDTOTITLE就可以了.
SetWindowLong()
GetWindowLong()
2010年4月19日
HINSTANCE AfxGetInstanceHandle( );
返回值:代表应用程序的当前实例的HINSTANCE值。如果是从与MFC的USRDLL版本连接的DLL内调用的,则返回代表DLL的HINSTANCE值.
说明:这个函数使你能够获得当前应用程序的实例句柄。AfxGetInstanceHandle总是返回代表你的可执行文件(.EXE)的HINSTANCE值,除非它从与MFC的USRDLL版本连接的DLL内调用的。在这种情况下,它返回的是DLL的HINSTANCE值。
void CMfcNewButtonDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//获取静态窗口的句柄
HWND hStaicGroup = ::GetDlgItem(GetSafeHwnd(),IDC_STATIC);
//在静态窗口中创建子窗口
//AfxGetInstanceHandle() 调用此函数 获取当前应用程序的实例句柄
CreateWindow(_T("Button"),_T("Button New"),BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,
0,0,100,100,hStaicGroup,(HMENU)10000, AfxGetInstanceHandle(),NULL);
g_OldProc = (WNDPROC)::SetWindowLong(hStaicGroup,
GWL_WNDPROC,(LONG)MyStaictGroupWndProc);
}
2010年4月18日
函数功能
该函数改变指定窗口的
属性.
函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
函数原型
LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);
参数
hWnd:
窗口句柄及间接给出的窗口所属的类。
nlndex:指定将设定的大于等于0的偏移值。
有效值的
范围从0到额外类的存储空间的字节数-4:例如若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要设置其他任何值,
可以指定下面值之一:
GWL_EXSTYLE:设定一个新的扩展
风格。
GWL_STYLE:设定一个新的窗口风格。
GWL_WNDPROC:为窗口过程设定一个新的
地址。
GWL_ID:设置一个新的窗口标识符。
GWL_HINSTANCE:设置一个新的
应用程序事例句柄。
GWL_USERDATA:设置与
窗口有关的32位值。
每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
当hWnd参数标识了一个
对话框时,也可使用下列值:
DWL_DLGPROC:
设置对话框过程的新地址。
DWL_MSGRESULT:设置在对话框过程中处理的消息的返回值。
DWL_USER:设置的应用程序私有的新的额外信息,例如一个句柄或指针。
dwNewLong:指定的替换值。
返回值:
如果函数成功,返回值是指定的32位整数的原来的值。
如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
如果指定32位整数的原来的值为0,并且函数成功,则返回值为0,但是函数并不清除最后的错误信息,这就很难判断函数是否成功。这时,就应在调用SetWindowLong之前调用callingSetLastError(0)函数来清除最后的错误信息。这样,如果函数失败就会返回0,并且GetLastError。也返回一个非零值。 如果由hWnd参数指定的窗口与调用线程不属于同一进程,将导致SetWindowLong函数失败。
指定的窗口数据是在缓存中保存的,因此在调用SetWindowLong之后再调用SetWindowPos函数才能使SetWindowLong函数所作的改变生效。
如果使用带GWL_WNDPROC索引值的SetWindowLong函数替换窗口过程,则该窗口过程必须与WindowProccallback函数说明部分指定的指导行一致。
如果使用带DWL_MSGRESULT索引值的SetWindowLong函数来设置由一个对话框过程处理的消息的返回值,应在此后立即返回TRUE。否则,如果又调用了其他函数而使对话框过程接收到一个窗口消息,则嵌套的窗口消息可能改写使用DWL_MSGRESULT设定的返回值。
可以使用带GWL_WNDPROC索引值的SetWindowLong函数创建一个窗口类的子类,该窗口类是用于创建该窗口的关。一个应用程序可以一个系统美为于类,但是不能以一个其他进程产生的窗口类为子类,SetwindowLong函数通过改变与一个特殊的窗口类相联系的窗口过程来创建窗口子类,从而使系统调用新的窗口过程而不是以前定义的窗口过程。应用程序必须通过调用CallWindowProc函数向前窗口传递未被新窗口处理的消息,这样作允许应用程序创建一个窗口过程链。
通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留新外窗口内存。
不能通过调用带GWL_HWNDPARENT索引值的SetWindowLong的函数来改变子窗口的父窗口,应使用SetParent函数。
SendDlgItemMessage 函数功能:该函数把一个消息发送给指定的对话框中的控制。
函数原型:LONG SendDlgItemMessage(
HWND hDlg, // handle of dialog box
int nIDDlgItem, // identifier of control
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
参数:
hDlg:指定含有控制的对话框。
nIDDigItem:指定接收消息的控制的标识符。
Msg:指定将被发送的消息。
wParam:指定消息特定的其他信息。
lParam:指定消息特定的其他信息。
返回值:返回值指定消息处理的结果,且依赖于发送的消息。
备注:SendDlgItemMessage函数直到消息已经被处理时才返回。
使用SendDlgItemMessage函数同从一个指定的控制中检索句柄和调用SendMessagge函数一样。
2010年4月14日
2010年2月初三 2010年2月初五 一直烙在我心里......
我要发奋学习, 报答父母亲, 他们为了儿女的成长 辛苦劳作, 总是如此任劳任怨
SDK课程 就在这么短暂的时间内结束了 学完了 很快又进入到MFC了, 哦 好好加油! 给自己打气! ! !
2010年3月11日
哎,以前每次考试都是胸有成足...
这次的考试,真的很失败, 虽然成绩还没出来, 心里明白一定考砸了.....
考试的题目基本上都是课堂上将过的例子,都怪自己不好好学....
2010年2月26日
不学
, 则不明
;
学
, 则有悟
; 悟
, 则能进
, 进
, 则能勤
.