初学MFC(一)



小学期的项目要用到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 // 字符串中字符的个数

);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值