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
CList
第一个示例声明了一个包含多个int的数组集合myArray。第二个示例声明了一个存储CPerson对象的列表集合myList。集合类的某些成员函数采用其类型由ARG_TYPE模板参数指定的参数。例如,CArray类的Add成员函数采用ARG_TYPE参数:
CArray
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)
{
}