VC++/MFC小结

 

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;
//long转换为CString
long nPosition = 2343;
CString strTem;
strTem.Format(_T("%ld"),nPosition);

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("-"),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之间的转换    

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

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和菜单条基本一回事)
/
例:
MR_HeadChooseDlg *headDlg = new MR_HeadChooseDlg;
if (IDOK == headDlg->DoModal())
{
 headDlg->GetSelectedHead(strHeadID);
 return TRUE;
}
break;
注:启动模态对话框方法是DoMoal(),在这个函数执行完之后,对话框弹出。
但程序一直等待到这个模态对话框OnOk()或OnCancle后才执行下一行代码。

例:
CPlaceChooseDlg *m_pProvinceDlg = new CPlaceChooseDlg();
m_pProvinceDlg->Create(IDD_PLACE_CHOOSE_DLG, this);
m_pProvinceDlg->ShowWindow(SW_SHOW);
注:非模态对话框要用Create方法,第一个参数是该窗口资源文件,this是父窗口指针
。在ShowWindow(SW_SHOW)后m_pProvinceDlg启动,父窗口代码会继续向下执行。因为
不好确定用户在何处关掉m_pProvinceDlg所以最好在CPlaceChooseDlg 类内部进行自删除
处理。例:
void CPlaceChooseDlg::PostNcDestroy()
{
 CDialog::PostNcDestroy();
 delete this;//直接删除自己!模态对话框不能这样!!
}

void CPlaceChooseDlg::OnOK()
{
    DestroyWindow();//点ok后直接销毁窗口
}

void CPlaceChooseDlg::OnCancel()
{
     DestroyWindow();//点Cancel后直接销毁窗口
}

57,
WCHAR strTmp[20] = {0}; 声明一个各元素都为0的数组。
和这个一样:
WCHAR strTemp[20];
memset(strTemp,0,20)

58,编码问题的目前粗略理解:
   unicode:是16位2进制代表一个字符,占2字节(也有4个字节的)。可以表示一个中文字,也可以表示字母或数字等单字节字符,
          在表示单字节字符时仍用16位表示,多余位的用0填充,仍然占2字节。
   ANSI:是8位2进制代表一个字符,占一个字节。可以表示一个英文字符或数字
   utf-8:前两者都是定长的,为了表示更多字符又不浪费空间发明了utf-8。它是变长的,当存储单字节时就用一个字节空间

   存储该符号(数字符号,英文符号),当存储双字节字符时就用2个字节存储该符号(汉字或其它复杂文字)。
   //当char类型数组存储utf-8字符串时,数字和字母占一个单元,汉字每个单元存一半。

            
   char a1[7] = "你是谁";//UTF-8存储,前6个单元每个单元存半个中文字,最后是/0
   char a2[4] = "abc";//UTF-8存储,前3个单元每个单元存一个英文字符,最后是/0
   WCHAR a3[4] = L"你是谁";//UNICODE存储,前3个单元每个单元能存一个中文字符,最后是/0
   char a4= 'a';//刚好可以存储
   char  a5= '你';//只存了该汉字的一半
   WCHAR a6[4] = "你是谁";//不对!!WCHAR是定长的,"你是谁"是utf-8编码是变长的。应该用char型数组存储。 
 
59,关于MoveWindow坐标问题
两种写法
void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
两个函数x,y和lpRect来确定窗口的位置和大小。
  msdn上说对于顶层的CWnd对象,这个位置参数是相对于屏幕的左上角的。对于子窗口,它们是相对于父窗口客户区的左上角的。但是实际上我感觉只有在窗口中Move该窗口的控件时,这个位置才是相对于这个父窗口位置的也就是相对位置。如果在这个窗口中创建一个以这个窗口为父窗口的dialog,那么无论在父窗口中move还是在子窗口中"自身move"都是相对于屏幕的位置的也就是绝对位置。
简单的说就是:
 MoveWindow
 在用在控件时:它的"位置"参数是相对于父窗口的(容纳它的窗口)---相对位置。 
 在用在CDialog时:它的"位置"参数是相对于屏幕的,和他的父窗口无关---绝对位置。

//CmyDlg dlg;
// dlg.MoveWindow(...);来设定位置和在CmyDlg类中MoveWindow(...)来自身move效果相同。
60,MFC中的UpdateData方法
UpdateData(true);//用于将屏幕上控件中的数据交换到变量中。
UpdateData(false);//用于将数据在屏幕中对应控件中显示出来。
//<注>首先要在DoDataExchange函数中设置关联:DDX_Text(pDX,IDC_PHONENUMBER_STATIC,strPhoneNumber);
另一种方法:
利用CWnd的SetWindowText() 和GetWindowText()来赋值和取值。例:GetDlgItem(IDC_EDIT1)->SetWindowText(str);
还有一对函数是SetDlgItemText和GetDlgItemText

 

61.IXMLHTTPRequest
MSDN:Provides client-side protocol support for communication with HTTP servers.
This object is integrated with the Microsoft XML Parser (MSXML) to support sending the request body directly from and parsing the response directly into the MSXML DOM objects.
非常好用的一个类使用前先注册这个com组件。

62,RegistryNotifyCallback
  可以用这个函数设置一个对注册表的监视(详见MSDN)

63,日志输出
   //1,NKDbgPrintfW 打印指定文字到 "输出窗口"
例:
    int m_nOption = 1005;
    ::NKDbgPrintfW(_T("MR_CMyDownloadDlg::m_nOption = %d !!! \r\n"), m_nOption);
    ::NKDbgPrintfW(_T("wait thread exit timeout !!! \r\n"));
  //2.TRACE宏(ASSERT,VERIFY和 TRACE都称作调试宏 ) 打印指定文字到 "输出窗口"
例:
    TRACE("This is a TRACE statement\n");    
    TRACE("The value of x is %d\n",x);    
    TRACE("x = %d  and y = %d\n", x,y);    
    TRACE("x = %d and y = %x and z = %f\n",x,y,z);  

TRACE0、TRACE1、TRACE2、TRACE3 是衍生出来的:
    #define TRACE0(sz)              TRACE(_T("%s"), _T(sz))
    #define TRACE1(sz, p1)          TRACE(_T(sz), p1)
    #define TRACE2(sz, p1, p2)      TRACE(_T(sz), p1, p2)
    #define TRACE3(sz, p1, p2, p3)  TRACE(_T(sz), p1, p2, p3)
  //3,printf 

64, UTF-8 和 unicode 互转函数
void utf8ToUnicode(const string& src, wstring& result)
{
   int n = MultiByteToWideChar( CP_UTF8, 0, src.c_str(), -1, NULL, 0 );
   result.resize(n);
   ::MultiByteToWideChar( CP_UTF8, 0, src.c_str(), -1, (TCHAR*)result.c_str(), result.length());
}
65,extern作用:引用一个已经定义过的全局变量.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值