2010年4月30日
CFileDialog類封裝了Windows常用的文件對話框。常用的文件對話框提供了一種簡單的與Windows標準相一致的文件打開和文件存盤對話框功能。
可以用構(gòu)造函數(shù)提供的方式使用CFileDialog,也可以從CFileDialog派生出自己的對話類并編寫一個構(gòu)造函數(shù)來適應你的需要。每種情況下,對話框都與標準MFC對話框一樣工作。因為它們都是CCommonDialog類的派生類。
要使用CFileDialog,先用CFileDialog構(gòu)造函數(shù)構(gòu)造一個對象,當創(chuàng)建了一個對話框后,可以設置或修改m_ofn結(jié)構(gòu)中的任何值,以初始化對話框控件的值或狀態(tài)。m_ofn結(jié)構(gòu)是OPENFILENAME類型的。要了解更多信息,可參閱聯(lián)機文檔“Win32 SDK”中的OPENFILENAME結(jié)構(gòu)。
初始化對話框控件后,調(diào)用DoModal成員函數(shù)顯示對話框并使用戶輸入路徑和文件。DoModal返回不論是用戶選擇了OK(IDOK)還是取消(IDCANCEL)按鈕。
當DoModal返回IDOK,可以使用某一個CFileDIalog的公共成員函數(shù)獲取用戶輸入的信息。
CFileDIalog包含許多保護成員,使你可以處理常用的共享沖突、文件名合法性檢查、列表框改變通知。這些保護成員對許多應用來說用處不大,因為缺省處理是自動的。對這些函數(shù)來說,消息映射入口是不必要的,因為它們是標準虛函數(shù)。
可以使用Windows CommDlgExtendError函數(shù)判斷在初始化對話框時是否是發(fā)生了錯誤,并獲取關(guān)于錯誤的更多信息。
析構(gòu)一個CFileDialog對象是自動,無須調(diào)用CDialog::EndDialog。
要使用戶選用多個文件,可在調(diào)用DoModal之前設置OFN_ALLOWMULTISELECT標志。你應提供文件名緩沖區(qū)來放置返回的多個文件名的列表,這通過用一個分配了的緩沖區(qū)指針替換m_ofn.lpstrFile來實現(xiàn),要在創(chuàng)建了CFileDialog之后調(diào)用DoModal之前進行此操作。另外,必須用m_ofn.lpstrFile指向的緩沖區(qū)字節(jié)數(shù)來設置m_ofn.nMaxFile。
CFileDialog依賴于Windows3.1及以后版本中的COMMDLG.DLL。
如果從CFileDialog中派生出一個新類,可用消息映射處理。要擴展消息處理,從CWnd中派生一個類,向新類中加入一個消息映射并為新消息提供成員函數(shù),無須提供一個鉤子函數(shù)來定制對話框。
要定制對話框,從CFileDialog中派生一個對象,提供一個定制對話模板,從擴展控件中加入一個消息映射,處理通知消息。任意未處理的消息將傳遞給基類。
無須定制鉤子函數(shù)。
#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
單文檔窗口的類型
是以下兩種類型的聯(lián)合
WS_OVERLAPPEDWINDOW
FWS_ADDTOTITLE 用來通知框架將文檔的標題做為窗口的標題
如果用戶希望窗口的標題是自己自定義類型,那么去掉FWS_ADDTOTITLE就可以了.
SetWindowLong()
GetWindowLong()
2010年4月19日
HINSTANCE AfxGetInstanceHandle( );
返回值:代表應用程序的當前實例的HINSTANCE值。如果是從與MFC的USRDLL版本連接的DLL內(nèi)調(diào)用的,則返回代表DLL的HINSTANCE值.
說明:這個函數(shù)使你能夠獲得當前應用程序的實例句柄。AfxGetInstanceHandle總是返回代表你的可執(zhí)行文件(.EXE)的HINSTANCE值,除非它從與MFC的USRDLL版本連接的DLL內(nèi)調(diào)用的。在這種情況下,它返回的是DLL的HINSTANCE值。
void CMfcNewButtonDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//獲取靜態(tài)窗口的句柄
HWND hStaicGroup = ::GetDlgItem(GetSafeHwnd(),IDC_STATIC);
//在靜態(tài)窗口中創(chuàng)建子窗口
//AfxGetInstanceHandle() 調(diào)用此函數(shù) 獲取當前應用程序的實例句柄
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日
函數(shù)功能
該函數(shù)改變指定窗口的
屬性.
函數(shù)也將指定的一個32位值設置在窗口的額外存儲空間的指定偏移位置。
函數(shù)原型
LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);
參數(shù)
hWnd:
窗口句柄及間接給出的窗口所屬的類。
nlndex:指定將設定的大于等于0的偏移值。
有效值的
范圍從0到額外類的存儲空間的字節(jié)數(shù)-4:例如若指定了12位或多于12位的額外類存儲空間,則應設為第三個32位整數(shù)的索引位8。要設置其他任何值,
可以指定下面值之一:
GWL_EXSTYLE:設定一個新的擴展
風格。
GWL_STYLE:設定一個新的窗口風格。
GWL_WNDPROC:為窗口過程設定一個新的
地址。
GWL_ID:設置一個新的窗口標識符。
GWL_HINSTANCE:設置一個新的
應用程序事例句柄。
GWL_USERDATA:設置與
窗口有關(guān)的32位值。
每一個窗口均有一個由創(chuàng)建該窗口的應用程序使用的32位值。
當hWnd參數(shù)標識了一個
對話框時,也可使用下列值:
DWL_DLGPROC:
設置對話框過程的新地址。
DWL_MSGRESULT:設置在對話框過程中處理的消息的返回值。
DWL_USER:設置的應用程序私有的新的額外信息,例如一個句柄或指針。
dwNewLong:指定的替換值。
返回值:
如果函數(shù)成功,返回值是指定的32位整數(shù)的原來的值。
如果函數(shù)失敗,返回值為0。若想獲得更多錯誤信息,請調(diào)用GetLastError函數(shù)。
如果指定32位整數(shù)的原來的值為0,并且函數(shù)成功,則返回值為0,但是函數(shù)并不清除最后的錯誤信息,這就很難判斷函數(shù)是否成功。這時,就應在調(diào)用SetWindowLong之前調(diào)用callingSetLastError(0)函數(shù)來清除最后的錯誤信息。這樣,如果函數(shù)失敗就會返回0,并且GetLastError。也返回一個非零值。 如果由hWnd參數(shù)指定的窗口與調(diào)用線程不屬于同一進程,將導致SetWindowLong函數(shù)失敗。
指定的窗口數(shù)據(jù)是在緩存中保存的,因此在調(diào)用SetWindowLong之后再調(diào)用SetWindowPos函數(shù)才能使SetWindowLong函數(shù)所作的改變生效。
如果使用帶GWL_WNDPROC索引值的SetWindowLong函數(shù)替換窗口過程,則該窗口過程必須與WindowProccallback函數(shù)說明部分指定的指導行一致。
如果使用帶DWL_MSGRESULT索引值的SetWindowLong函數(shù)來設置由一個對話框過程處理的消息的返回值,應在此后立即返回TRUE。否則,如果又調(diào)用了其他函數(shù)而使對話框過程接收到一個窗口消息,則嵌套的窗口消息可能改寫使用DWL_MSGRESULT設定的返回值。
可以使用帶GWL_WNDPROC索引值的SetWindowLong函數(shù)創(chuàng)建一個窗口類的子類,該窗口類是用于創(chuàng)建該窗口的關(guān)。一個應用程序可以一個系統(tǒng)美為于類,但是不能以一個其他進程產(chǎn)生的窗口類為子類,SetwindowLong函數(shù)通過改變與一個特殊的窗口類相聯(lián)系的窗口過程來創(chuàng)建窗口子類,從而使系統(tǒng)調(diào)用新的窗口過程而不是以前定義的窗口過程。應用程序必須通過調(diào)用CallWindowProc函數(shù)向前窗口傳遞未被新窗口處理的消息,這樣作允許應用程序創(chuàng)建一個窗口過程鏈。
通過使用函數(shù)RegisterClassEx將結(jié)構(gòu)WNDCLASSEX中的cbWndExtra單元指定為一個非0值來保留新外窗口內(nèi)存。
不能通過調(diào)用帶GWL_HWNDPARENT索引值的SetWindowLong的函數(shù)來改變子窗口的父窗口,應使用SetParent函數(shù)。
SendDlgItemMessage 函數(shù)功能:該函數(shù)把一個消息發(fā)送給指定的對話框中的控制。
函數(shù)原型: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
);
參數(shù):
hDlg:指定含有控制的對話框。
nIDDigItem:指定接收消息的控制的標識符。
Msg:指定將被發(fā)送的消息。
wParam:指定消息特定的其他信息。
lParam:指定消息特定的其他信息。
返回值:返回值指定消息處理的結(jié)果,且依賴于發(fā)送的消息。
備注:SendDlgItemMessage函數(shù)直到消息已經(jīng)被處理時才返回。
使用SendDlgItemMessage函數(shù)同從一個指定的控制中檢索句柄和調(diào)用SendMessagge函數(shù)一樣。
2010年4月14日
2010年2月初三 2010年2月初五 一直烙在我心里......
我要發(fā)奮學習, 報答父母親, 他們?yōu)榱藘号某砷L 辛苦勞作, 總是如此任勞任怨
SDK課程 就在這么短暫的時間內(nèi)結(jié)束了 學完了 很快又進入到MFC了, 哦 好好加油! 給自己打氣! ! !
2010年3月11日
哎,以前每次考試都是胸有成足...
這次的考試,真的很失敗, 雖然成績還沒出來, 心里明白一定考砸了.....
考試的題目基本上都是課堂上將過的例子,都怪自己不好好學....
2010年2月26日
不學
, 則不明
;
學
, 則有悟
; 悟
, 則能進
, 進
, 則能勤
.