1,從那種基本類中繼承的函數 變異時都會自動被調用
2,void *memset(void *s,int c,size_t n)
總的作用:将已開辟記憶體空間 s 的首 n 個位元組的值設為值 c。
3,DoDataExchange中
編輯框 DDX_Text(pDX, IDC_EDTXSXM, m_xsxm);//把ID_EDITSXM這個控件和字元串 ID_EDITSXM映射起來
下拉菜單 DDX_CBString(pDX, IDC_CMBXSXB, m_xsxb);
UpdateData()這個函數是更新對話框顯示内容
4,獲得資源檔案裡Icon的圖檔
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
等同于 pApp = (CListCtrlUseApp*)AfxGetApp();
pApp->LoadIcon(IDI_NORMAL1)
後者是兩部
5,void ZeroMemory(
PVOID Destination,
SIZE_T Length
);
The ZeroMemory macro fills a block of memory with zeros.
6,EnableWindow 設定滑鼠和鍵盤對控件的有效性( Enables or disables mouse and keyboard input to the control site.)
((CEdit*)GetDlgItem(IDC_EDTXSBH))->EnableWindow(aValue);
7,wcscpy(string1,string2)複制字元串2到1
wcscat Append a string.
8,atoi() 字元型轉變為整形
itoa() 整形轉換為字元串
9,第幾行=第幾項
第幾列=第幾子項
10,
"HELLO" 那麼編譯器将從ansi字元串中組成該字元串。
L"HELLO" 那麼編譯器将使用Unicode編碼。
如果使用MFC的_T宏,就有:如果定義了預處理符号_UNICODE,那麼編譯器将使用Unicode字元。
如果沒有定義的話,就使用ansi字元。
11,
Cstring轉換為 char*類型
方法1 GetBuffer函數
char *p;
CString = "hello";
p=str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
方法2 memcpy函數
CString mCS=_T("cxl");
char mch[20];
memcpy(mch,mCS,mCS.GetLength());
方法3 LPCTSTR強制轉換
char *ch;
CString str= _T("cxl");
ch=(LPSTR)(LPCTSTR)str;
//
char*轉換為Cstring
方法 直接附值過去就行
char *p="this is a test";
CString s = p;
//
CString 轉為wchar_t*
wchar_t* pwText = (wchar_t*)(LPCTSTR)strText;
12,
CString 轉化為 int
方法 atoi()函數
CString str("352");
int iTem = atoi(str);
如果用Unicode 就用_ttoi()
其他方法 _tcstoul() _tcstol()
13,
關于引用做參數的說法:
傳遞一個引用和傳遞一個指針是一樣的,都是傳一個對象的位址過去,而傳遞一個對象過去的時候,還要重建一個對象,調用這個對象的拷貝構造函數等等,相比來說還是傳遞飲用和指針來得簡單。
一般也不會傳遞簡單類型的引用,除非你想在函數中改變它,這是一個基本的程式設計規則了。否則你維護程式的成本十分高的。而且象對int,char這樣的簡單對象,效率上差不了多少。(注)指針作參數好像還需要解引用,需要一點點開銷,是以如果參數為非簡單類型的對象還是用引用吧
14,
int a = 21;
double b = 3.45;
CString str1;
str1.Format(_T("%d"),a);
AfxMessageBox(str1); //顯示21
str1.Format(_T("%2d"),a); //顯示21
AfxMessageBox(str1);
CString str2;
str2.Format(_T("%.4f"),b);
AfxMessageBox(str2); //顯示3.0045
str2.Format(_T("0%.4f"),b); //03.0045
AfxMessageBox(str2);
15,
int strcmp(const char *string1,const char *string2)
對比兩個字元串
16,
轉義字元 描述
/' 單引号
/" 雙引号
// 反斜杠
/0 空字元
/a 響鈴
/b 後退
/f 走紙
/n 換行
/r 回車
/t 水準制表符
/v 垂直制表符
/xnnn 表示十六進制數(nnn)
17,
USES_CONVERSION;
_acp=CP_UTF8;
第二句話如果不加 W2A和A2W是ascll和 wide char之間的轉換,加上這句話作用就變成了utf-8和wide char之間的轉換
18,
CREATE TABLE HHFF3
AS SELECT *
FROM ENGLISH_WORDS
WHERE CONTENT LIKE 'a%
19,
ShowWindow(SW_SHOW);//顯示
ShowWindow(SW_RESTORE);//恢複
20,關于繪圖
GDI 圖形裝置接口
CDC 裝置環境類的基類
CPaintDC類 派生與CDC用于響應windows消息:WM_PAINT
CDC的其他派生類CWindowsDC,CClientDC
CDC的一個重要方法:selectobject 選擇"繪圖工具對象"
繪圖工具類:
CPen,CBrush,CFont,CRgn,CPalette(調色闆),CBitmap
CDC的一些方法:
21,清空CComboBox控件中編輯框中内容
m_comXinHua->SetEditSel(0, -1);
m_comXinHua->Clear();
22,作參數時:
CString strAAA;
FUN(CString strAAA )
{
}
這種情況下strAAA傳進函數,函數對這個值進行了操作,但無論怎麼操作都無法改變外邊的值因為傳進來的strAAA隻是個副本
FUN(CString &strAAA)
{
}
這種情況下strAAA傳進函數,函數對這個值進行了操作,外面的值也随之改變因為傳進來的是個位址,按照這個位址直接操作的變量。
FUN( Const CString &strAAA )
{
}
這種情況下strAAA也是弄了個副本傳進函數,但這個函數無法改變這個strAAA
23,
設定一個初始化一個CommandBar/菜單
//
if (!m_wndCommandBar.Create(this) ||!m_wndCommandBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar/n");
return -1;
}
m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle()|CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);
設定工具條中按鈕狀态為"非激活狀态"
CToolBarCtrl & tbc = m_wndCommandBar.GetToolBarCtrl();
tbc.EnableButton(uButtonID,TRUE) ;
又見過其它的兩種寫法(commandbar和菜單條基本一回事)
//**第一種(MainFrame裡面初始化菜單的方法)
if (!m_wndCommandBar.Create(this) ||
!m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
!m_wndCommandBar.AddAdornments(dwAdornmentFlags))
{
TRACE0("未能建立 CommandBar/n");
return -1; // 未能建立
}
m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | CBRS_SIZE_FIXED);
//**第二種梁辰常用作法
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.dwFlags = SHCMBF_HMENU;
mbi.hwndParent = m_hWnd;
mbi.nToolBarId = IDR_BACK_MENU;//菜單資源ID
mbi.hInstRes = ::AfxGetInstanceHandle();
SHCreateMenuBar(&mbi);
24,設定目前視窗标題(mobile右上角)
::SetWindowText(this->GetSafeHwnd(),L"DFD"); //this->GetSafeHwnd() 獲得目前視窗句柄
其他更改标題方法:
調用CWnd : : SetWindowText可以改變任何視窗(包括控件)的标題。
//Set title for application's main frame window .
AfxGetMainWnd ( ) ―> SetWindowText (_T("Application title") );
//Set title for View's MDI child frame window .
GetParentFrame ( ) ―> SetWindowText ("_T ("MDI Child Frame new title") );
//Set title for dialog's push button control.
GetDigitem (IDC_BUTTON) ―> SetWindowText (_T ("Button new title ") );
25,工程屬性頁中的"消息"和"重寫"
消息是指對标準Windows消息進行攔截,
重寫是指MFC架構,留出的 常用的 友善大家實作所需功能的 改寫用的函數,一般都是些虛函數,(Windows消息已被爛截,被指向了某些基類的标準處理函數,但這些沒有什麼特定功能,是以使用時,通過重寫來完成特定功能的實作,
26,建立一個程序
CreateProcess(NULL,"d://test//te.exe",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) //"d://test//te.exe"是您要運作的程式的路徑
也可用ShellExecute與ShellExecuteEx這兩個函數。功能更加強大,也常用于調用浏覽器打開制定網頁操作
27,
句柄:是一個數(通常為32位),它代表一個對象。程式幾乎總是通過調用Windows函數擷取句柄,程式在其他Windows函數中使用這個句柄,以引用這個對象。例如:
HINSTANCE:應用程式執行個體句柄,唯一辨別該應用程式,其他Windows函數需要用該句柄作為參數來調用該應用程式。
HWND:視窗句柄
HDC:裝置描述表句柄
28,
兩個取得指針小函數
AfxGetApp() -- 傳回指向目前工程的CWinApp對象的指針,
GetMainWnd()-- 傳回指向主視窗對象的指針
29,
從應用程式的資源裡加載制定字元串
LoadString(hInstance,IDS_APP_TITLE,wAppTile,MAXSIZE_APPBUF);
//它的第一個參數就使用到hInstance句柄。是以應用程式句柄是表示程式在資源上唯一的辨別符。
//hInstance是目前應用程式的執行個體句柄,一般用來區分不同的資源使用。取得目前所在應用程式的執行個體句柄可以用 AfxGetInstanceHandle()
30,WM_NOTIFY消息
通知一個控件的父視窗一個消息在這個控件上上産生了。
父級對話框接在其視窗函數中接收到此消息要進行判斷在這個控件上發生的是什麼消息
在Win32中:
例:(例子中空間為html控件)
case WM_NOTIFY:
{
NM_HTMLVIEW* pnmHTMLView = (NM_HTMLVIEW*)lParam;
switch (pnmHTMLView->hdr.code)
{
case NM_HOTSPOT: //點選了連結
/do some thing....
break;
case NM_TITLECHANGE://html标題變化了
/do some thing....
break;
.
.
.
}
}
在Mfc中:對這個消息的封裝是這樣的:ON_NOTIFY(NM_DBLCLK, IDC_LISTCTRL, OnDblclkListctrl)
利用這個宏把這個視窗中IDC_LISTCTRL這個控件的NM_DBLCLK消息的觸發放到,這個該控件的父視窗(這個類)的OnDblclkListctrl()函數中取處理,當然有時候封裝的原有東西不一定完全符合要求,是以必要時就要重寫視窗過程函數,重新捕捉這個消息,像上面的例子一樣
31,定義快捷鍵
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN));
IDC_TESTWIN實在資源檔案中定義的,定義方法請見windows API一日一練(10)
32,該函數用于擷取對話框中指定控件的視窗句柄。
HWND GetDlgItem(HWND hDlg, int nIDDlgItem);
33,改變radio選框的選中狀态,使用Button_SetCheck 宏
Button_SetCheck(GetDlgItem(hwnd, IDC_OPENSUCCEEDS), TRUE);
34,存儲結構體的數組
// structures
typedef struct tagHOUSEINFO
{
TCHAR szAddress[MAX_ADDRESS];
TCHAR szCity[MAX_CITY];
int iPrice;
int iBeds;
int iBaths;
} HOUSEINFO;
//array of houses
HOUSEINFO rgHouseInfo[] =
{
{TEXT("100 Berry Lane"), TEXT("Redmond"), 175000, 3, 2 },
{TEXT("523 Apple Road"), TEXT("Redmond"), 125000, 4, 2},
{TEXT("1212 Peach Street"), TEXT("Redmond"),200000, 4, 3},
{TEXT("22 Daffodil Lane"), TEXT("Bellevue"), 2500000, 4, 4},
{TEXT("33542 Orchid Road"), TEXT("Bellevue"), 180000, 3, 2},
{TEXT("64134 Lily Street"), TEXT("Bellevue"), 250000, 4, 3},
{TEXT("33 Nicholas Lane"), TEXT("Seattle"), 350000, 3, 2},
{TEXT("555 Tracy Road"), TEXT("Seattle"), 140000, 3, 2},
{TEXT("446 Jean Street"), TEXT("Seattle"), 225000, 4, 3}
};
35,
typedef char* PCHAR;
用PCHAR替換char*這種寫法
36,
wsprintf函數
函數用法為:
int wsprintf( LPTSTR lpOut, // 輸出緩沖區,最大為1024位元組
LPCTSTR lpFmt, // 格式字元串
... // 需輸出的參數);
将第3個參數轉換成第二個參數那種格式的形式,lpOut儲存這個格式化後的值,例如:
wsprintf(szBuffer,“%d“,x);
37,
CList和CArray前面是動态連結清單,後面是動态數組。兩者都有非常有用。
CArray和CList采用兩個參數:TYPE和ARG_TYPE。這些類可以存儲任何在TYPE參數中指定的資料類型:
基本C++資料類型,如int、char和float
C++ 結構和類
定義的其他類型
考慮到友善性和效率,可以使用ARG_TYPE參數來指定函數參數的類型。通常情況下,将ARG_TYPE指定為對TYPE參數中命名類型的引用。例如:
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
第一個示例聲明了一個包含多個int的數組集合myArray。第二個示例聲明了一個存儲CPerson對象的清單集合myList。集合類的某些成員函數采用其類型由ARG_TYPE模闆參數指定的參數。例如,CArray類的Add成員函數采用ARG_TYPE參數:
CArray<CPerson, CPerson&> myArray;
CPerson person;
myArray->Add(person);
38,連接配接dll檔案并取出庫中指定函數:
HINSTANCE h = ::LoadLibrary(L"//Storage Card//PIEHelper.dll");
if(h == NULL) {
//CString msg;
//msg.Format("Failed to find server %s",L"//PIEHelper.dll");
AfxMessageBox(L"loadlibrary失敗了!");
return FALSE;
}
FARPROC pFunc = ::GetProcAddress((HMODULE) h, L"DllRegisterServer");
if(pFunc == NULL) {
AfxMessageBox(L"Failed to find DllRegisterServer function");
return FALSE;
}
(*pFunc)(); // call the function to register the server
AfxMessageBox(L"Server registered OK");
39,
char buff[64];
strcpy(buff, "begin transaction ");//Copy a string.
strcat(buff, lpczName); //Append a string.
40,
// 建立一個視窗
CreateEx( 0, AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
pTitle,
WS_POPUP ,
rect,
NULL,
NULL,
NULL);
請查閱CreateEx和AfxRegisterWndClass函數定義更好的了解
41,繼承Wnd的類隻有直接或間接調用CreateEx或CreateWindowEX才算是個視窗。才會有視窗句柄。否則this->GetSafeHwnd()得到為空
42,将一個圖檔顯示到視窗上
CWindowDC pDC(this);
CBitmap bitmap;
bitmap.Attach(SHLoadImageFile(_T("Application Data//Good.gif")));
//bitmap.CreateBitmap( l_rcClient.Width(), l_rcClient.Height(), 1, 1, NULL ) ;
//bitmap.LoadBitmap(IDB_BITMAP1)
BITMAP bmpInfo;
bitmap.GetBitmap(&bmpInfo);
CDC bitmapDC;
bitmapDC.CreateCompatibleDC(&pDC);
CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
pDC.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &bitmapDC,
0, 0, SRCCOPY);
bitmapDC.SelectObject(pOldBitmap);
bitmap.DeleteObject();
43,
寫出運作結果:
{// test1
char str[] = "world"; cout << sizeof(str) << ": ";
char *p = str; cout << sizeof(p) << ": ";
char i = 10; cout << sizeof(i) << ": ";
void *pp = malloc(10); cout << sizeof(p) << endl;
}
6:4:1:4
注:每個char字元占一個位元組 sizeof(*p)求得是指針占用空間而不是指針所指的值占的空間
44,
sizeof 簡單的說其作用就是傳回一個對象或者類型所占的記憶體位元組數。
strlen 用來計算字元串的長度,必須以為char*作參數,且必須是以'/0'結尾的,但把'/0'計算在内
char* ss ="0123456789";
sizeof(ss)為4,這裡求的是ss指針所占記憶體空間 32位作業系統中一個指針所占位元組數為4
strlen(*ss)為1,*ss是第一個字元 這裡求了一個字元的長度
char ss[] = "0123456789";
sizeof(ss)為11, ss是數組,計算到'/0'的位置,是以是(10+1)
sizeof(*ss)為1,*ss是第一個字元
char ss[100] = "0123456789";
sizeof(ss)為100,ss表示在記憶體中預配置設定的大小,100*1。
strlen(ss)為10, 它的内部實作是用一個循環計算字元串的長度,直到'/0'為止。
int ss[100]="0123456789";
sizeof(ss)為400,ss表示在記憶體中的大小,100*4。
strlen(ss)錯誤,strlen的參數隻能是char*,且必須是以'/0'結尾的,但不把它計算在内
相關常數:
sizeof int:4
sizeof short:2
sizeof long:4
sizeof float:4
sizeof double:8
sizeof char:1
sizeof p:4
sizeof WORD:2
sizeof DWORD:4
45,
void bar(const string & s); 引用參數最好這樣定義
因為如果把const去掉,以下兩個中操作都是錯誤的
bar(foo( ));
bar("hello world");
原因:
原因在于foo( )和"hello world"串都會産生一個臨時對象,而在C++中,這些臨時對象都是const類型的。是以上面的表達式就是試圖将一個const類型的對象轉換為非const類型,這是非法的。
引用型參數應該在能被定義為const的情況下,盡量定義為const 。
46,
(1)注 "abcdef" 12 這些都是常量
const int & ha = 1;//對
int &ha =1;//錯
int i=1;//常量可以附值給普通變量
int &ha = i;//對
char * str = "abcdef";//指針可以指向常量
47,
關于static 資料成員 和 const資料成員
static 和其它的變量不同,它在編譯時就被配置設定了一塊記憶體,存儲在記憶體中的全局變量區域,
C++中:靜态資料成員所在的類的對象的銷毀不會影響它。其它的變量(類中的)配置設定在棧中或堆中,在執行個體化時才被配置設定記憶體,被執行個體化的對象被銷毀時,這些對象也被銷毀
是以在類中聲明一個static對象,它不屬于具體的任何一個對象。而是屬于這個類的一個資料成員。該類的所有的對象共同使用和維護它。
常用聲明和初始化方法:
首先.h檔案中 static int i;
然後在類的外部 int A::i = 2; <資料類型><類名>::<靜态資料成員名>=<值>。
在類的外部定義的因為它獨立于任何一個對象,如果在類中對它進行初始化那麼每當一個對象被執行個體化時都會重新對它初始化,這就達不到"共同維護這個變量的目的"
C語言中:1,靜态資料成員是一種雖然具有全局壽命但是局部可見的變量!如果定義在函數内部,作用域隻在函數體内。如果在函數外定義則作用域隻在該檔案。但是壽命是全局的,隻在程式結束 時才銷毀。2,靜态變量是在編譯時指派的,以後每次調用不再配置設定記憶體單元和重新初始化,隻是保留上一次函數調用技術時的值。
const 必須進行初始化,對其進行初始化後這個值将不會被更改。該類型變量在聲明後,任何函數都不能對其操作。隻能 通過構造函數的初始化清單進行初始化。
首先.h檔案中 const int i;
cpp檔案中 A::A(int i):a(i)
{
}
48,dll,lib,obj都是什麼?
obj檔案:
目标檔案,一般是程式編譯後的二進制檔案,在通過連結器和資源檔案連結就成exe檔案了
dll和lib:
一般的動态庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連接配接到應用程式中的,而dll檔案是運作期才會被調用的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實作在dll檔案中。如果隻有lib檔案,那麼這個lib檔案是靜态編譯出來的,索引和實作都在其中。靜态編譯的lib檔案有好處:給使用者安裝時就不需要再挂動态庫了。但也有缺點,就是導緻應用程式比較大,而且失去了動态庫的靈活性,在版本更新時,同時要釋出新的應用程式才行。
在動态庫的情況下,有兩個檔案,一個是引入庫(.LIB)檔案,一個是DLL檔案,引入庫檔案包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和資料,應用程式使用LIB檔案連結到所需要使用的DLL檔案,庫中的函數和資料并不複制到可執行檔案中,是以在應用程式的可執行檔案中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的記憶體位址,這樣當一個或多個應用程式運作是再把程式代碼和被調用的函數代碼連結起來,進而節省了記憶體資源。
調用方式:
根據調用方式的不同,對動态庫的調用可分為靜态調用方式和動态調用方式。
(1)靜态調用,也稱為隐式調用,由編譯系統完成對DLL的加載和應用程式結束時DLL解除安裝的編碼(Windows系統負責對DLL調用次數的計數),調用方式簡單,能夠滿足通常的要求。通常采用的調用方式是把産生動态連接配接庫時産生的.LIB檔案加入到應用程式的工程中,想使用DLL中的函數時,隻須在源檔案中聲明一下。 LIB檔案包含了每一個DLL導出函數的符号名和可選擇的辨別号以及DLL檔案名,不含有實際的代碼。Lib檔案包含的資訊進入到生成的應用程式中,被調用的DLL檔案會在應用程式加載時同時加載在到記憶體中。
(2)動态調用,即顯式調用方式,是由程式設計者用API函數加載和解除安裝DLL來達到調用DLL的目的,比較複雜,但能更加有效地使用記憶體,是編制大型應用程式時的重要方式。在Windows系統中,與動态庫調用有關的函數包括:
①LoadLibrary(或MFC 的AfxLoadLibrary),裝載動态庫。
②GetProcAddress,擷取要引入的函數,把符号名或辨別号轉換為DLL内部位址。
③FreeLibrary(或MFC的AfxFreeLibrary),釋放動态連結庫。
49,
(1)
char a[] = “hello”;//個人認為此時的"hello"存儲在一個變量區域,然後a是一個const *a(指向不能改變,指 //向的值可以改變)。指向數組的首位址。。。不太确定...但因為(3)的通過是以隻能解 // 釋為存儲方式不同,在具體的細節就不知道了
a[0] = ‘X’;
(2)
char *p = “hello”; // p 指向常量字元串,"hello"是以常量的形式存儲到棧中的然後p指向那個區域的第一 //個字元的位址
p[0] = ‘X’; // 編譯器不能發現該錯誤,但運作時會報錯.因為這樣企圖改變一個常量
(3)
char a[4] = "hello";
char*b =a;
b[0] = 'x'//這樣經過測試是可以的。
50,
typedef要比#define要好,特别是在有指針的場合。請看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的變量定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指針變量,根本原因就在于#define隻是簡單的字元串替換而typedef則是為一個類型起新名字。
51,取得該程式所在路徑
void GetCurrentDirectory(CString &strPath)
{
wchar_t pBuf[256];
GetModuleFileName(NULL,pBuf,sizeof(pBuf)/sizeof(wchar_t));
strPath=pBuf;
strPath = strPath.Left(strPath.ReverseFind('//') + 1);
}
52,
int a An integer
int *a A pointer to an integer
int **a pointer to pointer to an integer
int a[10] An array of 10 integer
int*a[10] An array of 10 pointers to integers
int(*a)[10] A pointer to an array of 10 integers
int(*a)(int) A pointer to a function a that takes an integer argument and returns an integer
int(*a[10])(int) An array of 10 pointers to functions that take an integer argument and return an integer