小学期的项目要用到MFC,然而只能自学啦,找到一个自学网站挺好的,开始了第一天的自学~
http://v.dxsbb.com/jisuanji/555/#Introduce
知道了一个叫MSDN 的帮助系统,很好用的赶脚
首先要对C++的窗口程序有一个大致的了解,一开始总是知识点比较多的,只能默默地记着了
1.MSG类
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM 1Param;
DWORD time;
POINT pt;
}
1.1 HWND hWnd 窗口句柄:存储窗口这个变量
句柄:资源的标识,操作系统通过句柄找到对应的资源,有图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),实用程序实例句柄(HINSTANCE)等等
1.2 UINT message 消息
UINT :unsigned int 无符号整数,用整数来表示消息
message 只是告诉操作系统有message的到来,而不知道message的内容,比如知道有键盘按下,却不知道按下的是哪个键
1.3 WPARAM wParam 系统中定义的一个宏
指定message消息中的附加信息,知道message的具体内容,如键盘按下时记录键的ASCLL码
1.4 LPARAM 1Param
与1.3中 WPARAM wParam的功能相同,但是用名字来区分不同含义,使人看到名字便可知道该消息代表的意思
1.5 DWORD time:消息投递出去的时间
DWORD :double word,双16位,代表32位
1.6 POINT pt 点的结构体
这个点代表当消息被投递时光标在屏幕上的的坐标
2.Windows程序的入口函数
int WINAPI WinMain(
HINSTANCE hInstance, //实例句柄,当前运行的实例
HINSTANCE hPrevInstance,//实例句柄,先前运行的实例
LPSTR lpCmdLine, //LP:长指针,STR字符串
int nCmdShow //显示的状态,最大化,最小化,隐藏等
);
3.窗口的创建
3.1设计窗口类
typedef struct _WNDCLASS {
UINT style; //窗口类的类型
WNDPROC lpfnWndProc; //窗口过程(不是很懂,需要回顾)
int cbClsExtra; //类额外的数据,可以追加附加内存
int cbWndExtra; //窗口额外数据,注册时可附加窗口内存
HINSTANCE hInstance; //实例句柄,当前运行的实例的实例号
HICON hIcon; //图标句柄,窗口图标的更换在这个变量的函数中修改
HCURSOR hCursor; //改变光标进入窗口时的形状
HBRUSH hbrBackground;//画刷,设定窗口背景颜色
LPCTSTR lpszMenuName; //LP长指针,C表示常量,整个代表32位的指针指向一
个常量类型的字符串,代表菜单名字
LPCTSTR lpszClassName;//类的名字
} WNDCLASS
3.2窗口的注册
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;//注册的这个窗口具有什么特性,用或 运算将它们组合起来
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_STUDY));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);//进入窗口时光标的形状,使用系统默认 的话前一个参数为NULL,后面是光标形 状对应的宏
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_STUDY);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
3.3窗口的创建
HWND CreateWindow(
LPCTSTR lpClassName,//注册的类名,要与注册的相对应
LPCTSTR lpWindowName,//窗口名字,标题栏那里显示的
DWORD dwStyle,//窗口类型,设置是否有最大化最小化按钮等,去掉按钮只需先对该按钮取反,再进 行与操作
int x,//窗口水平坐标,左上角为坐标原点,向右x增加,向下y增加
int y,//窗口垂直坐标
int nWidth,//窗口宽度
int nHeight,//窗口高度
HWND hWndParent,//父窗口句柄
HMENU hMenu,//菜单句柄
HANDLE hlnstance,//实例句柄
LPVOID lpParam)//数据指针,作为窗口创建消息的附加参数
ShowWindow(
__in HWND hWnd,//保存想要显示的窗口的句柄
__in int nCmdShow);//窗口创建时显示的状态,如最大化,最小化等
UpdateWindow(
__in HWND hWnd);//刷新窗口
3.4
BOOLbRet;
while((bRet=GetMessage(&msg,hWnd,0,0))!=0)
{
if(bRet==-1)
{
//handletheerrorandpossiblyexit
}
else
{
TranslateMessage(&msg);//进行消息转换
DispatchMessage(&msg);//将消息传到回调函数
}
}
GetMessage(
LPMSG lpMsg,//消息结构体的指针,从消息队列中取出消息
HWND hWnd,//获取窗口的对应句柄,如果为NULL,表示获取所有窗口的句柄
UINT wMsgFilterMin,//设定消息最小值,用于筛选消息
UINT wMsgFilterMax)//设定消息最大值,用来筛选消息,如果两个都为0,表示对所有消息都感兴 趣,不进行筛选
4.窗口主消息的处理
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
LRESULT 代表返回值为NULL,其他参数的类型不允许改动
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//只能在WM_PAINT中使用,GetDC只能在其他地方用
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);//只能在WM_PAINT中使用,ReleaseDC只能在其他地方使用
break;
case WM_DESTROY:
PostQuitMessage(0);//请求线程中止
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);//不感兴趣的消息交给系统处 理
}
return 0;
}
WINUSERAPI int WINAPI MessageBoxA(
HWND hWnd,//当前窗口
LPCSTR lpText,//字符串,消息显示的文本
LPCSTR lpCaption,//窗口的标题
UINT uType);//消息框的类型,确定消息框的按钮有哪些,如确定,是否等,直接填0代 表确定
BOOL TextOut(
HDC hdc, // 设备描述表句柄
int nXStart, // 字符串的开始位置 x坐标
int nYStart, // 字符串的开始位置 y坐标
LPCTSTR lpString, // 字符串,要输出的文本内容
int cbString // 字符串中字符的个数
);