Windows程序的内部运行原理
学习了MFC的一些理论性知识和实际的操作应用!
以下是理论知识:
char:是ANSI字符的数据类型
wchar_t:是Unicode字符的数据类型
TCHAR:同时支持两种字符串
LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针
LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针?
LPCSTR:即const char *
LPCWSTR:即const wchar_t *?
LPTSTR:LPSTR与LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI
LPCTSTR:?LPCSTR与LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,如下是从MFC库中拷来的:
Windows程序设计是一种事件驱动的程序设计方法。主要是基于消息的。当用户需要完成某种功能时,会调用操作系统的某种支持,操作系统将用户的需要包装成某种消息,并投递到消息队列当中。然后利用应用程序从消息队列中取走消息并进行响应
消息循环的处理过程
MSG msg;
While (GetMessage(&msg,NULL, 0,0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
(1) GetMessage()函数不断侦察应用程序的消息队列,若队列为空,则该函数一直运行,不返回;一旦发现队列不为空,便取出一条消息,把它复制到msg结构变量中,同时该函数返回TRUE。
(2) 得到消息msg后,TranslateMessage()把来自键盘的命令翻译成WM_XXX消息命令形式。
(3) DispatchMessage()函数通知Windows把每个消息分发给相应的窗口函数。应用程序并不直接调用窗口函数,而由Windows根据消息去调用窗口函数,因此,窗口函数经常被称为回调函数。
Windows32应用程序开发过程
1创建应用程序
2编写WinMain 函数
窗口的创建
(1)设计一个窗口类
(2)注册窗口类
(3)创建窗口实例
(4)显示及更新窗口
应用程序的消息循环处理
MSG msg;
While (GetMessage(&msg,NULL, 0,0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
定义窗口类的结构
typedef struct _WNDCLASS { �UINT style; //窗口类的风格
�WNDPROC lpfnWndProc; //窗口处理函数
�int cbClsExtra; //窗口类附加数据大小
�int cbWndExtra; //窗口附加数据大小
�HANDLE hInstance; //当前应用程序的实例句柄
�HICON hIcon; //窗口图标
HCURSOR hCursor; //窗口的鼠标
�HBRUSH hbrBackground; //窗口的背景画刷
�LPCTSTR lpszMenuName; //菜单
�LPCTSTR lpszClassName; //窗口类名称
} WNDCLASS;
(2)窗口类的注册
一个窗口,在创建之前需要先向操作系统进行注册,这类似现实生活中我们开公司,要先向工商局进行注册一样。
?我们通过RegisterClassEx()这个API将窗口类在操作系统中进行注册,并通过其返回值判断是否注册成功。
窗口注册
if ( !RegisterClass(&wndclass) )
{
//消息对话框
MessageBox(NULL, _T(“注册窗口类失败!”), _T(“错误信息”), MB_ICONERROR);
return 0;
}
(3)窗口的创建API
HWND?hWnd?=?CreateWindow(
_T(“MyWindowClass”), //窗口类名称
_T(“Window API编程”), //窗口名称,窗口标题
WS_OVERLAPPEDWINDOW, //窗口类型
CW_USEDEFAULT, ? //窗口的左上角X坐边
CW_USEDEFAULT,? //窗口的左上角X坐边
CW_USEDEFAULT, ?//窗口的宽度
CW_USEDEFAULT,? //窗口的高度
NULL,? //父窗口句柄
NULL, //窗口菜单句柄
hInstance, //应用程序的实例句柄
NULL //创建的参数,一般为NULL
);
(4)窗口的显示与更新
窗口的显示与更新
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
MFC中CString字符串类
1.CString 类对象的初始化:
CString str;
CString str1(_T(“HelloWorld "));
CString str2 = _T(“HelloWorld");
2.取字符串长度成员函数:GetLength();
CString str(_T("abc")); int len = str.GetLength(); //len == 3
3.字符串的连接:+、+=
CString str(_T("abc"));
str = _T("de") + str + _T("kp"); //str == deabckp
TCHAR szBuf[] = _T("789");
str += szBuf; //str == deabckp123789
4.去除空格成员函数: Trim();
CString str (_T(“ HelloWorld ")); str1.Trim();
5.字符串的比较:==、!=
CString str1(_T("abc")); CString str2 = _T("aBc");
if (str1 == str2)
MessageBox(_T("str1 等于 str2"));
else
MessageBox(_T("str1 不等于 str2"));
6. CString 对象类型的转换:
格式化字符串:Format 方法,实现从 int、long 等数值类型、TCHAR、TCHAR * 等类型向 CString 类型的转换;
int num = 6; CString str; str.Format(_T("%d"), num);
CString 类型向 int 等数值类型
CString str1(_T("123")); int num = _ttoi(str1);