Mobile开发之路_之小总结

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("%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

53,
unicode 转utf-8的一个函数

BOOL WCharToUTF8(LPCWSTR lpcwszSrc, LPSTR lpszDes, DWORD dwSize)
{
    DWORD dwMinSize;
    dwMinSize = WideCharToMultiByte(CP_UTF8,NULL,lpcwszSrc,-1,NULL,0,NULL,FALSE);
    if(dwSize < dwMinSize)
    {
        return FALSE;
    }
    WideCharToMultiByte(CP_UTF8,NULL,lpcwszSrc,-1,lpszDes,dwSize,NULL,FALSE);
    return TRUE;
}
54,关于聚焦
设定聚焦 m_editNickName.setfocus()
取消聚焦 ::SendMessage(m_editNickName->m_hWnd,WM_KILLFOCUS,0,0);
 要想对聚焦操作有效要讲 OnInitDialog 的返回值设置为false

55,关于dc画图小总结
//**画线
COLORREF clrLine = #1f1f1f;
pDC->FillRect(m_rcBlackLine, &CBrush(clrLine)); 
//**画字
//定义字体
CFont fTitlefont;
fTitlefont.CreateFont(
 18,                   // nHeight
 0,                         // nWidth
 0,                         // nEscapement
 0,                         // nOrientation
 FW_BOLD,                   // nWeight
 FALSE,                     // bItalic
 FALSE,                     // bUnderline
 0,                         // cStrikeOut
 DEFAULT_CHARSET,              // nCharSet
 OUT_DEFAULT_PRECIS,        // nOutPrecision
 CLIP_DEFAULT_PRECIS,       // nClipPrecision
 DEFAULT_QUALITY,           // nQuality
 DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
  _T("宋体"));                 // lpszFacename
CPaintDC dc(this); //构造一个连接到该CWnd上的CPaintDC对象
CDC* pDC = &dc;
CFont *oldFont = pDC->SelectObject(&fTitlefont);//选择新字体并将最初字体保存
pDC->DrawText(L"消费资源",m_rcListHeader1, DT_LEFT | DT_VCENTER | DT_WORD_ELLIPSIS);//用指定字符串向指定区域上画字
pDC->SelectObject(oldFont);//用完后选择最初保存的那个原始字体。
fTitlefont.DeleteObject()//释放字体对象
//**画图
HBITMAP hBitmap = SHLoadDIBitmap(L"文件路径"); //加载文件
bitmap.Attach(hBitmap);
bitmap.GetBitmap(&bmpInfo);//得到所加载文件的信息
CDC MemDC;
bDC.CreateCompatibleDC(pDC);//创建一个和当前设备上下文(该窗口dc)相兼容的一个内存中dc
CBitmap* pOldBitmap = MemDC.SelectObject(&bitmap);//用这个内存dc选择那个图片。
//从刚才那个内存dc中拷贝位图到这个当前设备上下文的指定区域
pDC->BitBlt(rcHeadImage.left,rcHeadImage.top, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBitmap);//恢复内存dc选中的图片
MemDC.DeleteDC();
bitmap.DeleteObject();//图片对象用完删除
(注):这里用到了"内存设备环境"。先利用CreateCompatibleDC创建一个和pDC相兼容的内存设备环境,然后用内存设备环境选入位图对象,
然后再调用CDC类的BitBlt方法将"内存设备环境"(MemDC)的位图拷贝到"当前设备环境"(pDC)下。这样利用内存
//**一个画倒三角的函数
void MR_CPersonalInformationDialog::DrawArrow(CDC* pDC,CPoint ArrowTip)
{

 CPoint ptDest;

 CPen* pPen = pDC->GetCurrentPen();
 LOGPEN logPen;
 pPen->GetLogPen(&logPen);
 pDC->SetPixel(ArrowTip, logPen.lopnColor);


 ArrowTip -= CPoint(1,1);
 pDC->MoveTo(ArrowTip);

 ptDest = ArrowTip;
 ptDest += CPoint(3,0);
 pDC->LineTo(ptDest);

 ArrowTip -= CPoint(1,1);
 pDC->MoveTo(ArrowTip);

 ptDest = ArrowTip;
 ptDest += CPoint(5,0);
 pDC->LineTo(ptDest);

 ArrowTip -= CPoint(1,1);
 pDC->MoveTo(ArrowTip);

 ptDest = ArrowTip;
 ptDest += CPoint(7,0);
 pDC->LineTo(ptDest);
}

56,模态与非模态对话框
/*模态*/
例:
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();//点ok后直接销毁窗口
}

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字符串时,数字和字母占一个单元,汉字每个单元存一半。

             /*声明:VS2005中默认编码格式为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作用:引用一个已经定义过的全局变量.

 

 

 

你可能感兴趣的:(mobile)