第一篇:孫鑫C++視頻教程總結(jié)(內(nèi)功=算法+數(shù)據(jù)結(jié)構(gòu)+編譯原理+操作系統(tǒng)原理+軟件工程+英文)
一:Windows程序運(yùn)行原理及程序編寫流程(創(chuàng)建窗口?;卣{(diào)函數(shù)
方法1
int WINAPI WinMain(//主函數(shù)
HINSTANCE hInstance,// handle to current instance HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine,// command line
int nCmdShow
// show state)
WNDCLASS wndcls;//創(chuàng)建一個(gè)窗口對(duì)象
wndcls.cbClsExtra=0;//窗口類附加字節(jié),為該類窗口所共享。通常0。
wndcls.cbWndExtra=0;//窗口附加字節(jié)。通常設(shè)為0。
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//背景
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);/光標(biāo)
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//位圖(圖標(biāo))
wndcls.hInstance=hInstance;//當(dāng)前應(yīng)用程序事例句柄。
wndcls.lpfnWndProc=WinSunProc;// 窗口過程函數(shù)(回調(diào)函數(shù))
wndcls.lpszClassName=“Weixin2003”;// 窗口名//類的名字
wndcls.lpszMenuName=NULL;//菜單名
wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口的類型
RegisterClass(&wndcls);//注冊窗口
HWND hwnd;
hwnd=CreateWindow(“Weixin2003”,“
北
京”,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);//定義窗口句柄并創(chuàng)建窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//顯示窗口
UpdateWindow(hwnd);//更新窗口
MSG msg;//定義消息對(duì)象
/*做消息循環(huán)*/while(GetMessage(&msg, //接收消息的窗口句柄。//從消息隊(duì)列中取出一條消息 NULL, //消息標(biāo)識(shí)。0,0))//做消息循環(huán)
{
TranslateMessage(&msg);//進(jìn)行消息(如鍵盤消息)轉(zhuǎn)換
DispatchMessage(&msg);/分派消息到窗口的回調(diào)函數(shù)處理,}
return 0;}
//回調(diào)函數(shù)原形為LRESULT CALLBACK WindowProc();
LRESULT CALLBACK WinSunProc(//對(duì)消息的響應(yīng)函數(shù)(回調(diào)函數(shù))
HWND hwnd,// handle to window
UINT uMsg,// message identifier
WPARAM wParam, // first message parameter LPARAM lParam
// second message parameter){
switch(uMsg){
case WM_CHAR:break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,“mouse clicked”,“weixin”,0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,“計(jì)算機(jī)編程語言培訓(xùn)”,strlen(“計(jì)算機(jī)編程語言培訓(xùn)”));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,“維新培訓(xùn)”,strlen(“維新培訓(xùn)”));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,“是否真的結(jié)束?”,“weixin”,MB_YESNO))
{DestroyWindow(hwnd);}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
總結(jié):創(chuàng)建一個(gè)完整的窗口需要經(jīng)過下面四個(gè)操作步驟: 一,設(shè)計(jì)一個(gè)窗口類;如:WNDCLASS wndcls;二,注冊窗口類;
如:RegisterClass(&wndcls);
三,創(chuàng)建窗口;
如:CreateWindow(),CreateWindowEX();四,顯示及更新窗口。如:ShowWindow(),UpdateWindow();二:VC++掌握的基礎(chǔ)
①使用VC編程除了良好的C基礎(chǔ)外還需要掌握兩方面: ②消息本身。不同消息所代表的用戶操作和應(yīng)用程序的狀態(tài)。
③對(duì)于某個(gè)特定的消息來說,要讓OS執(zhí)行某個(gè)特定的功能去響應(yīng)消息。
二.1消息的分類:標(biāo)準(zhǔn)消息,命令消息,通告消息。
[標(biāo)準(zhǔn)消息]:除WM_COMMAND之外,所有以WM_開頭的消息。
[命令消息]:來自菜單、加速鍵或工具欄按鈕的消息。這類消息都以WM_COMMAND呈現(xiàn)。
通過標(biāo)識(shí)(ID)來區(qū)分不同的命令消息;在SDK中,通過消息的wParam參數(shù)識(shí)別。
[通告消息]:由控件產(chǎn)生的消息,如按鈕的單擊。
1)從CWnd派生的類,可以接收到[標(biāo)準(zhǔn)消息] [命令消息]和[通告消息]。2)從CCmdTarget派生的類,只能可以接收到[命令消息]和[通告消息]。
三:兩種函數(shù)調(diào)用約定(__stdcall 和 __cdecl)
#define CALLBACK
__stdcall
//__stdcall 標(biāo)準(zhǔn)調(diào)用預(yù)定,是PASCAL 調(diào)用約定,象DELPHI使用的就是標(biāo)準(zhǔn)調(diào)用約定
#define WINAPIV
__cdecl // __cdecl 是C 語言形式的調(diào)用約定。
主要區(qū)別:函數(shù)參數(shù)傳遞順序 和 對(duì)堆棧的清除上。
問題:除了那些可變參數(shù)的函數(shù)調(diào)用外,其余的一般都是__stdcall約定。但 C/C++編譯默然的是__cdecl約定。所以如果在VC等環(huán)境中調(diào)用__stdcall約定的函數(shù),必須要在函數(shù)聲明的時(shí)加上__stdcall 修飾符,以便對(duì)這個(gè)函數(shù)的調(diào)用是使用__stdcall約定(如使用DELPHI編寫的DLL時(shí)候)。(VC中可通過這途徑修改:project|settings..|c/c++|...)
四:關(guān)于DC句柄獲取(CpaintDC/CclientDC/CwindowDC在創(chuàng)建時(shí)默認(rèn))
(調(diào)用這些函數(shù))a)使用BeginPaint(),EndPaint()對(duì)。注意只能在響應(yīng)WM_PAINT消息時(shí)使用。
b)使用GetDc(),ReleaseDC()對(duì)。注意他們不能在響應(yīng)WM_PAINT中使用。MFC中的運(yùn)用為① HDC hdc=::GetDc(m_hWnd);::ReleaseDC(m_hWnd,hdc);獲得全局DC。
② CDC *pDC=GetDC();ReleaseDC(pDC);
③ CClientDC dc(this);(自動(dòng)調(diào)用GetDc(),ReleaseDC()); ④ CWindowDC dc(this);(自動(dòng)調(diào)用GetDc(),ReleaseDC());
五:MFC程序框架的剖析
①尋找WinMain
人口:路徑:visual c++安裝目錄下的:vc98|MFC|SRC|APPMODUL.CPP:
尋找CWinApp構(gòu)造函數(shù):MFC|SRC|APPCORE.CPP: ②MFC程序
框
架
主
路
線
:
CTEApp
theApp-> CWinApp::CWinApp()->_tWinMain(){//進(jìn)入程->AfxEndDeferRegisterClass(LONG fToRegister)-> PreCreateWindow(創(chuàng)建、顯示和更新窗口)pThread->Run(消息循環(huán))-> PumpMessage(//取消息并處理)
類的運(yùn)行順序?yàn)椋篊*APP->CmainFram->C*View->C*Doc
六:消息映射的三步驟:
①在頭文件中聲明消息響應(yīng)函數(shù)原型。如:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
②在源文件中進(jìn)行消息映射。如:ON_WM_LBUTTONDOWN()③源文件中進(jìn)行消息響應(yīng)函數(shù)的定義。如:void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){}
七:使用畫筆、畫刷、字體的步驟:(包括設(shè)計(jì)繪圖模式SetROP2()
①CPen pen(PS_DOT,1,RGB(0,255,0));//構(gòu)造畫筆對(duì)象② CClientDC dc(this);③ CPen *pOldPen=dc.SelectObject(&pen);//將畫筆選入DC后就可以作畫了④dc.SelectObject(pOldPen);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//構(gòu)造透明畫刷對(duì)象
FromHandle()將對(duì)象句柄轉(zhuǎn)換為對(duì)象指針GetStockObject()取得一個(gè)以預(yù)定義的畫筆、畫刷、字體的句柄.類為Cpen Cbrush CFont
設(shè)計(jì)繪圖模式: dc.SetROP2(R2_BLACK);(查MSDN).八:創(chuàng)建插入符:CDC類(文字等的輸出類)
CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);// 獲取當(dāng)前字體信息的度量
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);ShowCaret();// void CreateCaret(CBitmap* pBitmap);//創(chuàng)建位圖插入符
//static void PASCAL SetCaretPos(POINT point);//設(shè)計(jì)插入符號(hào)的位置
九:創(chuàng)建路徑層:
BOOL BeginPath();//在這作圖定義路徑層剪切區(qū)域BOOL EndPath();
BOOL SelectClipPath(int nMode);//調(diào)用這個(gè)函數(shù)來使當(dāng)前路徑層剪切區(qū)域與新剪切區(qū)域進(jìn)行互操作。
應(yīng)用:當(dāng)作圖的時(shí)候,如果想要在整幅圖形其中的某個(gè)部分和其它部分有所區(qū)別,我們可以把這部分圖形放到路徑層當(dāng)中,然后指定調(diào)用指定互操作模式調(diào)用SelectClipPath(int nMode)函數(shù)來使路徑層和覆蓋在其上新繪圖剪切區(qū)域進(jìn)行互操作,達(dá)到特殊效果。
十:設(shè)置定時(shí)器
①SetTimer(1,100,NULL);//放置定時(shí)1器并發(fā)送WM_TIMER消息
②作WM_TIMER消息響應(yīng)并對(duì)Void OnTimer(UINT nIDEvent)編寫代碼。
十一:CMenu類
CMenu 類重要函數(shù):CMenu*GetMenu得到窗口菜單欄對(duì)象指針。
CMenu::GetSubMenu獲得指向彈出菜單對(duì)象指針
// SetMenu(CMenu* pMenu)設(shè)置新菜單或移除菜單 DrawMenuBar()//重繪菜單
//其它菜單的功能設(shè)計(jì)用MSDN查函數(shù)
十二:創(chuàng)建自定義菜單
①CMenu menu;//
定
義
為
局
部
對(duì)
象②menu.LoadMenu(IDR_MAINFRAME);③SetMenu(&menu);
④menu.Detach();// 這里menu對(duì)象作為一個(gè)局部對(duì)象。使用Detach()從menu對(duì)象中分離窗口菜單句柄,從而當(dāng)menu對(duì)象析構(gòu)的時(shí)候窗口菜單資源不隨之銷毀。也可將menu;定義為全局對(duì)象。
十三:對(duì)彈出式菜單項(xiàng)的命令更新
①給菜單項(xiàng)添加UPDATE_COMMAND_UI消息響應(yīng)②在響應(yīng)函數(shù)中調(diào)用CcmdUI類的成員函數(shù)。十四:向系統(tǒng)添加(右鍵彈出式)菜單(上下文菜單)
1系統(tǒng)添加法:
① Project->Add to Project->Components and Controls->Visual C++ conpenets->pop-upMenue->Insert->選擇類(不能選CmainFram)其中系統(tǒng)增加的內(nèi)容:A一個(gè)菜單資源;B,在派生View類中增加了OnContextMenu()函數(shù)
2系統(tǒng)添加法:①用資源管理器添加一個(gè)菜單資源②在鼠標(biāo)右鍵消息響應(yīng)函數(shù)中,加載菜單資源,并獲得要顯示的子菜單指針,并用該指針調(diào)用TrackPopupMenu函數(shù)便完成任務(wù) 代碼如下:CMenu menu;
menu.LoadMenu(IDR_MENU1);CMenu *pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);//將一個(gè)坐標(biāo)點(diǎn)或一個(gè)矩形區(qū)域坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo)。
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);//在指定位置以指定的方式顯示彈出菜單。也可對(duì)菜單項(xiàng)做消息響應(yīng)。
2動(dòng)態(tài)添加菜單法:①在CmainFram類的OnCreate()中創(chuàng)建Cmenu對(duì)象調(diào)用其成員函數(shù)添加、插入、刪除子菜單、菜單項(xiàng)②手動(dòng)給動(dòng)態(tài)菜單項(xiàng)添加響應(yīng)函數(shù)一:在Resource.h中可以添加資源的ID二:在頭文件中寫消息函數(shù)原型三在代碼文件中添加消息映射和添加消息響應(yīng)函數(shù)(注意手動(dòng)添加要放在ClassWizard的規(guī)定的外面)
十五:集合類:
COBArray,CStringArray,CDWordArray,CPtrArray,CStringArray,CUIntArray,CWordArray
十六:在CMainFrame中截獲對(duì)菜單命令的處理
由于CWnd::OnCommand 是個(gè)虛函數(shù),可以在框架類中重寫OnCommand函數(shù),從而可以截獲菜單消息使它不再往下(VIEW類)路由。例:
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam){ int MenuCmdId=LOWORD(wParam);//取命令I(lǐng)D CMenu2View *pView=(CMenu2View*)GetActiveView();//獲取當(dāng)前VIEW類指針
if(MenuCmdId>=IDM_PHONE1 && MenuCmdId
{CClientDC dc(pView);
dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));return TRUE;//函數(shù)返回,避免調(diào)用CFrameWnd::OnCommand函數(shù),在CFrameWnd::OnCommand中截獲的消息會(huì)交由VIEW類處理}
return CFrameWnd::OnCommand(wParam, lParam);
//調(diào)用基類OnCommand函數(shù),在CFrameWnd::OnCommand中截獲的消息會(huì)交由VIEW類處理}
十七:對(duì)話框類CDialog
1.重要函數(shù)與成員變量
一:每個(gè)窗口類創(chuàng)建的對(duì)象的同時(shí)都擁有一個(gè)窗口句柄m_hWnd的成員變量。二:GetDlgItem(IDC)== 關(guān)聯(lián)一個(gè)變量; 通過控件ID 獲得控件對(duì)象指針 三:GetWindowText(CString& rString)/ /獲得窗口、安鍵文本(char類型)四:int atoi(const char *string);itoa()// 把一個(gè)字符串與INT 類型的數(shù)值轉(zhuǎn)為 五
:
GetDlgItemText(IDC_EDIT1,ch1,10)==GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);在一個(gè)窗口控件中直接讀取文本到字符數(shù)組中
六:INT GetDlgItemInt()//獲得控件文本,并轉(zhuǎn)換成數(shù)值類型 七:SetFocus()設(shè)計(jì)窗口、控件的焦點(diǎn)。GetFocus()
八;if(IDOK==dlg.DoModal())創(chuàng)建對(duì)話框后會(huì)等待用戶作選擇,就是DoModal、create的值。
九:對(duì)編輯框Edit控件寫入內(nèi)容后會(huì)發(fā)送EN_change消息,2.
問控件的六種方法:
一:GetDlgItem(IDC_EDIT2)->Get(Set)WindowText(ch2,10);二:Get(Set)DlgItemText(IDC_EDIT2,ch2)
三:Get(Set)DlgItemInt(IDC_EDIT2)
四:每個(gè)控件關(guān)聯(lián)一個(gè)變量,直接對(duì)變量進(jìn)行操作。調(diào)用UpdateData()對(duì)控件取設(shè)計(jì)值。
或:變量.GetWindowText(ch1,10);取得數(shù)據(jù)
五:通過SDK函數(shù)或變量的成員函數(shù)發(fā)送WM消息完成消息任務(wù): ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);六:直接給ID控件發(fā)送消息:
SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);
十八:創(chuàng)建擴(kuò)展窗口(收縮、擴(kuò)展窗口)
①創(chuàng)建一個(gè)圖表框通過ID獲得其矩形的位置,并通過CRect對(duì)象記錄其矩形位置。
GetDlgItem(IDC_)->GetWindowRect(&rectSeparator);GetWindowRect(&rectLarge);
②創(chuàng)建兩個(gè)CRect對(duì)象通過點(diǎn)的付值記錄其矩形位置收縮、擴(kuò)展時(shí)的矩形位置。③SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE 置窗口大小與位置
| SWP_NOZORDER);//設(shè)
//獲得窗口大小十九:設(shè)計(jì)焦點(diǎn)事件(Tab Stop)
先對(duì)改變焦點(diǎn)事件做消息響應(yīng)(如對(duì)回車ID_OK的響應(yīng))后
① GetFocus()->GetNextWindow()->SetFocus();//對(duì)最后一個(gè)不能判斷。
②GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();/對(duì)最后一個(gè)不能判斷。
③GetNextDlgTabItem(GetFocus())->SetFocus();//最好
回車事件為窗口缺損消息由ONOK()響應(yīng),可通過對(duì)控件屬性設(shè)計(jì)為缺損做消息響應(yīng)以接收這個(gè)消息。廿:查看/改變對(duì)話框控件排列的秩序
在對(duì)話框資源界面中:Layout->Tab Order->改順序。
廿一:逃跑按鈕的巧妙實(shí)現(xiàn)
①創(chuàng)建多個(gè)Cbutton控件,并建立基于Cbutton類,類中包含一個(gè)本類的成員變量。
②將控件關(guān)聯(lián)成這個(gè)類的一個(gè)變量,同時(shí)使自己的成員變量指向下個(gè)控件 ③ShowWindow(SW_HIDE);使自己隱藏,通過其成員變量m_pBtn->ShowWindow(SW_SHOW)使對(duì)方顯示
廿二:如何制作屬性頁對(duì)話框和向?qū)?duì)話框CpropertySheet類CpropertyPage類
①創(chuàng)建屬性頁:insert->Resource->Dailog->選擇后三個(gè)之一(如IDD_PROPPAGE_LARGE).②為各頁添加控件并為各頁創(chuàng)建以CpropertyPage(屬性表單頁類)為基類的屬性表單頁類.③以CPropertySheet為基類創(chuàng)建屬性表單類,并在表單類中添加各表單頁的對(duì)象。要加頭文件。
④在表單類的構(gòu)造函數(shù)中用AddPage(&m_prop1);添加各表頁。
⑤在View中做消息響應(yīng)做顯示觸發(fā)器。編代碼:⑤.1構(gòu)造表單對(duì)象(設(shè)計(jì)表單名)⑤.2調(diào)用propSheet.DoModal()或Create()顯示頁面。(注: 創(chuàng)建向?qū)?duì)話框在⑤.2前調(diào)用SetWizardMode()
⑥設(shè)計(jì)各頁(上一步、下一步等)限制用戶在不滿足設(shè)定的條件時(shí)切換到其他屬性頁和向?qū)ы摗#孩?1 在各頁中添加OnSetActive()虛函數(shù)⑥.2用表單指針調(diào)用SetWizardButtons()來設(shè)計(jì)。如:((CPropertySheet*)GetParent())->
SetWizardButtons(PSWIZB_NEXT);其響應(yīng)函數(shù)為虛函數(shù)OnWizardNext/Back/Finish(查看MSDN)return –1不進(jìn)入下一頁。廿三:單選按鈕操作方法:
①對(duì)所有單選按鈕的第一個(gè)按鈕屬性設(shè)為Group,并為它們關(guān)聯(lián)一個(gè)int類型的變量(使用時(shí)可按其編號(hào)訪問)
②選擇后(要按下一步或ok鍵)對(duì)按鍵作消息響應(yīng),用UpdateDate()對(duì)所選取值。
③對(duì)適當(dāng)事件作消息響應(yīng)通過一新的int類型的變量取這個(gè)關(guān)聯(lián)的變量。
④使用選擇值時(shí)作消息響應(yīng),通過變量作switch()case選擇,通過str+=“程序員”等方式取值并將選擇輸出。
⑤使用完后在使用類的構(gòu)造函數(shù)中對(duì)數(shù)組初始化
廿四:復(fù)選按鈕操作方法:
①對(duì)所有復(fù)選按鈕都關(guān)聯(lián)一個(gè)Bool類型的變量(使用時(shí)可按其編號(hào)訪問)
②選擇后(要按下一步或ok鍵)對(duì)按鍵作消息響應(yīng),用UpdateDate()對(duì)所選取值。(就一個(gè)函數(shù))
③對(duì)適當(dāng)事件作消息響應(yīng)通過Bool類型數(shù)組記錄每個(gè)關(guān)聯(lián)變量的值。
④使用選擇值時(shí)作消息響應(yīng),通過Bool類型數(shù)組多次if(m_bLike[0])判斷,通過str+=“程序員”等方式取值并將選擇輸出。
⑤使用完后在使用類的構(gòu)造函數(shù)中用memset()對(duì)數(shù)組初始
廿五: 組合框操作方法:CcomboBox類
①做OnInitDialog()虛函數(shù)消息響應(yīng)通過AddString()初始化選項(xiàng)值。
并通過((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0);負(fù)索引號(hào)值。
②對(duì)適當(dāng)事件作消息響應(yīng)通過引號(hào)。
int index=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();取得索
((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);通過索引號(hào)將值存入字符串中。③對(duì)適當(dāng)事件作消息響應(yīng)通過新的CString類型變量記錄這個(gè)字符串。
④使用選擇值時(shí)作消息響應(yīng),通過CString類型變量以str+=“程序員”等方式直接使用。⑤使用完后在使用類的構(gòu)造函數(shù)中對(duì)數(shù)組初始化
廿六:列表框操作方法:ClistBox類
①對(duì)所有復(fù)選按鈕都關(guān)聯(lián)一個(gè)CString類型的變量.并做OnInitDialog()虛函數(shù)消息響應(yīng)通過AddString()初始化選項(xiàng)值。
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(“北京”);
②對(duì)適當(dāng)事件作消息響應(yīng)通過新的CString類型變量記錄關(guān)聯(lián)變量的選擇值。
③使用選擇值時(shí)作消息響應(yīng),通過CString類型變量以str+=“程序員”等方式直接使用。④使用完后在使用類的構(gòu)造函數(shù)中對(duì)數(shù)組初始化。
廿七:解決添加類成功后ClassWizard找不到其.h//.cpp文件
①在本工程目錄下刪除.CLW 文件;.CLW 為管理類信息的文件。②在工程中View->ClassWizard->是(輸入這個(gè)文件名.CLW)
廿八:修改MFC AppWizard向?qū)傻目蚣艹绦虼翱诘拇笮『蜆?biāo)題:在CMainFrame類中
在CMainFrame類中一法:在PreCreateWindow()中(窗口創(chuàng)建前)查MSDN的Frame-window styles
cs.cx=300;cs.lpszName=“http://004km.cn”;
二法:在CMainFrame類的OnCreate()中:(窗口創(chuàng)建后)調(diào)用SetWindowLong()
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);廿九:修改MFC AppWizard向?qū)傻目蚣艹绦虼翱诘膱D標(biāo):在CMainFrame類中
PreCreateWindow()一:中同窗口的創(chuàng)建相同:WNDCLASS wndcls;->設(shè)計(jì)->注冊->修改
二cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));OnCreate()中三
OnCreate()中
加載系統(tǒng)圖標(biāo):SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
四:加載自定義圖標(biāo): m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);
三十:修改MFC AppWizard向?qū)傻目蚣艹绦虼翱诘谋尘?、光?biāo):在CView類中
PreCreateWindow()中一法:cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);OnCreate()
中
二
法
:SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
背景
光標(biāo)
卅一獲得當(dāng)前應(yīng)用程序?qū)嵗浔姆椒ǎ?/p>
一:AfxGetInstanceHandle()二:theApp.m_hInstance三:AfxGetApp()->m_hInstance,卅一:.工具欄按鈕編程和手動(dòng)添加工具欄
CToolBar類 對(duì)菜單進(jìn)行消息響應(yīng),對(duì)常用菜單在Resource的ToolBar中設(shè)計(jì)工具欄按鈕,將其ID設(shè)計(jì)于菜單欄ID相同
手動(dòng)添加工具欄查看MSDN的CToolBar類。也可查看CMainFrame::OnCreate()函數(shù)。
卅二:向應(yīng)用程序?qū)雸D標(biāo)資源:
將圖標(biāo)資源copy到本工程的.res目錄下,insert->rousert->import導(dǎo)入圖標(biāo)資源
卅三:對(duì)菜單進(jìn)行消息響應(yīng)使自定義工具欄顯示和隱藏:m_newToolBar為工具欄類對(duì)象。
1法:if(m_newToolBar.IsWindowVisible()){m_newToolBar.ShowWindow(SW_HIDE);} else{m_newToolBar.ShowWindow(SW_SHOW);}
RecalcLayout();
DockControlBar(&m_newToolBar);// 工具欄??亢瘮?shù) 2法:ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
卅四:對(duì)狀態(tài)欄的狀態(tài)指示器編程(編寫時(shí)鐘顯示)CstatusBar類
①在String Table資源中加入ID資源并在CmainFrame的頭文件中建立一個(gè)CstatusBar類對(duì)象。
②在CmainFrame類.cpp的static UINT indicators[]結(jié)構(gòu)第一個(gè)ID后添加這個(gè)ID.就可顯示這個(gè)String。
③在OnCreate()通過Cstring對(duì)象格式化記錄要輸出的內(nèi)容。這里是時(shí)間.CTime t=CTime::GetCurrentTime();CString str=t.Format(“%H:%M:%S”);④ 通過
CSize sz=dc.GetTextExtent(str);取得屏幕輸出要的寬度。
Int index=m_wndStatusBar.CommandToIndex(IDS_TIMER)//通過ID取得索引號(hào)并通過索引號(hào)設(shè)計(jì)窗格寬度 類對(duì)象.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);⑤類對(duì)象.SetPaneText(1,str);輸出內(nèi)容。
⑥在OnPaint()中重寫代碼,當(dāng)窗口重繪時(shí)再只顯示。
卅五:對(duì)狀態(tài)欄的指示行的編程 ①在響應(yīng)的類中作消息響應(yīng)。并編代碼。②通過Cstring對(duì)象格式化記錄要輸出的內(nèi)容如
CString str;
str.Format(“x=%d,y=%d”,point.x,point.y);③顯示(有四種方法)一:((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);m_wndStatusBar為CstatusBar類對(duì)象
二:((CMainFrame*)GetParent())->SetMessageText(str);
三:((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);四str);
AFX_IDW_STATUS_BAR為系統(tǒng)準(zhǔn)備的狀態(tài)欄ID號(hào);
:GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(卅六:進(jìn)度欄的編寫:CprogressCtr類
①在頭文件中建立一個(gè)CprogressCtrr類對(duì)象。并在OnCreate()中通過對(duì)象創(chuàng)建一個(gè)進(jìn)度欄。②
卅七:發(fā)送自定義消息:
①在頭文件中定義消息宏:#define UM_PROGRESS
WM_USER+1 ②作消息映射③在要響應(yīng)消息處通過SendMessage(UM_PROGRESS)或PostMessage(UM_PROGRESS)發(fā)送消息調(diào)用函數(shù)做要做的任務(wù)。SendMessage(UM_PROGRESS)發(fā)送消息馬上調(diào)用函數(shù)
ostMessage(UM_PROGRESS)發(fā)送消息到消息隊(duì)列中,并繼續(xù)運(yùn)行進(jìn)程。
卅八:為應(yīng)用程序添加啟動(dòng)畫面
①1系統(tǒng)添加法:① Project->Add to Project->Components and Controls->Visual C++ conpenets->Splash Screen->Insert->選擇類(不能選CmainFram)
②在Ontimer()中對(duì)顯示時(shí)間做設(shè)計(jì)。如果手動(dòng)添加可參看這個(gè)方法。
卅九:使用標(biāo)準(zhǔn)顏色對(duì)話框,標(biāo)準(zhǔn)字體對(duì)話框(CcolorDialog類,CfontDialog類)
顏色對(duì)話框:①做消息響應(yīng)并建立控件對(duì)象,CColorDialog dlg;②創(chuàng)建顏色對(duì)話框并通過對(duì)象的數(shù)據(jù)成員m_cc指向的結(jié)構(gòu)取的選擇的顏色dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;//設(shè)計(jì)標(biāo)記if(IDOK==dlg.DoModal()){
COLORREF m_clr=dlg.m_cc.rgbResult;}通過rgbResult的記錄輸出客戶的選擇。就可以在畫筆、畫刷、字體設(shè)計(jì)顏色。
字體對(duì)話框(雷同):①做消息響應(yīng)并建立控件對(duì)象,CFontDialog dlg;②創(chuàng)建字體對(duì)話框并通過對(duì)象的數(shù)據(jù)成員m_cf指向的結(jié)構(gòu)變量lpLogFont的字體值初始化自定義字體CFont m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);就可為DC加載字體③為聯(lián)系創(chuàng)建字體,要對(duì)m_font資源做判斷,如果存在就釋放資源在創(chuàng)建。
if(m_font.m_hObject)m_font.DeleteObject();查MSDN的類和它們的成員變量看事例。
四十:改變對(duì)話框的背景色,控件字體色、背景色(Cbutton除外)。
①做WM_CTLCOLOR消息響應(yīng),并創(chuàng)建一個(gè)CBRUSH對(duì)象,return這個(gè)對(duì)象來改變對(duì)話框的背景色 ②通過pWnd->GetDlgCtrlID()==ID—做判斷,/用
pDC
調(diào)用SetTextColor(RGB(255,0,0));
SetBkMode(TRANSPARENT);SetBkColor(RGB(0,0,255));改變控件字體色、背景色,背景模式。
泗一:改變CButton控件字體色、背景色
①在工程中加入一個(gè)以CButton為基類的新類。并重載虛函數(shù)DrawItem();②在函數(shù)體中加入MSDN中CButton類的DrawItem()的示例代碼。(改變背景色要自寫代碼)。
③在CButton控件中關(guān)聯(lián)這個(gè)新類的變量,同時(shí)將控件屬性Styles->Ower Draw選擇上就可以改變字體色。改變背景色代碼:有別人寫的CSXBtn類和CButtonST類,以備:加載到工程中。
用CSXBtn類雷同上,CButtonST類如下:
①加載CButtonST到工程中,在CButton控件中關(guān)聯(lián)這個(gè)新類的變量,重載:OnInitDialog()調(diào)用下面的函數(shù)
BOOL CSettingDlg::OnInitDialog()
{CDialog::OnInitDialog();m_btnST.SetActiveBgColor(RGB(0,0,255));m_btnST.SetActiveFgColor(RGB(255,0,0));}
泗二:在窗口中顯示一幅位圖。四步:
1、準(zhǔn)備一副位圖,響應(yīng)WM_ERASEBKGND消息。
2、創(chuàng)建位圖 bitmap.GetBitmap(&bmp);}
3、創(chuàng)建兼容DC CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);
4、將位圖選到兼容DC中
dcCompatible.SelectObject(&bitmap);在GetClientRect(&rect)取的客戶矩形。
5、將兼容DC中的位圖貼到當(dāng)前DC中。pDC->BitBlt(rect.left,rect.top,rect.Width(), {或pDC->StretchBlt();} rect.Height(),&dcCompatible,0,0,SRCCOPY);
6、return TRUE;后也可在OnDraw()中又重繪。CBitmap
bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
{BITMAP
bmp;泗三:圖形的保存和重繪
一法::
①在工程中添加一普通類,添加多個(gè)成員變量以保存圖形的各要素,并添加帶這幾個(gè)參數(shù)的構(gòu)造函數(shù)來初始化對(duì)象
②在繪圖的View中建立CptrArray(或別的集合類)對(duì)象,在繪圖函數(shù)中建立這個(gè)普通類的對(duì)象,沒次繪圖都記錄這些數(shù)據(jù)并用
Add()添加到集合類對(duì)象中以保存圖形。③在OnDraw()中用GetSize()取數(shù)組個(gè)數(shù)做循環(huán),嵌套switch用GetAt(i)取圖形類型重繪圖形。for(int i=0;i
二法:利用兼容DC實(shí)現(xiàn)圖形的保存和重繪
①在View類中建一個(gè)CDC m_dc對(duì)象,在繪圖響應(yīng)函數(shù)中通過它建立一個(gè)兼容DC對(duì)象,并建一個(gè)兼容位圖對(duì)象記錄要保存的圖片,將兼容位圖選入兼容DC中,if(!CDC m_dcCompatible.m_hDC){ m_dcCompatible.CreateCompatibleDC(&dc);CRect rect;GetClientRect(&rect);CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());m_dcCompatible.SelectObject(&bitmap);
m_dcCompatible.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);/*將原始設(shè)備顏色和象素拷貝到兼容DC中*/m_dcCompatible.SelectObject(pBrush);} ②可以用兼容DC在繪圖函數(shù)中作圖。③在重繪函數(shù)
OnDraw()中通過兼容DC將記錄的兼容位圖拷貝到矩形空間。CRect rect;GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);三法:CmetaFileDC 類: 查MSDN的介紹有步驟。
泗四:文件的操作,增加“打開、保存”文件對(duì)話框,注冊表的讀寫
文件的操作:Cfile類 “打開、保存”文件對(duì)話框:CfileDialog類和m_ofn成員函數(shù)OPENFILENAME結(jié)構(gòu)。
注冊表的讀寫:查MSDN的Registry Functions
泗五:使用CArchive類對(duì)文件串行化(查MSDNCArchive類)①創(chuàng)建一個(gè)文件對(duì)象用于保存數(shù)據(jù),同時(shí)創(chuàng)建一個(gè)CArchive ar 對(duì)象。
②通過ar>>將要輸入的數(shù)據(jù)保存到文件中。同樣也可通過ar<<將文件中的數(shù)據(jù)輸出。
泗六:修改文擋標(biāo)題的方法:
①法:在C*Doc類的OnNewDocument()中調(diào)用SetTitle()。注:在文擋、視圖、框架創(chuàng)建是調(diào)用OnNewDocument(),所以可以添加代碼設(shè)計(jì)它們。
②法:在資源String Table的IDR_MAINFRAME的第一二個(gè)n間修改字符。注:IDR_MAINFRAME包含的內(nèi)容:主窗口名、文擋名、文擋類等。(查MSDN的CDOCTemplate::GetDOCString())
泗七:新類的串行化和文擋對(duì)圖形的串行化處理過程:永久保存圖形繪制圖形:
第一步:實(shí)現(xiàn)新類對(duì)串行化的支持:(查MSDNCArchive類對(duì)CObject的串行化)①建立一個(gè)記錄圖形各要素的新類,并以CObject為基類。
②在新類中覆蓋void Serialize(CArchive& ar)虛函數(shù),并通過CArchive& ar對(duì)象實(shí)現(xiàn)存取。
③在新類頭文件中加
DECLARE_SERIAL(新類名)的宏。
④在新類實(shí)現(xiàn)文件中加IMPLEMENT_SERIAL(新類名, CObject, 1)的宏。⑤在新類中重載一個(gè)不帶參數(shù)的構(gòu)造函數(shù)。(有初始化要素的構(gòu)造函數(shù))后這個(gè)類就支持串行化了。串行化完成。
⑥在新類中添加void Draw(CDC *pDC)函數(shù)實(shí)現(xiàn)對(duì)圖形的重繪。第二步:繪制圖形并永久保存圖形:①在
第二篇:《操作系統(tǒng)原理》算法總結(jié)
《操作系統(tǒng)原理》算法總結(jié)
一、進(jìn)程(作業(yè))調(diào)度算法
? 先來先服務(wù)調(diào)度算法(FCFS):每次調(diào)度是從就緒隊(duì)列中,選擇一個(gè)最先進(jìn)入就緒隊(duì)列的進(jìn)程,把處理器分配給該進(jìn)程,使之得到執(zhí)行。該進(jìn)程一旦占有了處理器,它就一直運(yùn)行下去,直到該進(jìn)程完成或因發(fā)生事件而阻塞,才退出處理器。特點(diǎn):利于長進(jìn)程,而不利于短進(jìn)程。
? 短進(jìn)程(作業(yè))優(yōu)先調(diào)度算法(SPF):它是從就緒隊(duì)列中選擇一個(gè)估計(jì)運(yùn)行時(shí)間最短的進(jìn)程,將處理器分配給該進(jìn)程,使之占有處理器并執(zhí)行,直到該進(jìn)程完成或因發(fā)生事件而阻塞,然后退出處理器,再重新調(diào)度。
? 時(shí)間片輪轉(zhuǎn)調(diào)度算法 :系統(tǒng)將所有的就緒進(jìn)程按進(jìn)入就緒隊(duì)列的先后次序排列。每次調(diào)度時(shí)把CPU分配給隊(duì)首進(jìn)程,讓其執(zhí)行一個(gè)時(shí)間片,當(dāng)時(shí)間片用完,由計(jì)時(shí)器發(fā)出時(shí)鐘中斷,調(diào)度程序則暫停該進(jìn)程的執(zhí)行,使其退出處理器,并將它送到就緒隊(duì)列的末尾,等待下一輪調(diào)度執(zhí)行。
? 優(yōu)先數(shù)調(diào)度算法 :它是從就緒隊(duì)列中選擇一個(gè)優(yōu)先權(quán)最高的進(jìn)程,讓其獲得處理器并執(zhí)行。
? 響應(yīng)比高者優(yōu)先調(diào)度算法:它是從就緒隊(duì)列中選擇一個(gè)響應(yīng)比最高的進(jìn)程,讓其獲得處理器執(zhí)行,直到該進(jìn)程完成或因等待事件而退出處理器為止。特點(diǎn):既照顧了短進(jìn)程,又考慮了進(jìn)程到達(dá)的先后次序,也不會(huì)使長進(jìn)程長期得不到服務(wù),因此是一個(gè)比較全面考慮的算法,但每次進(jìn)行調(diào)度時(shí),都需要對(duì)各個(gè)進(jìn)程計(jì)算響應(yīng)比。所以系統(tǒng)開銷很大,比較復(fù)雜。
? 多級(jí)隊(duì)列調(diào)度算法 基本概念:
作業(yè)周轉(zhuǎn)時(shí)間(Ti)=完成時(shí)間(Tei)-提交時(shí)間(Tsi)
作業(yè)平均周轉(zhuǎn)時(shí)間(T)=周轉(zhuǎn)時(shí)間/作業(yè)個(gè)數(shù)
作業(yè)帶權(quán)周轉(zhuǎn)時(shí)間(Wi)=周轉(zhuǎn)時(shí)間/運(yùn)行時(shí)間
響應(yīng)比=(等待時(shí)間+運(yùn)行時(shí)間)/運(yùn)行時(shí)間
二、存儲(chǔ)器連續(xù)分配方式中分區(qū)分配算法
? 首次適應(yīng)分配算法(FF):對(duì)空閑分區(qū)表記錄的要求是按地址遞增的順序排列的,每次分配時(shí),總是從第1條記錄開始順序查找空閑分區(qū)表,找到第一個(gè)能滿足作業(yè)長度要求的空閑區(qū),分割這個(gè)空閑區(qū),一部分分配給作業(yè),另一部分仍為空閑區(qū)。
? 循環(huán)首次適應(yīng)算法:每次分配均從上次分配的位置之后開始查找。
? 最佳適應(yīng)分配算法(BF):是按作業(yè)要求從所有的空閑分區(qū)中挑選一個(gè)能滿足作業(yè)要求的最小空閑區(qū),這樣可保證不去分割一個(gè)更大的區(qū)域,使裝入大作業(yè)時(shí)比較容易得到滿足。為實(shí)現(xiàn)這種算法,把空閑區(qū)按長度遞增次序登記在空閑區(qū)表中,分配時(shí),順序查找。
三、頁面置換算法
? 最佳置換算法(OPT):選擇以后永不使用或在最長時(shí)間內(nèi)不再被訪問的內(nèi)存頁面予以淘汰。
? 先進(jìn)先出置換算法(FIFO):選擇最先進(jìn)入內(nèi)存的頁面予以淘汰。
? 最近最久未使用算法(LRU):選擇在最近一段時(shí)間內(nèi)最久沒有使用過的頁,把它淘汰。
? 最少使用算法(LFU):選擇到當(dāng)前時(shí)間為止被訪問次數(shù)最少的頁轉(zhuǎn)換。
四、磁盤調(diào)度
? 先來先服務(wù)(FCFS):是按請(qǐng)求訪問者的先后次序啟動(dòng)磁盤驅(qū)動(dòng)器,而不考慮它們要訪問的物理位置
? 最短尋道時(shí)間優(yōu)先(SSTF):讓離當(dāng)前磁道最近的請(qǐng)求訪問者啟動(dòng)磁盤驅(qū)動(dòng)器,即是讓查找時(shí)間最短的那個(gè)作業(yè)先執(zhí)行,而不考慮請(qǐng)求訪問者到來的先后次序,這樣就克服了先來先服務(wù)調(diào)度算法中磁臂移動(dòng)過大的問題
? 掃描算法(SCAN)或電梯調(diào)度算法:總是從磁臂當(dāng)前位置開始,沿磁臂的移動(dòng)方向去選擇離當(dāng)前磁臂最近的那個(gè)柱面的訪問者。如果沿磁臂的方向無請(qǐng)求訪問時(shí),就改變磁臂的移動(dòng)方向。在這種調(diào)度方法下磁臂的移動(dòng)類似于電梯的調(diào)度,所以它也稱為電梯調(diào)度算法。
? 循環(huán)掃描算法(CSCAN):循環(huán)掃描調(diào)度算法是在掃描算法的基礎(chǔ)上改進(jìn)的。磁臂改為單項(xiàng)移動(dòng),由外向里。當(dāng)前位置開始沿磁臂的移動(dòng)方向去選擇離當(dāng)前磁臂最近的哪個(gè)柱面的訪問者。如果沿磁臂的方向無請(qǐng)求訪問時(shí),再回到最外,訪問柱面號(hào)最小的作業(yè)請(qǐng)求。